Je viens de finir l'algo qui s'occupe de gérer les voies et produire les données.
En effectuant la méthode d'alternance de notes, j'obtient une note très grave et assez bizarre. Il faut que je trouve la méthode pour XORer les voies.
pokeIO(0x600017,1-next.timeoffset);
C'est juste une valeur qui peut valoir 1,2,3...
Ouille ça fait mal...
[hum, à moins que........ en fait si, ça devrait pouvoir se faire avec une petite perte de qualité pour les HW1]




pas mal
Je peux la poster ici si ça t'intéresse (mais je n'ai pas fait le séquenceur pour l'instant, sachant qu'on peut potentiellement faire n'importe quoi avec ce moteur, donc je ne sais pas trop quoi mettre : notes simples, avec un volume donné, avec un pan donné, avec un vibrato, avec un pitch, avec une attaque, avec un timbre, etc... etc...)

; Vocabulaire :
; piste [track en anglais] Correspond à peu près à un instrument MIDI
; (en réalité à une corde d'un instrument MIDI - il peut y avoir plusieurs pistes par
; instrument pour les accords).
; Remarque : inutilisé par le lecteur (interne au convertisseur, et pour faciliter les
; explications).
; voie [voice en anglais] Correspond à un son d'une fréquence donnée.
; Il y a souvent deux voies pour jouer une même piste, sauf si le volume est au maximum
; pour cette voie, auquel cas il peut n'y avoir qu'une voie par piste.
; Remarque : c'est le coeur du lecteur, c'est donc leur nombre qui sera limité par la
; puissance du convertisseur.
; Remarque 2 : aux voies qui correspondent à un son vient s'ajouter la voie 0 : celle
; du séquenceur, elle ne correspond à aucun son, mais c'est elle qui va modifier le contenu
; de toutes les autres voies pour jouer le son MIDI...
; canal [channel en anglais] Correspond à un canal physique (canal gauche, canal droit).
; A ne pas confondre avec une voie!
; Remarque :
; pour les pistes possédant un volume, on peut même leur donner une localisation droite/gauche ('PAN' en anglais) arbitraire
; (différente de 'tout à gauche', 'au milieu' et 'tout à droite'), mais la piste sera alors stockée sur 3 voies au lieu
; de 2.
next_action_time:
dc.w 0
__unused1:
dc.b 0
status:
dc.b 0 ; requires to be right before 'voices' !!!
voices:
\start_times
dc.w time_before_run_0 (>=0)
dc.w time_before_play_1 (>=0)
dc.w time_before_play_2 (>=0)
dc.w ...
\end_times
dc.w 0 ; do not modify !!!
\start_property_freq
dc.w property_freq_0
dc.w property_freq_1
dc.w property_freq_2
dc.w ...
\end_property_freq
UNUSED equ 0
\start_property_channel
dc.w UNUSED
dc.b property_channel_1,property_linked_1
dc.b ...
\end_property_channel
OFFS equ \start_property_freq-\start_times
OFFS2 equ \start_property_channel-\start_times
AutoInt5:
!44
!8 move.w d0,-(a7)
!8 move.w d1,-(a7)
!12 pea (a0)
!16 move.w #$2700,sr
!8 lea status(pc),a0
!8 move.w (a0)+,d0
!20 eor.b d0,$60000e
!8 move.w (a0)+,d0 ; [voice 0]
!8 cmp.w (a0)+,d0 ; [voice 1]
!9 bcc \not_this_one_a1 ; [voice 1]
!6 move.w -2(a0),d0 ; [voice 1]
\not_this_one_a1 ; [voice 1]
!8 cmp.w (a0)+,d0 ; [voice 2]
!9 bcc \not_this_one_a2 ; [voice 2]
!6 move.w -2(a0),d0 ; [voice 2]
\not_this_one_a2 ; [voice 2]
... ; <répéter pour les autres voies>
!22 lsr.w #8,d0
!10 bne \no_8khz_limit
addq.b #1,d0
\no_8khz_limit
!4 addq.b #1,d0
!8 move.b d0,(a0)
!4 subq.b #1,d0
!4 neg.b d0
!16 move.b d0,$600017
!8 move.w (a0),d0
!4 clr.w -(a7)
!8 sub.w d0,-(a0) ; [voice n-1]
!8 bcc \not_this_one_b(n-1); [voice n-1]
!8 move.w (a0),d1 ; [voice n-1]
!16 add.w d1,OFFS(a0) ; [voice n-1]
!12 move.w OFFS2(a0),d1 ; [voice n-1]
!12 eor.b d1,(a7) ; [voice n-1]
\not_this_one_b(n-1) ; [voice n-1]
!8 sub.w d0,-(a0) ; [voice n-2]
!10 bcc \not_this_one_b(n-2); [voice n-2]
move.w (a0),d1 ; [voice n-2]
add.w d1,OFFS(a0) ; [voice n-2]
move.w OFFS2(a0),d1 ; [voice n-2]
eor.b d1,(a7) ; [voice n-2]
\not_this_one_b(n-2) ; [voice n-2]
... ; <répéter pour les autres voies (sauf la 0)>
!8 sub.w d0,-(a0) ; [voice 0]
!10 bcc \not_this_one_b0 ; [voice 0]
add.w OFFS(a0),(a0) ; [voice 0]
subq.w #1,-2(a0)
bcc \not_this_one_b0
; ... c'est ici que les choses sérieuses commencent ...
; ...
\not_this_one_b0 ; [voice 0]
!12 move.b (a7)+,-(a0)
!12 move.l (a7)+,a0
!8 move.w (a7)+,d1
!8 move.w (a7)+,d0
!20 rte
; TIMING :
44+8+8+12+16+8+8+20+8+(8+9+6)*N+22+10+4+8+4+4+16+8+4+8+8+8+16+12+12+(8+10)*N+12+12+8+8+20
=>
t = 44+8+8+12+16+8+8+20+8+22+10+4+8+4+4+16+8+4+8+8+8+16+12+12+12+12+8+8+20+((8+9+6)+(8+10))*N
t = 336+41*N
; => on peut facilement supporter jusqu'à N=16 voies :)