MSX Village forum

Le Kiosque à Musique Faire une musique sur MSX à partir d'une partition

granced Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 09/10/2009 à 09h18

Messages: 1500

Le 22/12/2010 à 15h42
Suite à une suggestion de Jipe, j'ouvre ce topic pour vous faire un petit topo sympathique sur la lecture de partition et son transfert en MSX Basic (pour commencer, plus si affinités :D).

D'abord, on va commencer par se trouver une partition d'un morceau pas trop compliqué (on en est au stade des essais hein, ne vous imaginez pas déjà en train de retranscrire Carmina Burana tout de suite !! :lol). J'ai donc opté pour Frère Jacques : c'est assez simple, tout le monde connaît l'air. Donc voilà comment se présente "la bête" :



Et là vous allez me dire "Qu'est-ce que c'est que tout ça j'y comprends rien !!!". Pas de souci, je vais éclairer votre lanterne !
D'abord un peu de vocabulaire :
- les lignes horizontales constituent ce qu'on appelle la portée, c'est là-dessus qu'on met les notes : soit sur la ligne, soit entre deux. Plus une note est placée haut, plus elle est aigüe, plus elle est bas, plus elle est grave (évidemment :p )
- les lignes verticales coupent la portée en plusieurs mesures, qui regroupent un certain nombre de temps. C'est utilisé pour faciliter un peu la lecture de la partition, selon la signature rythmique de la portée (voir plus bas).
- Vous avez 4 lignes qui marchent par paires : chaque ligne d'une paire commence par une clé différente : celle du haut par la clé de Sol, celle du bas par la clé de Fa. Selon la clé utilisée, les notes se lisent de façon différente. Il est notoire que la clé de Fa est utilisée surtout pour les partitions de basse.
- Vous avez aussi des durées de notes différentes, qui se traduisent par la représentation des notes sur la portée : la durée "standard", c'est la noire : une barre verticale et un cercle plein noir. Je reviendrai plus tard sur les différentes durées.
- Le "C" placé à la suite des clés indique la signature rythmique. Il signifie qu'on joue en 4/4 (non non pas la voiture) : le chiffre du haut indique combien d'unité rythmique comprend la mesure, l'unité rythmique est-elle indiquée par le chiffre du bas (le 4 indique que l'unité est la noire, le 8 la croche... je ne m'étends pas sur le sujet). Vous pouvez ainsi avoir une multitude de possibilités quant à la ryhtmique de votre musique. Ca c'est juste pour votre culture personnelle, les notions de rythmique ne sont pas utilisées sur MSX (ou du moins pas à ma connaissance !).

Pour les différentes notes, vous devrez savoir qu'il y a la noire (1 temps, voir plus haut), la blanche (2 temps : barre verticale et cercle vide blanc), la ronde (4 temps : pas de barre, juste un cercle un peu plus gras vide et blanc), la croche (un demi-temps : on ajoute une petite barre horizontale au dessin de la noire, qui peut être relié à une autre croche : c'est plus joli :D), la double-croche (un quart de temps : idem croche mais avec une barre horizontale de plus), les triples et quadruple croches (même principe que les précédentes, on rajoute une barre horizontale à chaque fois).

Enfin, il reste à voir la notion de tempo : c'est la vitesse à laquelle revient une noire. Il est convenu qu'un tempo de 60 correspond à une noire qui dure 1 seconde. Plus le tempo est élevé, plus l'enchaînement des notes est rapide !

Bon allez, au travail maintenant !! On va déjà décoder les notes qu'on a là !!

Voici un petit tableau qui sera bien utile pour décrypter les notes des portées selon la clé utilisée :

Dessin Clé de Sol Clé de Fa

Do

Mi

Fa

Mi

Sol

Fa

La

Sol

Si

La

Do

Si

Do

Mi

Fa

Mi

Sol

Fa

La

Sol

Si



Prochain post : comment utiliser PLAY et convertir tout ça pour le MSX


MSX un jour, MSX toujours ! :D
Site web    
Jipe Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 19h41

