lundi 23 juillet 2012

Tutorial : Musique sur Coleco partie 2

Réclamé à corps et à cri par MO5.com :) :) voici la seconde et dernière partie du
tutorial pour faire de la musique sur Coleco.
Je vais tout de suite faire un disclaimer, c'est la partie que je maitrise le moins. Ce que je vais vous expliquer fonctionne quand on le mets en place, mais techniquement je n'entrerais pas dans les détails, car je ne suis pas capable de donner d'explications techniques.

Rappel :

On à créé nos partitions et nos bruitages, reste plus qu'à les jouer.
La musique et les bruitages se jouent de 2 manières différentes. Prenons l'exemple suivant :

2 bruitages : un tir et une explosion
1 musique avec 2 voix

On déclare comme on l'a vue dans le précédent tutorial.

    .module sounds

   
    ; ********************
    ;  DECLARE GLOBAL TABLES
    ; ********************
   
    .globl  _snd_table
    .globl  _music2
   
    .area _CODE
   
; bruitage de tir
shoot:
.db 0x41, 0x20, 0x30, 0x03, 0x11, 0x10
.db 0x41, 0x20, 0x60, 0x03, 0x11, 0x10
.db 0x41, 0x20, 0x90, 0x03, 0x11, 0x10
.db 0x50 ; Fin channel 3
   
;bruitage d'explosion
explode :
    .db 0x00,0x00,0x07,0x08, 0x02,0x77,0x08,0x18,0x11
    .db 0x10

;partition de game over channel 1
gameOver_ch1:
.db 0x40,0xA0,0x00,36;,0x61 ; F-4
.db 0x40,0xAA,0x00,36;,0x61 ; E-4
.db 0x40,0xD6,0x00,24;,0x61 ; C-4
.db 0x40,0xBE,0x00,36;,0x61 ; D-4
.db 0x40,0xD6,0x00,60;,0x61 ; C-4
.db 0x40,0xAA,0x00,48;,0x61 ; E-4
.db 0x50


;partition de game over channel 2
gameOver_ch2:
.db 0x80,0x7F,0x00,36;,0xA1 ; A-4
.db 0x80,0x8F,0x00,24;,0xA1 ; G-4
.db 0x80,0x8F,0x00,36;,0xA1 ; G-4
.db 0x80,0xA0,0x00,36;,0xA1 ; F-4
.db 0x80,0xAA,0x00,57;,0xA1 ; E-4
.db 0x80,0xB4,0x00,9;,0xA1 ; D#4
.db 0x80,0x71,0x00,42;,0xA1 ; B-4
.db 0x90

vide:
    .db 0x50



Maintenant, on va déclarer tout ça dans un tableau de "partition" (sound table)

_snd_table:
    .dw    #vide,0x702b                    ; = 1
    .dw    #explode,0x702b+40            ; = 2
    .dw    #shoot,0x702b+40            ; = 3
    .dw    #vide,0x702b+40          ; = 4
    .dw    #vide,0x702b+50          ; = 5
    .dw    #vide,0x702b+10               ; = 6
    .dw    #vide,0x702b+20               ; = 7
    .dw    #vide,0x702b+10            ; = 8
    .dw    #vide,0x702b+20         ; = 9   
    .dw    #gameOver_ch1,0x702b+10          ; = A
    .dw    #gameOver_ch2,0x702b+20          ; = B
    .dw    #vide,0x702b+10           ; = C
    .dw    #vide,0x702b+20           ; = D
    .dw    #vide,0x702b+30           ; = E
    .dw    #vide,0x702b+30            ; = F
    .dw    #vide,0x702b+30               ; = 10
    .dw    #vide,0x702b+30          ; = 11
    .dw    #vide,0x702b+40                  ; = 12
    .dw    #vide,0x702b+20                  ; = 13
    .dw    #vide,0x702b+20                  ; = 14



La partition ou bruitage 1 de cette liste doit être mis à vide (pourquoi ? Je ne sais pas mais ça évite certains plantage).
Le premier paramétre déclaré est la partition et le bruitage, puis sa "priorité".

exemple : .dw #explode,0x702b+40 ; le + 40 donne la priorité du bruitage explode.

La rêgle la plus simple est la suivante : Une partition de voix 1 --> +10 de voix 2 --> + 20 etc etc et les bruitages, + 40
Il est donc conseiller de mettre la rythmique de votre musique dans la voix 3, car la Coleco ne sachant que jouer 3 voix à la fois, si vous déclenchez le buitage, ça sera donc la rythmique qui ne s'entendra plus le temps du bruitage, au lieu de la mélodie.

Avec cette "table", on est déja capable de jouer les bruitages dans notre programme principal avec

stop_sound(2);play_sound(2);

pour jouer le bruitage de l'explosion par exemple.

Pour jouer une musique à 2 voix, il faut déclarer autre chose, à savoir la "séquence musicale" (music sequence)
Une "séquence musicale" est un enchainement/mixage de partition.

_music2:
    .dw 0x00c0     ; On joue la musique pendant combien de temps ?
    .db 0x4a,0x0b ; Voir description
    .dw 0x0000 ; Stop à la fin de la partition
    .dw _music2 ; Boucle à _music2, mais comme il y à un stop ça sert à rien.

   
Alors, ça à l'air compliquer mais c'est pas compliqué. :) :)

    .dw 0x00c0 : donne le temps MAXIMUM qu'on joue la musique. Si la musique dure 3 secondes, et qu'on lui dit de la jouer pendant 5 secondes, on aura 3 secondes de musique et 2 secondes de silence avant d'enchainer un autre ensemble de partition ou de boucler le cas échéant. La valeur est à tester par rapport à la longueur de votre composition, je n'ai pas d'équivalence valeur/nb de secondes en tête. (D'ailleurs ce n'est pas des secondes mais des Ticks, car la valeur reste la même en 50Hz et 60hz, pas besoin d'avoir 2 versions de votre musique)
   
    .db 0x4a,0x0b : Signale qu'on va jouer la partition 0x0a ET la partition 0x0b dans la snd_table en même temps.

    Si on veut jouer 3 voix simultanément on mettre
    .db 0x8a,0x0b,0x0c : Pour jouer 0x0a et 0x0b et 0x0c en même temps
   
    Pour jouer une seule voix, c'est simple
    .db 0x0a pour jouer la partition 0x0a dans la snd_table
   
    .dw 0x0000 : Pour dire que la musique s'arrête
    ou
    .dw _music2 : Permet de rejouer au début.

Rien ne vous empêche d'enchainer les partitions

exemple :

_music_test:
    .dw 0x00c0
    .dw 0x0a    ; Joue la partition 0x0a pendant 0x00c0 temps
    .dw 0x00c0
    .dw 0x0b    ; puis joue la partition 0x0b pendant 0x00c0 temps
    .dw 0x0000    ; stop


   
Maintenant, pour jouer votre musique INGAME. Pour cela, dans la NMI ajouter la chose suivante :

void nmi(void)
{
    update_music();
}

Puis dans le jeu :

play_music(music);

ou

stop_music(); 

pour tout stopper.

Voilà, vous avez de quoi bidouiller et faire vos propres essais musicaux sur Colecovision. Pour plus de détail, n'hésitez pas à me contacter !

Aucun commentaire:

Enregistrer un commentaire