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 >
Wrap
Text File
|
1992-12-07
|
6KB
|
171 lines
;Routine de restitution 8 bits pour STE.
;(C)oderight NulloS//DNT 1992
;
;
; Pour restituer le son, il faut utiliser la même fréquence que
;celle d'échantillonnage, sinon le son va être déformé.
; Par exemple,si vous utilisez un son digitalisé a 12,5Khz, il faut
;le restituer à une fréquence de 12,5Khz.
; Le problème sur STE, c'est que le choix des fréquences est restreint,
;ce qui oblige à :
; o Digitaliser pile à la bonne fréquence le sample.
; o Re-échantilloner par calcul le sample vers une fréquence
; compatible avec le STE.
; Le deuxième cas est à proscrire, car il baisse sensiblement la qualité
;de l'échantillon. C'est pourtant ce qui est fait dans un soundtracker,
;mais c'est dans ce cas particulier la seule solution.
; Les fréquences disponibles sur STE sont 6258Hz,12517Hz,25033Hz et 50066Hz
;Le tout en mono ou en stéréo. Je n'ai pas de sample stéréo à vous offrir,
;donc on s'en passera (de toute facon, digitaliser en stéréo a très peu
;d'intérêt, ca double la taille du sample et ca n'apporte rien de bien
;extraordinaire).La stéréo n'est utile que pour les musiques de type
;soundtracker (ce qui n'est pas notre propos).
; Et il y a la programmation du LMC, mais pour lui, reportez vous à l'article
;du mag'...
;
;
include a:\hard_sys.s
Start move.l 4(sp),a6 ;récupère page de base
move.l $c(a6),a0 ;Taille programme
adda.l $14(a6),a0 ; + données
adda.l $1c(a6),a0 ; + variables
lea 256+2048(a0),a0 ; + page de base+pile
move.l a0,d0 ;
andi.w #-2,d0 ;arondir à un nombre pair
move.l d0,sp ;nouvelle pile
adda.l a6,sp ;
move.l d0,-(sp) ;taille à conserver
move.l a6,-(sp) ;à partir de la page de base
move.l #$004a0000,-(sp) ;Mshrink. Rend le reste au
trap #1 ;Gemdos.
lea 12(sp),sp ;rétablit la pile
clr.l -(sp) ;passage en superviseur
move.w #$20,-(sp) ;
trap #1 ;
addq.l #6,sp ;
move.l d0,save_SSP ;sauve la pile système
move.b conterm.w,save_conterm;et les paramètres clavier
clr.b conterm.w ;coupe le bip clavier
bsr Wait_Kbd ;
move.b #$12,KBD_data.w ;
bsr InitLMC ;met le LMC comme il faut
lea sample,a0
lea endsample,a1
lea bclsample,a2
bsr InitDMA ;lance la digit
presskey move.l #$000bffff,-(sp) ;demander l'état shift,control
trap #13 ;et altenrate
addq.l #4,sp ;
and.w #$f,d0 ;Pressée(s) ?
beq.s presskey ;non, attendre encore
exit bsr KillDMA ;couper la digit
bsr ExitLMC ;mettre le LMC aux valeur de défaut
bsr Wait_Kbd ;attendre clavier
move.b #$8,KBD_data.w ;reprendre les transferts
;souris
move.b save_conterm,conterm.w;et remettre bip clavier
move.l save_SSP,-(sp) ;repasse en utilisateur
move.w #$20,-(sp) ;
trap #1 ;
clr.w (sp) ;et cassos
trap #1 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
InitLMC movem.l d0-d1/a0-a1,-(sp) ;
lea PCM_base.w,a0 ;adresse registres du PCM
move.w #_mcw_pmask,mcw_mask(a0);installe mask LMC
lea IL_data(pc),a1 ;valeur de début
moveq #5,d1 ;5 réglages à faire
IL_bcl move.w (a1)+,d0 ;un de plus
bsr SendLMC ;on l'envoie
dbf d1,IL_bcl ;
movem.l (sp)+,d0-d1/a0-a1 ;
rts ;
IL_data dc.w _master_vol+40,_left_vol+20,_right_vol+20
dc.w _treble+6,_bass+6,_pcm_mix+2
;Volume à 40 (maximum), voix gauches et droite à 20 (maximum de ces
;"sous-volumes",aigus et graves à 6 (normal),sample seul.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Passe D0 au LMC. Le masque du LMC doit avoir été mis auparavant
;à $7FF une fois au moins. Et A0 doit être égal à PCM_base
;On débute par une attente avec dbf, car sinon le LMC n'a pas le temps
;de commencer à envoyer la donnée précédente, et on se mélange les
;pinceaux !!.
SendLMC move.w d0,-(sp) ;sauve D0 en attendant
move.w #99,d0 ;petite boucle pour laisser
dbf d0,* ;le temps au LMC de commencer
move.w (sp)+,d0 ;le transfert précédent..
cmpi.w #_mcw_pmask,mcw_mask(a0);transfert achevé ?
bne.s *-6 ;non, attendre
move.w d0,mcw_data(a0) ;demande le transfert de D0
rts ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ExitLMC movem.l d0-d1/a0-a1,-(sp) ;même chose, mais valeurs
lea PCM_base.w,a0 ;un peu différentes.
lea EL_data(pc),a1 ;pas besoin du mask, déjà mis
moveq #5,d1
EL_bcl move.w (a1)+,d0
bsr SendLMC
dbf d1,EL_bcl
movem.l (sp)+,d0-d1/a0-a1
rts
EL_data dc.w _master_vol+40,_left_vol+20,_right_vol+20
dc.w _treble+6,_bass+6,_pcm_mix+1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
InitDMA movem.l d0/a3,-(sp) ;sauve les registres
lea PCM_base.w,a3 ;adresse DMA
move.b #_spl_off,pcm_mode(a3);coupe un éventuel DMA
move.b #_mono+_Khz12,pcm_ctrl(a3);monophonie à 12Khz
move.l a0,d0 ;début de sample
move.b d0,spl_startl(a3) ;fixe l'octet faible
lsr.w #8,d0 ;
move.b d0,spl_startm(a3) ;octet moyen
swap d0 ;
move.b d0,spl_starth(a3) ;et octet fort
move.l a1,d0 ;fin du sample, idem
move.b d0,spl_endl(a3) ;fixe l'octet faible
lsr.w #8,d0 ;
move.b d0,spl_endm(a3) ;octet moyen
swap d0 ;
move.b d0,spl_endh(a3) ;et octet fort
move.b #_spl_many,pcm_mode(a3) ;joue en boucle
;maintenant le DMA est lancé et va boucler. On va charger par avance l'adresse
;de la boucle. Quand le DMA va arriver en fin de sample, il va alors reprendre
;depuis la dernière adresse de début qu'on lui a indiqué.Ici, ce sera A2
;Puis lorsqu'il bouclera les fois suivantes, il reprendra cette valeur pour
;boucler, car on ne l'aura pas modifié...
move.l a2,d0 ;boucle du sample
move.b d0,spl_startl(a3) ;fixe l'octet faible
lsr.w #8,d0 ;
move.b d0,spl_startm(a3) ;octet moyen
swap d0 ;
move.b d0,spl_starth(a3) ;et octet fort
movem.l (sp)+,d0/a3
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KillDMA move.l a0,-(sp)
lea PCM_base.w,a0
move.b #_spl_off,pcm_mode(a0)
move.l (sp)+,a0
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Wait_Kbd btst #1,KBD_stat.w ;clavier près à recevoir ?
beq.s Wait_Kbd ;non, attendre
rts ;c'est bon !
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SECTION DATA
sample incbin flut_pan.spl ;sample à restituer
endsample equ * ;son adresse fin
bclsample equ sample+40962 ;bouclage
SECTION BSS
save_SSP ds.l 1
save_conterm
ds.w 1