Messages: 10287

Le 22/12/2010 à 16h04
jusque la ça va je sais faire avec des vieux souvenirs de cours de musiques c'est la convertion qui est plus dure

PLAY"ACDE" je sais faire ce qu'il me manque c'est les nuances :)


:noel
Site web    
popolon Membre non connecté

Villageois

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 28/07/2010 à 22h07

Messages: 215

Le 22/12/2010 à 16h09
jusque la c'est bon, j'attends de voir l'explication pour comment faire des "triolets" :p
   
granced Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 09/10/2009 à 09h18

Messages: 1500

Le 22/12/2010 à 16h27
Passons maintenant du côté du MSX avec PLAY : cette instruction peut contenir plusieurs choses qui vont grandement nous intéresser ! Déjà la syntaxe : PLAY chaîne1, chaîne2, chaîne3
Le PSG du MSX a 3 voies, donc 3 chaînes de caractères utilisables (et comme qui peut le plus peut le moins, on peut utiliser seulement une ou deux chaînes) !

Intéressons-nous au contenu de la chaîne : plusieurs informations sont à entrer : le tempo, l'octave, la durée de note, les silences... et les notes bien sûr ! Il y a d'autres possibilités, mais nous allons d'abord aborder celles-là.

Le tempo s'indique via la lettre T suivie de la valeur du tempo. Si cette information est omise, le tempo est automatiquement mis à 120. Avec le MSX on peut aller jusqu'à 255 pour la valeur de T.

L'octave va de 1 à 8. Plus l'octave est bas, plus les notes jouées sont basses ! L'octave par défaut est le numéro 4.

La durée s'indique avec la lettre L, 4 pour une noire, 2 pour une blanche, 8 pour une croche etc...

Enfin, les notes sont à entrer selon la notation anglaise : C pour Do, D pour Ré, E pour Mi, F pour Fa, G pour Sol, A pour La et (si vous avez bien suivi) B pour Si.

Donc on y va : on regarde la partition et on retranscrit (par sécurité, vu que les registres gardent certaines informations, je remets toujours le tempo et l'octave d'origine en début de chaîne pour ne pas avoir de surprise désagréable) :

"T120O4L4CDECCDECEFL2GL4EFL2GL8GAGFL4ECL8GAGFL4ECCO3GO4L2CL4CO3GO4L2C"

Et voilà le travail !!


MSX un jour, MSX toujours ! :D
Site web    
BibiZen Membre non connecté

Maire-adjoint

Rang

Avatar

Inscrit le : 03/10/2009 à 18h34

Messages: 1455

Le 22/12/2010 à 16h50
Je préfère recopier les partitions directement à la souris dans SynthSaurus 3 :D

Excellent tuto Granced :top

E-mail    
MSXosaure Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 03/10/2009 à 00h09

Messages: 774

Le 22/12/2010 à 17h46
Excellent Granced! J'ai quelques base en solfèges, alors pour l'instant no problemo! toutefois, j'aurai une petite question: Quel écart d'octave y a-t-il entre la clé de sol et la clé de fa sur une partition?

Je sais que l'utilisation des players et toujours tentant mais il est souvent difficile de créer ses propres musiques. Synthsaurus semble intéressant à cet égard, mais sous quel format sortent les données produites et quel format musique: PSG, FM...?


Le MSXien le plus à l'ouest :fou ... ou presque :D
osaurer
   
Fabf Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 24/08/2010 à 20h55

Messages: 4833

Le 22/12/2010 à 18h33
Une basse est un octave en dessous d'une guitare
Sur un manche 24 cases il y a deux octaves
popolon Membre non connecté

Villageois

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 28/07/2010 à 22h07

Messages: 215

Le 22/12/2010 à 20h07
Il en fallait un pour tester, popolon s'y est collé ;)
Et y'a une toute petite erreur dans la chaine, un fa en trop (F) :
"T120O4L4CDECCDECEFL2GL4EFL2GL8GAGFL4FECL8GAGFL4ECCO3GO4L2CL4CO3GO4L2C"

