home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 10: Diskmags / nf_archive_10.iso / MAGS / DNTPAPER / DNT_04.MSA / ARCHIVES.DNT / SOURCES.ZIP / SAMPLING / SON_STE.S < prev    next >
Text File  |  1992-12-07  |  6KB  |  171 lines

  1. ;Routine de restitution 8 bits pour STE.
  2. ;(C)oderight NulloS//DNT 1992
  3. ;
  4. ;
  5. ; Pour restituer le son, il faut utiliser la même fréquence que
  6. ;celle d'échantillonnage, sinon le son va être déformé.
  7. ; Par exemple,si vous utilisez un son digitalisé a 12,5Khz, il faut
  8. ;le restituer à une fréquence de 12,5Khz.
  9. ; Le problème sur STE, c'est que le choix des fréquences est restreint,
  10. ;ce qui oblige à :
  11. ;    o Digitaliser pile à la bonne fréquence le sample.
  12. ;    o Re-échantilloner par calcul le sample vers une fréquence
  13. ;    compatible avec le STE.
  14. ; Le deuxième cas est à proscrire, car il baisse sensiblement la qualité
  15. ;de l'échantillon. C'est pourtant ce qui est fait dans un soundtracker,
  16. ;mais c'est dans ce cas particulier la seule solution.
  17. ; Les fréquences disponibles sur STE sont 6258Hz,12517Hz,25033Hz et 50066Hz
  18. ;Le tout en mono ou en stéréo. Je n'ai pas de sample stéréo à vous offrir,
  19. ;donc on s'en passera (de toute facon, digitaliser en stéréo a très peu
  20. ;d'intérêt, ca double la taille du sample et ca n'apporte rien de bien
  21. ;extraordinaire).La stéréo n'est utile que pour les musiques de type
  22. ;soundtracker (ce qui n'est pas notre propos).
  23. ; Et il y a la programmation du LMC, mais pour lui, reportez vous à l'article
  24. ;du mag'...
  25. ;
  26. ;
  27.  
  28.     include    a:\hard_sys.s
  29.  
  30. Start    move.l    4(sp),a6        ;récupère page de base
  31.     move.l    $c(a6),a0        ;Taille programme
  32.     adda.l    $14(a6),a0        ;   +   données
  33.     adda.l    $1c(a6),a0        ;   +   variables
  34.     lea    256+2048(a0),a0    ;   +   page de base+pile
  35.     move.l    a0,d0        ;
  36.     andi.w    #-2,d0        ;arondir à un nombre pair
  37.     move.l    d0,sp        ;nouvelle pile
  38.     adda.l    a6,sp        ;
  39.     move.l    d0,-(sp)        ;taille à conserver
  40.     move.l    a6,-(sp)        ;à partir de la page de base
  41.     move.l    #$004a0000,-(sp)    ;Mshrink. Rend le reste au
  42.     trap    #1        ;Gemdos.
  43.     lea    12(sp),sp        ;rétablit la pile
  44.     
  45.     clr.l    -(sp)        ;passage en superviseur
  46.     move.w    #$20,-(sp)        ;
  47.     trap    #1        ;
  48.     addq.l    #6,sp        ;
  49.     move.l    d0,save_SSP    ;sauve la pile système
  50.     move.b    conterm.w,save_conterm;et les paramètres clavier
  51.     clr.b    conterm.w        ;coupe le bip clavier
  52.     bsr    Wait_Kbd        ;
  53.     move.b    #$12,KBD_data.w    ;
  54.     
  55.     bsr    InitLMC        ;met le LMC comme il faut
  56.     lea    sample,a0
  57.     lea    endsample,a1
  58.     lea    bclsample,a2
  59.     bsr    InitDMA        ;lance la digit
  60. presskey    move.l    #$000bffff,-(sp)    ;demander l'état shift,control 
  61.     trap    #13        ;et altenrate
  62.     addq.l    #4,sp        ;
  63.     and.w    #$f,d0        ;Pressée(s) ?
  64.     beq.s    presskey        ;non, attendre encore
  65.  
  66. exit    bsr    KillDMA        ;couper la digit
  67.     bsr    ExitLMC        ;mettre le LMC aux valeur de défaut
  68.     bsr    Wait_Kbd        ;attendre clavier
  69.     move.b    #$8,KBD_data.w    ;reprendre les transferts
  70.                 ;souris
  71.     move.b    save_conterm,conterm.w;et remettre bip clavier
  72.     move.l    save_SSP,-(sp)    ;repasse en utilisateur
  73.     move.w    #$20,-(sp)        ;
  74.     trap    #1        ;
  75.     clr.w    (sp)        ;et cassos
  76.     trap    #1        ;
  77. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  78. InitLMC    movem.l    d0-d1/a0-a1,-(sp)    ;
  79.     lea    PCM_base.w,a0    ;adresse registres du PCM
  80.     move.w    #_mcw_pmask,mcw_mask(a0);installe mask LMC
  81.     lea    IL_data(pc),a1    ;valeur de début
  82.     moveq    #5,d1        ;5 réglages à faire
  83. IL_bcl    move.w    (a1)+,d0        ;un de plus
  84.     bsr    SendLMC        ;on l'envoie
  85.     dbf    d1,IL_bcl        ;
  86.     movem.l    (sp)+,d0-d1/a0-a1    ;
  87.     rts            ;
  88. IL_data    dc.w    _master_vol+40,_left_vol+20,_right_vol+20
  89.     dc.w    _treble+6,_bass+6,_pcm_mix+2
  90. ;Volume à 40 (maximum), voix gauches et droite à 20 (maximum de ces
  91. ;"sous-volumes",aigus et graves à 6 (normal),sample seul.
  92. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  93. ;Passe D0 au LMC. Le masque du LMC doit avoir été mis auparavant
  94. ;à $7FF une fois au moins. Et A0 doit être égal à PCM_base
  95. ;On débute par une attente avec dbf, car sinon le LMC n'a pas le temps
  96. ;de commencer à envoyer la donnée précédente, et on se mélange les
  97. ;pinceaux !!.
  98. SendLMC    move.w    d0,-(sp)        ;sauve D0 en attendant
  99.     move.w    #99,d0        ;petite boucle pour laisser
  100.     dbf    d0,*        ;le temps au LMC de commencer
  101.     move.w    (sp)+,d0        ;le transfert précédent..
  102.     cmpi.w    #_mcw_pmask,mcw_mask(a0);transfert achevé ?
  103.     bne.s    *-6        ;non, attendre
  104.     move.w    d0,mcw_data(a0)    ;demande le transfert de D0
  105.     rts            ;
  106. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  107. ExitLMC    movem.l    d0-d1/a0-a1,-(sp)    ;même chose, mais valeurs
  108.     lea    PCM_base.w,a0    ;un peu différentes.
  109.     lea    EL_data(pc),a1    ;pas besoin du mask, déjà mis
  110.     moveq    #5,d1        
  111. EL_bcl    move.w    (a1)+,d0
  112.     bsr    SendLMC
  113.     dbf    d1,EL_bcl
  114.     movem.l    (sp)+,d0-d1/a0-a1
  115.     rts
  116.  
  117. EL_data    dc.w    _master_vol+40,_left_vol+20,_right_vol+20
  118.     dc.w    _treble+6,_bass+6,_pcm_mix+1
  119. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  120. InitDMA    movem.l    d0/a3,-(sp)    ;sauve les registres
  121.     lea    PCM_base.w,a3    ;adresse DMA
  122.     move.b    #_spl_off,pcm_mode(a3);coupe un éventuel DMA
  123.     move.b    #_mono+_Khz12,pcm_ctrl(a3);monophonie à 12Khz
  124.     move.l    a0,d0        ;début de sample
  125.     move.b    d0,spl_startl(a3)    ;fixe l'octet faible
  126.     lsr.w    #8,d0        ;
  127.     move.b    d0,spl_startm(a3)    ;octet moyen
  128.     swap    d0        ;
  129.     move.b    d0,spl_starth(a3)    ;et octet fort
  130.     move.l    a1,d0        ;fin du sample, idem
  131.     move.b    d0,spl_endl(a3)    ;fixe l'octet faible
  132.     lsr.w    #8,d0        ;
  133.     move.b    d0,spl_endm(a3)    ;octet moyen
  134.     swap    d0        ;
  135.     move.b    d0,spl_endh(a3)    ;et octet fort
  136.     move.b    #_spl_many,pcm_mode(a3) ;joue en boucle
  137. ;maintenant le DMA est lancé et va boucler. On va charger par avance l'adresse
  138. ;de la boucle. Quand le DMA va arriver en fin de sample, il va alors reprendre
  139. ;depuis la dernière adresse de début qu'on lui a indiqué.Ici, ce sera A2
  140. ;Puis lorsqu'il bouclera les fois suivantes, il reprendra cette valeur pour
  141. ;boucler, car on ne l'aura pas modifié...
  142.     move.l    a2,d0        ;boucle du sample
  143.     move.b    d0,spl_startl(a3)    ;fixe l'octet faible
  144.     lsr.w    #8,d0        ;
  145.     move.b    d0,spl_startm(a3)    ;octet moyen
  146.     swap    d0        ;
  147.     move.b    d0,spl_starth(a3)    ;et octet fort
  148.     movem.l    (sp)+,d0/a3
  149.     rts    
  150. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  151. KillDMA    move.l    a0,-(sp)
  152.     lea    PCM_base.w,a0
  153.     move.b    #_spl_off,pcm_mode(a0)
  154.     move.l    (sp)+,a0
  155.     rts
  156. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  157. Wait_Kbd    btst    #1,KBD_stat.w    ;clavier près à recevoir ?
  158.     beq.s    Wait_Kbd        ;non, attendre
  159.     rts            ;c'est bon !
  160. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  161.     SECTION    DATA
  162.  
  163. sample    incbin    flut_pan.spl    ;sample à restituer
  164. endsample    equ    *        ;son adresse fin
  165. bclsample    equ    sample+40962    ;bouclage
  166.  
  167.     SECTION    BSS
  168. save_SSP    ds.l    1
  169. save_conterm
  170.     ds.w    1
  171.