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);
; 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 :)