edit granced : c'est corrigé, merci !! ;)
   
granced Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 09/10/2009 à 09h18

Messages: 1500

Le 23/12/2010 à 09h51
MSXosaure :
Quel écart d'octave y a-t-il entre la clé de sol et la clé de fa sur une partition?




fabf :
Une basse est un octave en dessous d'une guitare

Sur un manche 24 cases il y a deux octaves




Fabf a très bien répondu, même si dans l'absolu, rien ne t'empêche de baisser d'un octave supplémentaire (si tu as une partition qui s'y prête bien entendu, là dans l'exemple ça risque de faire bizarre).




MSX un jour, MSX toujours ! :D
Site web    
granced Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 09/10/2009 à 09h18

Messages: 1500

Le 23/12/2010 à 10h24
Vous me direz : "Eh, mais frère Jacques c'est un canon !!" (et pour ceux qui ne savent pas ce que c'est qu'un canon, c'est une chanson qu'on peut interpréter à plusieurs voix, avec un décalage dans le début. Il en résulte une jolie harmonisation : ici la deuxième voix commencera la chanson au moment où la première arrive à "Dormez-vous"). Eh bien c'est l'occasion pour nous de faire fonctionner les 3 voies du PSG, et d'utiliser les silences !

Un silence, comme son nom l'indique, est une moment dans une partition ou l'instrument ne joue pas. Dans l'instruction PLAY, celui-ci se signale par la lettre R, suivie d'un nombre qui indique le nombre de temps de silence (ces nombres sont d'ailleurs identiques aux longueurs de note, c'est quand même bien pensé non ? ;) )

On fait donc commencer la deuxième voix au niveau de la troisième mesure, soit un silence de 8 temps. Tant qu'on y est, on va mettre une troisième voix, qui va commencer au "Dormez-vous" de la deuxième voix (donc au "Sonnent les matines" de la première). Vous suivez ? :lol

Alors pour faire notre canon Frère Jacques, on va s'envoyer un petit programme qui va synthétiser tout ça !!

Code :
10 ' Initialisation des chaînes de caractères jouées par PLAY
20 ' Première voix
30 A$="T120O4L4CDECCDECEFL2GL4EFL2GL8GAGFL4ECL8GAGFL4ECCO3GO4L2CL4CO3GO4L2C"
40 'Deuxième voix : on ajoute deux silences de 4 temps avant de commencer
50 B$="R1R1"+A$
60 'Troisième voix : idem précédemment
70 C$="R1R1"+B$
90 'Maintenant on joue !
100 PLAY A$,B$,C$
110 'Et on peut boucler à l'infini en ajoutant la ligne 120 (ou pas...)
120 GOTO 100


Voilà ! ^^


MSX un jour, MSX toujours ! :D
Site web    
granced Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 09/10/2009 à 09h18

Messages: 1500

Le 24/12/2010 à 11h39
On va à présent passer à une partie un poil plus technique, vu qu'on va essayer de faire un peu de musique via l'instruction SOUND.

