par , 23/08/2022 à 11h00 (1273 Affichages)
Générateur de ligne d'accords pour le reggae
introduction
selon le cycle des quintes, les accdord voisin du do majeur sont les accords suivants:
fa majeur,sol majeur,ré mineur,la mineur,mi minieur.
il parait que si on choisi quatre accords voisins du do dans le cycle des quintes, do y compris, on obtient quelque chose de potable.
le programme
chaque mesure sera joué en contre-temps avec le même accord. Chacune de ces mesures n'est donc constituée que d'un seul accord. On implémente ces mesures dans le tableau "accord":
1 2 3 4 5 6 7 8 9
|
std::string accord[6]={
"z [CEG] z [CEG]|",//do majeur (do mi sol)
"z [DFA] z [DFA]|",//ré mineur (ré fa la)
"z [EGB] z [EGB]|",//mi mineur (mi sol si)
"z [FAc] z [FAc]|",//fa majeur (fa la do)
"z [GBd] z [GBd]|",//sol majeur (sol si ré)
"z [Ace] z [Ace]|"//la mineur (la do mi)
}; |
Pour faire une ligne, le programme en choisira 4 accords aléatoirement, un accord pouvant se répéter (il y a donc 6^4=1296 lignes possibles).
1 2 3 4
|
std::string utilise[4];
for(int i=0;i<4;i++)
utilise[i]=accord[distr(eng)]; |
Pour l'entête, un std::cout sera utilisé ainsi:
std::cout<<"X: 1\nK: C\nM: 4/4\nL: 1/4"<<std::endl;
La ligne se constitue de quatre accord et est répété à quatre reprises. Le programme écrit quatre mesures sur quatre portées.la dernière portée (i=3) se termine par "|]" qui est la barre verticale de premier trait fin (écrit grâce à la barre verticale des strings du tableau accords) et de deuxième trait épais indiqué par ']'.
1 2 3 4 5 6 7 8
| for(int i=0;i<4;i++){
for(int j=0;j<4;j++)
std::cout<<utilise[j];
if(i<3)
std::cout<<std::endl;
else
std::cout<<']'<<std::endl;
} |
voici le programme complet:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| #include <iostream>
#include <random>
#include <string>
int main(){
std::random_device rd;
std::mt19937 eng(rd());
std::uniform_int_distribution<int> distr(0,5);
std::string accord[6]={
"z [CEG] z [CEG]|",
"z [DFA] z [DFA]|",
"z [EGB] z [EGB]|",
"z [FAc] z [FAc]|",
"z [GBd] z [GBd]|",
"z [Ace] z [Ace]|"
};
std::string utilise[4];
for(int i=0;i<4;i++)
utilise[i]=accord[distr(eng)];
std::cout<<"X: 1\nK: C\nM: 4/4\nL: 1/4"<<std::endl;
for(int i=0;i<4;i++){//nombre de portées
for(int j=0;j<4;j++)
std::cout<<utilise[j];
if(i<3)
std::cout<<std::endl;
else
std::cout<<']'<<std::endl;
}
} |
cela pourrait donner ceci:
1 2 3 4 5 6 7 8
| X: 1
K: C
M: 4/4
L: 1/4
z [FAc] z [FAc]|z [Ace] z [Ace]|z [GBd] z [GBd]|z [GBd] z [GBd]|
z [FAc] z [FAc]|z [Ace] z [Ace]|z [GBd] z [GBd]|z [GBd] z [GBd]|
z [FAc] z [FAc]|z [Ace] z [Ace]|z [GBd] z [GBd]|z [GBd] z [GBd]|
z [FAc] z [FAc]|z [Ace] z [Ace]|z [GBd] z [GBd]|z [GBd] z [GBd]|] |
utilisation
il faudra installer abcmidi, timidity:
$ sudo apt install abcmidi timidity
supposons que l’exécutable se nome genR, ce programme s'utilise ainsi:
1 2 3
| $ genR | tee nomfichier.abc
$ abc2midi nomfichier.abc
$ timidity nomfichier1.mid (le 1 est ajouté par abc2midi) |
on peut aussi convertir en wav, puis en mp3:
1 2 3
| $ sudo apt install lame
$ timidity -Ow nomfichier1.mid (pour convertir en wav)
$ lame nomfichier1.wav (pour convertir en mp3) |
pour voir la partition écrite:
1 2 3
| $ sudo apt install abc2ps ps2pdf
$ genR > nomfichier.abc
$ abcm2ps -O nomfichier.ps nomfichier.abc |
evince saura afficher ce fichier:
pour le convertir en pdf:
1 2
| $ ps2pdf nomfichier.ps
$ evince nomfichier.pdf |