Cette instruction a ceci d'intéressant qu'elle permet de s'adresser directement au PSG à travers les registres dédiés au son qu'il comporte (la bagatelle de 14 registres :|, les registres 14 et 15 n'étant pas utilisés pour le son).

Chaque registre correspond à un paramètre particulier : on va en faire un petit récapitulatif avant de détailler un peu plus :
Registre 0 : valeur de réglage fin de la fréquence sur la voie A
Registre 1 : valeur de réglage grossier de la fréquence sur la voie A
Registre 2 : valeur de réglage fin de la fréquence sur la voie B
Registre 3 : valeur de réglage grossier de la fréquence sur la voie B
Registre 4 : valeur de réglage fin de la fréquence sur la voie B
Registre 5 : valeur de réglage grossier de la fréquence sur la voie B
Registre 6 : valeur de la fréquence pour un bruit
Registre 7 : valeur pilote pour le mixage sur les voies entre bruitage et son
Registre 8 : valeur du volume pour la voie A et mode de sélection du contrôle d'amplitude
Registre 9 : valeur du volume pour la voie B et mode de sélection du contrôle d'amplitude
Registre 10 : valeur du volume pour la voie C et mode de sélection du contrôle d'amplitude
Registre 11 : ajustement fin de la période d'enveloppe
Registre 12 : ajustement grossier de la période d'enveloppe
Registre 13 : forme de modulation (si la sélection du contrôle d'amplitude est activée dans les registres 8 à 10)

Ouf !! Vous n'y entravez rien ? C'est tout à fait normal ! :lol
C'est très obscur et seuls les gens calés en acoustique pourront utiliser ces registres avec brio. Pour notre exemple, on va essayer de faire simple, et rien ne vous empêche par la suite de tenter des choses en modifiant certains registres ^^

Je vais cependant essayer de "dégrossir" un peu la chose : chaque son, chaque note correspond à une fréquence, et le but est de la faire reproduire par le PSG. Prenons le LA traditionnel : sa fréquence est de 440 Hz. Pour trouver quoi mettre dans nos registres, il faut passer par deux étapes : d'abord on divise la fréquence du Z80 par 16, puis par la valeur de la fréquence qu'on cherche à coder, donc ici : 3 579 545/16 = 223721,5625 puis 223721,5625/440 = 508,458.....
On arrondit à l'unité par excès : on obtient donc 509.
A partir de là, il faut convertir ce nombre en binaire (les cours de maths pour l'informatique sont à demander au besoin :D ), sur 12 bits.
Pour 509, on obtient 000111111101. Les 4 bits les plus significatifs (ceux de gauche quoi), représentent le réglage grossier, les 8 bits restant le réglage fin ! Donc ici, 1 pour le réglage grossier, 253 pour le réglage fin !
Donc pour résumer, si je veux passer une fréquence de LA dans mon Z80 (disons sur la voie A), il faut que j'envoie la valeur 252 dans le registre 0, et 1 dans le registre 1 !!

Ca y est c'est bon ? Eh bien... Non.

Il faut encore régler le mixage et le volume !!

Ici je veux juste du son, pas de bruit. Je dois donc couper la possibilité de bruit sur la voie A.
Je vous décris un peu le fonctionnement du registre R7. Codé sur 8 bits, chaque bit correspond à une action particulière : la valeur se présentera sous la forme B7 B6 B5 B4 B3 B2 B1 B0
Les bit B7 et B6 ne nous intéressent pas, car ils concernent autre chose
Les bits B5, B4 et B3, mis à 1 coupent respectivement les bruitages sur les voies C, B et A
Les bits B2, B1 et B0 mis à 1 coupent respectivement les sons sur les voies C, B et A

Donc en gros, si je ne veux que produire du son sur la voie A, je peux couper les deux autres voies de son et les canaux de bruitage ! J'aurai donc en binaire 00111110, soit 62 !

Et enfin le volume ! Là, en binaire, la valeur n'est codée que sur 5 bits, et même 4 si on utilise pas la modulation d'enveloppe, ce qui est notre cas !! Donc sur 4 bits, on aura une valeur allant de 0 à 15 !

Armé de tout ça, on peut enfin produire un LA en MSX-Basic !!

Code :
SOUND 0,253 : SOUND 1,1 : SOUND 7,62 : SOUND 8,8


Et là, ô miracle, un LA !!

... Mais ??? Mais ça ne s'arrête pas ?? Eh bien non !! Le problème de SOUND c'est qu'il n'y a pas de gestion de durée dans les registres !! Pour en sortir, un bon CTRL+STOP !!

La prochaine fois, on essaiera de gérer le temps !


MSX un jour, MSX toujours ! :D
Site web    
igal Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++

Inscrit le : 29/07/2010 à 17h19

Messages: 5492

Le 24/12/2010 à 13h14
Ouaou... :)

J'aurais jamais pensé qu'un simple Bip téléphonique soit aussi compliqué à reproduire :oups
En tout cas, ton cours est magistral, vivement la suite :top


Tiens... voila du boudin, voila du boudin, voila du boudin... :siffle
granced Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 09/10/2009 à 09h18

Messages: 1500

Le 24/12/2010 à 14h21
Oui du coup, on se dit que faire déjà un pauvre "Frère Jacques" à base de SOUND ne va pas être facile hein... Mais je vais m'y mettre ^^


MSX un jour, MSX toujours ! :D
Site web    
granced Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 09/10/2009 à 09h18

Messages: 1500

Le 27/12/2010 à 13h31
On continue donc avec la gestion du temps pour SOUND. On va reprendre notre bon "Frère Jacques" qu'on va transcrire en informations utilisables.

Je me suis concocté un joli tableau (disponible à la demande) pour la correspondance entre chaque note de PLAY en valeurs pour les registres 0 et 1 du PSG (si je joue sur la voie A, pour les autres voies, ce sera les registres 2 et 3 ou 4 et 5, à vous de voir), il faudra donc me faire confiance pour les valeurs entrées ! ;)

Donc : le problème de SOUND est qu'on donne des valeurs dans les registres du PSG, qui ne changent pas tant qu'on ne le lui dit pas ! C'est pourquoi la portion de code donnée précédemment ne s'interrompt jamais sauf en cas de CTRL+STOP.

Le principe général de notre programme pour jouer Frère Jacques sera de remplir successivement les 4 registres permettant de sortir un son sur la voie A, pour faire ça, on utilisera READ et DATA. Reste la problématique de gestion du temps...

En MSX-Basic, il y a deux moyens au moins de régler ce problème (ces méthodes restent un poil imprécises car j'avoue ne pas maîtriser très bien les durées à ce niveau là... :oups).

La première - la plus facile mais pas forcément la plus rigoureuse - consiste à placer à la suite des instructions SOUND une boucle qui tourne à vide. Il reste alors à effectuer la lecture des DATA un certain nombre de fois. Pour notre exemple, cependant, un autre problème se pose : la durée des notes. On a de la blanche, de la noire et de la croche. En conséquence, on va prendre la croche comme unité de base (1 noire = 2 croches, 1 blanche = 4 croches). Ce qui va passablement augmenter nos DATA vu qu'il faudra doubler voire quadrupler les valeurs à passer dans les registres ! Enfin, pour couper la dernière note, je vais rajouter une salve de 0, afin d'annuler les valeurs dans les registres et couper ainsi le son ! La chanson fait 8 mesures de 4 noires, soit l'équivalent en valeur de 32 noires, ou 64 croches. J'aurai donc 64 notes, donc 128 valeurs, plus la mise à 0 donc l'équivalent de 65 notes, pour 130 données à passer dans les DATA !

On y va ? C'est parti !

Code :
10 FOR I=1 TO 65 : 'Initialisation de la boucle 
20 READ A,B : 'Lecture des valeurs à placer dans les registres
30 SOUND 0,A : SOUND 1,B : SOUND 7,&H38 : SOUND 8,8 : 'Seules les valeurs des registres 0 et 1 changent
40 FOR J=1 TO 120 : NEXT J : 'Boucle qui tourne à vide pour définir une durée à la note
50 NEXT I
60 'Données à mettre dans les registres
100 DATA &HAC, 1, &HAC, 1, &H7D, 1, &H7D, 1, &H53, 1, &H53, 1, &HAC, 1, &HAC, 1
110 DATA &HAC, 1, &HAC, 1, &H7D, 1, &H7D, 1, &H53, 1, &H53, 1, &HAC, 1, &HAC, 1
120 DATA &H53, 1, &H53, 1, &H40, 1, &H40, 1, &H1D, 1, &H1D, 1, &H1D, 1, &H1D, 1
130 DATA &H53, 1, &H53, 1, &H40, 1, &H40, 1, &H1D, 1, &H1D, 1, &H1D, 1, &H1D, 1
140 DATA &H1D, 1, &HFE, 0, &H1D, 1, &H40, 1, &H53, 1, &H53, 1, &HAC, 1, &HAC, 1
150 DATA &H1D, 1, &HFE, 0, &H1D, 1, &H40, 1, &H53, 1, &H53, 1, &HAC, 1, &HAC, 1
160 DATA &HAC, 1, &HAC, 1, &H3B, 2, &H3B, 2, &HAC, 1, &HAC, 1, &HAC, 1, &HAC, 1
170 DATA 0, 0


Voilà, première méthode codée ! Je vous revois tout à l'heure pour la deuxième, un peu plus sophistiquée, mais plus rigoureuse ;)


MSX un jour, MSX toujours ! :D
Site web    
granced Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 09/10/2009 à 09h18

Messages: 1500

Le 27/12/2010 à 15h35
En Basic, il y a donc une méthode un peu compliquée d'accès, mais qui a le mérite de bien prendre en compte le temps, c'est le ON INTERVAL=... GOSUB.

En utilisant cette instruction, on prend en compte l'interruption générée par l'horloge interne du Z80 de votre MSX. Le décompte est mis en place dès que l'instruction INTERVAL ON est rencontrée. A compter de cet instant, chaque fois que la durée de temps définie dans le ON INTERVAL=... GOSUB s'écoule, on saut à la ligne du sous-programme ainsi défini. Le mieux est que je vous fournisse le code de suite, ce sera probablement plus explicite.

Code :
10 T=0 : ' T représente le nombre de notes, histoire d'avoir une variable qui nous permette de finir le programme.
20 ON INTERVAL=20 GOSUB 50 : 'On prend donc ici un intervalle de 20
30 INTERVAL ON : 'On lance le chronomètre !
40 GOTO 40 : 'On glande, le temps d'atteindre le temps voulu
50 T=T+1 : IF T>65 THEN INTERVAL OFF : GOTO 80 ELSE READ A, B : ' Si j'ai mon nombre de notes, je coupe le décompte et je file en ligne 80 pour finir le programme, sinon, je lis les valeurs
60 SOUND 0, A : SOUND 1, B : SOUND 7, &H38 : SOUND 8,8 : 'on charge les registres du PSG
70 RETURN : 'On reprend juste après le GOSUB, donc retour en début de programme
80 END : 'Fin du programme
100 DATA &HAC, 1, &HAC, 1, &H7D, 1, &H7D, 1, &H53, 1, &H53, 1, &HAC, 1, &HAC, 1
110 DATA &HAC, 1, &HAC, 1, &H7D, 1, &H7D, 1, &H53, 1, &H53, 1, &HAC, 1, &HAC, 1
120 DATA &H53, 1, &H53, 1, &H40, 1, &H40, 1, &H1D, 1, &H1D, 1, &H1D, 1, &H1D, 1
130 DATA &H53, 1, &H53, 1, &H40, 1, &H40, 1, &H1D, 1, &H1D, 1, &H1D, 1, &H1D, 1
140 DATA &H1D, 1, &HFE, 0, &H1D, 1, &H40, 1, &H53, 1, &H53, 1, &HAC, 1, &HAC, 1
150 DATA &H1D, 1, &HFE, 0, &H1D, 1, &H40, 1, &H53, 1, &H53, 1, &HAC, 1, &HAC, 1
160 DATA &HAC, 1, &HAC, 1, &H3B, 2, &H3B, 2, &HAC, 1, &HAC, 1, &HAC, 1, &HAC, 1
170 DATA 0, 0


Voilà le travail ! Je pense que cette méthode est la plus proche de celle qui doit être employée en assembleur. Vous remarquerez qu'encore une fois on prend pour unité de durée la croche (la plus petite durée de la partition).

A votre disposition pour toute question, et toute proposition d'amélioration, car tout cela reste perfectible (sinon, j'ai encore un petit chapitre sous le coude pour les plus acharnés et bidouilleurs) ! ^^


MSX un jour, MSX toujours ! :D
Site web    
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie