Calculer la durée d'un pas selon le tempo et la signature rythmique

Calculer la durée d'un pas selon le tempo et la signature rythmique - Algo - Programmation

Marsh Posté le 21-06-2012 à 21:54:29    

Bonjour,
Je cherche comment calculer la durée d'un pas selon le tempo et la signature rythmique.
 
Pour le moment j'ai une résolution fixe de 128 pas par mesure.
Pour calculer la durée d'un pas avec une signature rythmique 4/4 je fais : ((60000.0/tempo)/32.0)/1000.0
Ainsi, pour un tempo de 120.0 je passe 8 mesures en 16 secondes.
Mais comme je digère pas les wikipedia sur la théorie musicale, je reviens ici en espérant avoir un indice.
Merci.


Message édité par Profil supprimé le 21-06-2012 à 21:58:22
Reply

Marsh Posté le 21-06-2012 à 21:54:29   

Reply

Marsh Posté le 17-07-2012 à 02:41:51    

Up!

Reply

Marsh Posté le 12-10-2012 à 11:35:46    

up ! !!

Reply

Marsh Posté le 18-11-2012 à 12:15:03    

Salut,
Pour la signature rythmique, le chiffre du bas est une puissance de 2 qui ne dépasse pas 16 (j'ai jamais vu plus, en tout cas) --> juste pour info.
 
Si tu as la signature n/p, au tempo t correspondant à p (exemple : pour 7/8, p = 8 c'est-à-dire une croche, le tempo sera donc donné à la croche), avec d la durée de chacun des 128 pas :
 
d = (n*60/t)/128


---------------
IWH  ---  Le forum de toute une génération : http://losersiv.1fr1.net (losers, sans-ami, dépressifs, allez on va faire cette merde)
Reply

Marsh Posté le 18-11-2012 à 12:36:44    

Ok, salut, merci déjà pour ça.
 
Si tu pouvais me donner le même exemple avec une signature 3/4  ou 4/4 ce serait parfait je pense.


Message édité par Profil supprimé le 18-11-2012 à 12:36:51
Reply

Marsh Posté le 18-11-2012 à 12:52:16    

C'est-à-dire ?
 
3/4 c'est trois noires par mesure, 4/4 quatre noires par mesure, etc..
La formule marche toujours, si on se fixe comme règle générale que le tempo est défini par le nombre de (p) par minute, la durée du pas ne dépend pas de la valeur de p (2 pour blanche, 4 pour noire, 8 pour croche, 16 pour double-croche, sont les valeurs usuelles même si 2 et 16 sont rares)


---------------
IWH  ---  Le forum de toute une génération : http://losersiv.1fr1.net (losers, sans-ami, dépressifs, allez on va faire cette merde)
Reply

Marsh Posté le 18-11-2012 à 14:11:22    


Je dois construire un système qui prend en paramètre la signature rythmique.
Je doit définir à partir de la signature, le nombre de pas par mesure et la durée des pas.

simius_computus a écrit :


3/4 c'est trois noires par mesure, 4/4 quatre noires par mesure, etc..
La formule marche toujours, si on se fixe comme règle générale que le tempo est défini par le nombre de (p) par minute, la durée du pas ne dépend pas de la valeur de p (2 pour blanche, 4 pour noire, 8 pour croche, 16 pour double-croche, sont les valeurs usuelles même si 2 et 16 sont rares)


 
Avec une signature 4/4 j'aurais pas la même durée de pas que pour 4/8. Puisque le dénominateur vaut une noire en premier lieu et une croche en second, c'est bien ça ?
 
Autre question :
Pour le moment, je sais que je travaille avec une signature 4/4 et en tout cas 32 pas par mesure.
J'applique ((60000.0/tempo)/8)/1000.0 pour avoir la durée d'un pas.
Donc, avec une signature n/p je devrais avoir des mesure de combien de pas ?

Reply

Marsh Posté le 18-11-2012 à 15:44:17    

 

tu as dit dans le 1er post que tu gardais un nombre de pas constant par mesure !

  

Ben si la durée sera la même (si je prends l'hypothèse de départ de 128 pas par mesure) puisque si par ex ton tempo est de 120, avec 4/4 ce sera 120 à la noire (120 noires par minute), et avec 4/8 ce sera 120 à la croche (120 croches par minute), croches et noires n'ont dans l'absolu pas de durée.
Ou alors tu définis ton tempo comme étant toujours par rapport à la noire, dans ce cas pour un tempo donné sur une mesure à 4/8 effectivement les mesures dureront 2x moins longtemps donc pareil pour le pas.

  

32 pas par temps tu veux dire ?  :D

 

Explique clairement quelles sont tes données de départ, celles que tu veux faire varier et celles qui resteront constantes..
J'ai jamais bossé avec du midi, je pensais que la définition était constante, en nombre de pas par seconde.


Message édité par simius_computus le 18-11-2012 à 15:45:01

---------------
IWH  ---  Le forum de toute une génération : http://losersiv.1fr1.net (losers, sans-ami, dépressifs, allez on va faire cette merde)
Reply

Marsh Posté le 18-11-2012 à 16:09:27    

Je pense pas qu'on verra le midi ici, c'est juste pour construire la musique en fonction de la signature.
 
Au départ dans le projet j'ai pas vraiment de constante, aujourd'hui j'ai fait un truc sans me soucier de la signature, je comprend pas comme la signature interviens dans l'architecture musicale.
 
Mais maintenant que tu es là,  [:jar jar] , je vais tout comprendre et je vais reprendre le projet au début en intégrant les paramètres rythmiques.
 
Si non, j'ai rien capter.
 
Pour spécifier mes besoin un peut, donc un noire une croche n'on pas de durée dans l'absolue.
Alors je commence par quoi pour construire mon système musicale ?
 
J'ai besoin de construire des phrases d'un certain nombres de pas tout en voulant jouer toujours des double croche.
Pour ça il me faut borner un tableau du nombre de pas en question, j'ai besoin du nombre de pas phrase, si ce ne sont des mesures...
Et il me faut placer les notes en fonction de la signature, et calculer la durée des pas pour jouer au tempo.
 
est-ce que c'est plus clair ?
 
En tout cas merci pour tes réponses.

Reply

Marsh Posté le 18-11-2012 à 17:49:46    

Bon en gros pour une signature n/p tu dois avoir n notes (ou silences) de valeur p dans une mesure, p étant une puissance de 2.

 

p = 1 correspond à une ronde
p = 2 une blanche (dure deux fois moins qu'une ronde)
p = 4 une noire (dure deux fois moins qu'une blanche)
p = 8 une croche (...
p = 16 une double-croche (...

 

Ce sont des fractions en fait :
Une mesure à 7/8 pourra par exemple être remplie par 7 x 1/8 (huit croches donc), ou par 2 x 1/4 + 3 x 1/8 (deux noires et trois croches), ou encore 1/2 + 1/4 + 1/8 (une blanche, une noire, et une croche). Dans l'ordre qu'on veut évidemment, le tout est que la somme soit égale au quotient donné en signature.

 

On peut également introduire des valeurs ternaires (qui cependant ne sont jamais utilisées en tant que dénominateur dans la signature), comme le triolet qui représente 1/3 de la durée d'une noire, soit 1/12; triolet de noires 1/3 d'une blanche soit 1/6; sextolet 1/6 d'une noire soit 1/24. D'autres valeurs impaires moins communes : quintolet (1/5 d'une noire), septolet (1/7 d'une noire)

 

Note bien qu'à aucun moment on ne parle de durées en secondes.

 

Maintenant si on fixe un tempo, par exemple 120 à la noire, ça voudra dire que ta noire durera 0.5s, ta croche 0.25s, etc.
120 à la croche donnera 1s pour la noire, 0.5s pour la croche, etc. Bref..

 

Selon les besoins de la musique on peut avoir dans un même morceau des changements de tempo, et/ou de signature.

 

Ensuite pour les pas, le problème c'est que si ton morceau contient à la fois des double-croches (1/16) et des sextolets (1/24), si tu veux avoir le même débit de pas sur tout le morceau, c'est-à-dire diviser chaque mesure en un nombre constant de cases permettant de structurer la musique, il faudra que ce nombre soit le plus petit multiple commun entre double-croches et sextolets; exemple si la signature est 4/4 ça donnera 192 pas/mesure (48 par noire, soit 3x16 et 2x24)

 

Mais l'idéal serait d'avoir un premier aperçu de ton programme, j'ai du mal à visualiser pour le moment.


Message édité par simius_computus le 18-11-2012 à 18:01:12

---------------
IWH  ---  Le forum de toute une génération : http://losersiv.1fr1.net (losers, sans-ami, dépressifs, allez on va faire cette merde)
Reply

Marsh Posté le 18-11-2012 à 17:49:46   

Reply

Marsh Posté le 18-11-2012 à 18:11:21    

Ok, merci bein, beaucoup pour ça. Je pense que la réponse est là.
Mon projet en est à la version 0.1.3 : dans http://jovalise.net/dev
 
Si tu lis Ada; Le paquet q.ads dans src/lib définit le nombre de pas par temps donc, si tu le dis... :/
Après dans le src/quatuor je donne à q-sequencer.ads un facteur de ce nombre de pas, qui étaient des bar à l'origine pour moi.
En suite comme tu peux le voir le quantum pour chaque pas est calculé sur la base hypothétique d'une signature constante 4/4.
 
Je vais réviser, augmenter mon programme grâce à toi. Merci beaucoup donc.
 
 
A propos:

Citation :

Ensuite pour les pas, le problème c'est que si ton morceau contient à la fois des double-croches (1/16) et des sextolets (1/24), si tu veux avoir le même débit de pas sur tout le morceau, c'est-à-dire diviser chaque mesure en un nombre constant de cases permettant de structurer la musique, il faudra que ce nombre soit le plus petit multiple commun entre double-croches et sextolets; exemple si la signature est 4/4 ça donner 192 pas/mesure (48 par noire, soit 4x16 et 3x24)


Effectivement, c'est ce que je cherchais à faire dans un premier temps. Donc, à ton avis, je fais des mesures de 192 pas et je peut faire la musique que je souhaite ?
Reste à savoir comment je vais gérer la signature après pour composer la musique....
 
Je te laisse regarder un poil le projet écrit avec Ada, je suis certain que tu retrouvera le C plus tard.
Le code est pas commenté dans cette version du projet par contre, je suis dessus, si tu veuxdes commentaire, signale le moi.


Message édité par Profil supprimé le 18-11-2012 à 18:12:00
Reply

Marsh Posté le 18-11-2012 à 18:18:57    

Ah non, mais c'était pour l'exemple.... Allah là.
Donc, je vais relire avec le doigt.
 
Dans mon programme la signature va être un paramètre variable, peut-être.


Message édité par Profil supprimé le 18-11-2012 à 18:19:30
Reply

Marsh Posté le 18-11-2012 à 18:50:44    

Je vais essayer de voir ça, sans rien garantir mais bon   :D

 

Sinon j'ai édité mon post entre-temps :

 
Citation :

... exemple si la signature est 4/4 ça donnera 192 pas/mesure (48 par noire, soit 3x16 et 2x24)

 

(j'avais écrit 4x16 et 3x24  :o )


Message édité par simius_computus le 18-11-2012 à 18:51:03

---------------
IWH  ---  Le forum de toute une génération : http://losersiv.1fr1.net (losers, sans-ami, dépressifs, allez on va faire cette merde)
Reply

Marsh Posté le 18-11-2012 à 19:25:40    

Ok, merci pour les corrections.
 
Si non, voilà ce que je veux faire à la base.
 

1# ./main  
Bonjour le monde
 
Je suis compositeur- interprète de musique sur instrument MIDI.
Ajouter un style à la liste de lecture :  
 
ELECTRO
MINIMAL
HOUSSE
TECHNO
HARDTECH
DNB
HARDCORE
EXPERIMENTAL
Quels genre de musique souhaitez vous écouter ? (tapez entrée si non)
 
Souhaitez vous que je fasse de la fusion ?
Entrez le tempo de départ...


Et après tous générer automatiquement. Enfin, le plus possible.
Mais c'est très abstrait encore aujourd'hui. Vu que je connais que très peu chacun de ces styles

Reply

Marsh Posté le 18-11-2012 à 20:02:23    

C'est très ambitieux comme truc quand même.
 
Concernant l'utilisation des RDN ça se passerait comment ?


---------------
IWH  ---  Le forum de toute une génération : http://losersiv.1fr1.net (losers, sans-ami, dépressifs, allez on va faire cette merde)
Reply

Marsh Posté le 18-11-2012 à 21:00:23    

simius_computus a écrit :

C'est très ambitieux comme truc quand même.
 
Concernant l'utilisation des RDN ça se passerait comment ?


 
Une entrée/sortie du réseau correspond à une note sur le clavier.
En suite un tire les n note sur le clavier pas par pas où l'on souhaite des notes.
A l'initialisation une note joué doit valoir 1.0, 0.0 si non.
En sotie du réseau les notes jouées sont sensées avoir une valeur supérieur ou égale à 0.5 et inférieur si non.
La j'ai eu la flemme de faire des échantillons., alors j'initialise tout aléatoirement, et j'interroge aléatoirement aussi + une intervention du clavier maître sur les basse et Lead.
 
edit : inférieur si non.


Message édité par Profil supprimé le 18-11-2012 à 21:03:36
Reply

Marsh Posté le 19-11-2012 à 23:12:25    

Bonjour,
 
J'essaie de battre la mesure en fonction de la signature mais j'ai pas compris en fait, j'ai tout essayé, je ne sais même plus ce que je doit faire à l'instant.
 
Un bout de code pour afficher la position dans la mesure et afficher boom ! quand il faut, mais c'est loin d'être le cas.
 

Code :
  1. # cat main.adb
  2.  
  3.  
  4. with Ada.Text_Io;
  5. use Ada;
  6.  
  7. with Ada.Calendar;
  8. use Ada.Calendar;
  9.  
  10. procedure Main is
  11.        
  12.  
  13.   Date    : Time     := Clock;
  14.   Quantum : Duration := 1.0;
  15.   Tempo   : Float    := 150.0;
  16.  
  17.   Num     : Positive := 4;
  18.   Den     : Positive := 8;  
  19.  
  20.   Bar_Beat : Natural := 0;  
  21.  
  22. begin  
  23.  
  24.   loop      
  25.      
  26.      Quantum := Duration((Float(Num*60000.0)/Tempo)/Float(2**den))/1000.0;      
  27.      delay until Date + Quantum;
  28.      Date := Date + Quantum;            
  29.      Text_Io.Put("bar beat : " &
  30.                    Natural'Image(Bar_Beat/(2**Den)) &
  31.                    '.' & Natural'Image(Bar_Beat/(2**Den/num) mod num) &
  32.                    '.' & Natural'Image(Bar_Beat mod 2**Den/num));
  33.      if Bar_Beat mod Num*(2**Den) = 0 then
  34.         Text_Io.Put_line("... Boom !" );
  35.      else
  36.         Text_Io.New_Line;
  37.      end if;
  38.      Bar_Beat := Bar_Beat + 1;
  39.   end loop;
  40.  
  41. end Main;

Reply

Marsh Posté le 19-11-2012 à 23:31:39    

Ah, je crois que j'approche...
 

Code :
  1. # cat main.adb
  2.  
  3.  
  4. with Ada.Text_Io;
  5. use Ada;
  6.  
  7. with Ada.Calendar;
  8. use Ada.Calendar;
  9.  
  10. procedure Main is
  11.        
  12.  
  13.   Date    : Time     := Clock;
  14.   Quantum : Duration := 1.0;
  15.   Tempo   : Float    := 150.0;
  16.  
  17.   Num     : Positive := 4;
  18.   Den     : Positive := 8;  
  19.  
  20.   Bar_Beat : Natural := 0;  
  21.  
  22. begin  
  23.  
  24.   loop      
  25.      
  26.      Quantum := Duration((Float(Num*60000.0)/Tempo)/Float(2**den))/1000.0;      
  27.      delay until Date + Quantum;
  28.      Date := clock + Quantum;            
  29.      Text_Io.Put("bar beat : " &
  30.                    Natural'Image(Bar_Beat/(2**Den)) &
  31.                    '.' & Natural'Image(Bar_Beat/(2**Den/num) mod num) &
  32.                    '.' & Natural'Image(Bar_Beat mod ((2**Den)/den)));
  33.      if Bar_Beat mod (2**Den/den) = 0 then
  34.         Text_Io.Put_line("... Boom !" );
  35.      else
  36.         Text_Io.New_Line;
  37.      end if;
  38.      Bar_Beat := Bar_Beat + 1;
  39.   end loop;
  40.  
  41. end Main;

Reply

Marsh Posté le 20-11-2012 à 00:52:45    

simius_computus a écrit :


 
d = (n*60/t)/128


 
 
 
T'es certain de ta formule, parce que je fait des essais et je m'approche d'avantage de la vérité, ou alors, je ne sais pas écrire la musique mais bon.
 
j'ai fait ((60000/t)/2**p)/1000.0, mais j'ai un boum sur deux pas dans la position mais dans le temps. Si non, mon boom colle avec la position. Mais donc aucun des deux dans le temps.
Ah, j'essaie un truc et je reviens.
 
edit correction de ma formule.


Message édité par Profil supprimé le 20-11-2012 à 01:04:45
Reply

Marsh Posté le 20-11-2012 à 01:32:49    

Je colle le dernier code, maintenant que j'y suis donc, le code complet actuel pour bien comprendre.
 

Code :
  1. with Ada.Text_Io;
  2. use Ada;
  3.  
  4. with Ada.Calendar;
  5. use Ada.Calendar;
  6.  
  7. procedure Main is
  8.        
  9.  
  10.   Date    : Time     := Clock;
  11.   Quantum : Duration := 1.0;
  12.   Tempo   : Float    := 120.0;
  13.  
  14.   Num     : Positive := 4;
  15.   Den     : positive := 8;  
  16.  
  17.   Bar_Beat : Natural := 0;  
  18.  
  19. begin  
  20.  
  21.   loop      
  22.      
  23.      Quantum := Duration(60000.0/Tempo/Float(Den)/1000.0);
  24.      delay until Date + Quantum;
  25.      Date := clock + Quantum;            
  26.      Text_Io.Put("bar beat : " &
  27.             Natural'Image(Bar_Beat/((Den)*Num)) &
  28.             '.' & Natural'Image(Bar_Beat/(Den) mod Num) &
  29.             '.' & Natural'Image(Bar_Beat mod (Den)));
  30.      if Bar_Beat mod (Den) = 0 then
  31.      Text_Io.Put_line("... Boom !" );
  32.      else
  33.      Text_Io.New_Line;
  34.      end if;
  35.      Bar_Beat := Bar_Beat + 1;
  36.   end loop;
  37.  
  38. end Main;


 
 
Donc, les calcul semble bon, j'ai essayé quelques trucs, sauf que j'ai un boum sur deux dans le temps à comparer avec ce que j'écris comme musique habituellement.
 
Alors une question de théorie, en techno pose- t- on un kick au temps et à contre temps ? Je pense pas, mais sait-on jamais... j'y connais rien.
 
Celui qui me répond parfois je le ban. lol


Message édité par Profil supprimé le 20-11-2012 à 07:19:14
Reply

Marsh Posté le 20-11-2012 à 01:57:57    

En fait le code ci-dessus me va parfaitement.
 
Merci. merci simius, merci beaucoup, si tu as un complément ou au cas ou je me goure encore, merci de me corriger encore.

Reply

Marsh Posté le 20-11-2012 à 09:41:12    

J'ai quand même un problème là. jusque la ça allez, mais là j'ai plus mon boom à chaque temps. J'y suis allé doucement pourtant je sais ce que j'ai fait, je vois pas mon erreur.
Le mieux c'est de tester le truc, parce que c'est chelou.
Genre, j'ai un boom au 4 premier pas, puis 1 toute les mesures puis encore tout les pas .. etc.
Si vous voyez...  

Code :
  1. ---------------------------------------------------------------------
  2. -- Programme qui bat le mesure et qui affiche boom à chaque temps. --
  3. ---------------------------------------------------------------------
  4.  
  5. with Ada.Text_Io, Ada.Integer_Text_Io, Ada.float_Text_Io;
  6. use Ada;
  7. with Ada.Numerics.Discrete_Random;
  8. with Ada.Calendar;
  9. use Ada.Calendar;
  10.  
  11. with Interfaces.C;
  12. with Ada.Containers.Vectors;
  13.  
  14. procedure Main is
  15.  
  16.   -- Pour faire de la musique.
  17.  
  18.   package Musical_Theory is                        
  19.      
  20.      
  21.      
  22.      type Traveler_Type is
  23.         record
  24.            Date    : Time     := Clock;
  25.            Quantum : Duration := 1.0;
  26.            Tempo   : Float    := 120.0;  
  27.            Num     : Positive := 4;
  28.            Den     : positive := 8;      
  29.            Bar_Beat : Natural := 0;                
  30.         end record;                                            
  31.      -- Les variables qui nous permettent de poser du son.
  32.      
  33.      
  34.      Default : aliased Traveler_Type;
  35.      -- Mise à disposition de la variable qui nous permetra de poser son.
  36.      
  37.      
  38.      task type Travel_Type(Traveler : access Traveler_Type) is      
  39.         entry Info(Traveler : out Traveler_Type);
  40.      end Travel_Type;
  41.      -- Un type qui pose du son.
  42.      
  43.      
  44.   end Musical_Theory;
  45.  
  46.  
  47.  
  48.   package body Musical_Theory is
  49.      
  50.      -- On génère le numérateur aléatoirement.
  51.      package Random_Num is
  52.         subtype Num_Type is Positive range 1..16;
  53.        
  54.         function Rand return Num_Type;
  55.      end Random_Num;
  56.            
  57.      
  58.      package body Random_Num is
  59.  
  60.         package Rand_Num is new Ada.Numerics.Discrete_Random(Num_Type);
  61.         use Rand_num;
  62.         Num_Gen : Generator;
  63.         function Rand return Num_Type is
  64.         begin
  65.            return Random(Num_Gen);
  66.         end Rand;
  67.      begin
  68.         Reset(Num_Gen);
  69.         -- pour faire une nouvelle party à chaque redémarrage.
  70.      end Random_Num;
  71.      
  72.      
  73.      use Interfaces.C;
  74.      --Les Message MIDI Sont Des Long.
  75.      
  76.      package Messages_Vectors is new Ada.Containers.Vectors(Positive,
  77.                                                             Long,
  78.                                                             "=" );
  79.      -- On utilise un vecteur de long pour stocker les messages pour chaque pas.
  80.      
  81.      use Messages_Vectors;
  82.      type Step_Seq_Type is array (Natural range <> ) of Vector;
  83.      -- Un type de tableau non contraint pour creer des mesure de num*den pas.
  84.      
  85.      type Step_Seq_Access is access all Step_Seq_Type;
  86.      -- Les pointeur sur les tableaux
  87.      
  88.      task body Travel_Type is      
  89.        
  90.        
  91.         Step_Seq : Step_Seq_Access;
  92.         -- Mon pointeur de tableau
  93.                
  94.         Message  : Long;
  95.         -- Un message.
  96.        
  97.      begin
  98.         Traveler.Date := Clock;
  99.         -- Je met la date à l'heure courante.
  100.        
  101.         loop
  102.            
  103.            Traveler.Quantum := Duration((60000.0/Traveler.Tempo)/Float(Traveler.Den)/1000.0);      
  104.            -- je calcul, la duréer d'un pas.
  105.            
  106.            -- Si c'est le moment je cré une nouvelle mesure.
  107.            if Traveler.Bar_Beat mod (Traveler.Den*Traveler.Num) = 0 then
  108.               Traveler.Num := Random_Num.Rand;                          
  109.               -- Je tire un nouveau numérateur.
  110.              
  111.               Step_Seq := new Step_Seq_Type(0..Traveler.Num*Traveler.Den-1);                  
  112.               -- J'initialise mon pointeur avec un tableau à la nouvelle longueur de la mesure.
  113.              
  114.               for I in Step_Seq'Range loop              
  115.                  if i mod Traveler.Den = 0 then
  116.                    
  117.                     Step_Seq(I) :=
  118.                       Step_Seq(I) & 0;
  119.                  end if;      
  120.               end loop;
  121.               -- J'écris boom a chaque temps.
  122.              
  123.            end if;
  124.            loop
  125.               select
  126.                  
  127.                  accept Info(Traveler : out Traveler_Type) do
  128.                     Traveler := Travel_Type.Traveler.all;
  129.                  end Info;
  130.               or
  131.                  delay until Traveler.Date + Traveler.Quantum;
  132.                  exit;      
  133.                  -- Je patiente jusqu'à la fin du pas.
  134.               end select;
  135.            end loop;
  136.            Traveler.Date := Traveler.date + Traveler.Quantum;            
  137.            -- Je met le temps à jour.
  138.            
  139.            
  140.            if not Is_Empty(Step_Seq(Traveler.Bar_Beat/Traveler.num mod Traveler.Den)) then
  141.              
  142.               for I in 1..Last_index(Step_Seq(Traveler.Bar_Beat/Traveler.num mod Traveler.Den)) loop
  143.                  
  144.                  Message := Element(Step_Seq(Traveler.Bar_Beat/Traveler.num mod Traveler.Den), I);
  145.                  
  146.                  if Message = 0 then
  147.      --Les Message MIDI Sont Des Long.
  148.      
  149.      package Messages_Vectors is new Ada.Containers.Vectors(Positive,
  150.                                                             Long,
  151.                                                             "=" );
  152.      -- On utilise un vecteur de long pour stocker les messages pour chaque pas.
  153.      
  154.      use Messages_Vectors;
  155.      type Step_Seq_Type is array (Natural range <> ) of Vector;
  156.      -- Un type de tableau non contraint pour creer des mesure de num*den pas.
  157.      
  158.      type Step_Seq_Access is access all Step_Seq_Type;
  159.      -- Les pointeur sur les tableaux
  160.      
  161.      task body Travel_Type is      
  162.        
  163.        
  164.         Step_Seq : Step_Seq_Access;
  165.         -- Mon pointeur de tableau
  166.                
  167.         Message  : Long;
  168.         -- Un message.
  169.        
  170.      begin
  171.         Traveler.Date := Clock;
  172.         -- Je met la date à l'heure courante.
  173.        
  174.         loop
  175.            
  176.            Traveler.Quantum := Duration((60000.0/Traveler.Tempo)/Float(Traveler.Den)/1000.0);      
  177.            -- je calcul, la duréer d'un pas.
  178.            
  179.            -- Si c'est le moment je cré une nouvelle mesure.
  180.            if Traveler.Bar_Beat mod (Traveler.Den*Traveler.Num) = 0 then
  181.               Traveler.Num := Random_Num.Rand;                          
  182.               -- Je tire un nouveau numérateur.
  183.              
  184.               Step_Seq := new Step_Seq_Type(0..Traveler.Num*Traveler.Den-1);                  
  185.               -- J'initialise mon pointeur avec un tableau à la nouvelle longueur des mesure.
  186.              
  187.               for I in Step_Seq'Range loop              
  188.                  if i mod Traveler.Den = 0 then
  189.                    
  190.                     Step_Seq(I) :=
  191.                       Step_Seq(I) & 0;
  192.                  end if;      
  193.               end loop;
  194.               -- J'écris boom a chaque temps.
  195.              
  196.            end if;
  197.            loop
  198.               select
  199.                  
  200.                  accept Info(Traveler : out Traveler_Type) do
  201.                     Traveler := Travel_Type.Traveler.all;
  202.                  end Info;
  203.               or
  204.                  delay until Traveler.Date + Traveler.Quantum;
  205.                  exit;      
  206.                  -- Je patiente jusqu'à la fin du pas.
  207.               end select;
  208.            end loop;
  209.            Traveler.Date := Traveler.date + Traveler.Quantum;            
  210.            -- Je met le temps à jour.
  211.            
  212.            
  213.            if not Is_Empty(Step_Seq(Traveler.Bar_Beat/Traveler.num mod Traveler.Den)) then
  214.              
  215.               for I in 1..Last_index(Step_Seq(Traveler.Bar_Beat/Traveler.num mod Traveler.Den)) loop
  216.                  
  217.                  Message := Element(Step_Seq(Traveler.Bar_Beat/Traveler.num mod Traveler.Den), I);
  218.                  
  219.                  if Message = 0 then
  220.                    
  221.                     Text_Io.Put_line(" ... Boom !" );
  222.                  end if;
  223.               end loop;
  224.              
  225.            end if;      
  226.            -- Je joue les boom.
  227.            
  228.            
  229.            Traveler.Bar_Beat := Traveler.Bar_Beat + 1;    
  230.            -- J'incremente la position.
  231.         end loop;
  232.      end Travel_Type;
  233.      
  234.   end Musical_Theory;
  235.  
  236.  
  237.  
  238.   Musical_Travel : Musical_Theory.Travel_Type(Musical_Theory.Default'access);
  239.   -- Un truc qui pose du son donc.
  240.  
  241.   use Musical_Theory;
  242.  
  243.  
  244.   Traveler : Traveler_Type;
  245.   -- L'Info local sur les variables qui nous permettent de poser du son.
  246.  
  247.   -- Après on s'informe sur le son posé.
  248.  
  249. begin  
  250.  
  251.   loop                  
  252.      
  253.      Musical_Travel.Info(Traveler);    
  254.      -- On récupère les infos.
  255.      
  256.      -- Et on affiche.
  257.      
  258.      Text_Io.Put(Character'Val(13)&"Sign:" );
  259.      Integer_Text_Io.Put(Traveler.Num, 2);
  260.      Text_Io.Put('/');
  261.      Integer_Text_Io.Put(Traveler.Den, 2);
  262.      Text_Io.Put(" ; Tempo:" );
  263.      Float_Text_Io.Put(Traveler.Tempo, 3,1 );
  264.      Text_Io.Put(" ; Bar beat:" &
  265.                    Natural'Image(Traveler.Bar_Beat/((Traveler.Den)*Traveler.Num)) &
  266.                    '.' & Natural'Image(Traveler.Bar_Beat/(Traveler.Den) mod Traveler.Num) &
  267.                    '.' & Natural'Image(Traveler.Bar_Beat mod (Traveler.Den)));
  268.      delay Traveler.Quantum;
  269.      -- On Patiente un instant en savourant la note.
  270.      
  271.   end loop;  
  272. end Main;


 
 
Merci pour le coup de main.


Message édité par Profil supprimé le 20-11-2012 à 10:31:58
Reply

Marsh Posté le 20-11-2012 à 09:57:25    

Ca y est j'ai trouvé. Dans le If not Is_Empty, faut écrire

Code :
  1. Traveler.Bar_Beat mod Step_Seq'length


 
Bon j'attends mon amis Simius pour qu'il valide mes compétences.  :heink:


Message édité par Profil supprimé le 20-11-2012 à 10:08:33
Reply

Marsh Posté le 20-11-2012 à 11:18:34    

Si tu obtiens ce que tu voulais, pas de souci. En fait si je devais créer un compositeur virtuel je pense que je m'affranchirais de la nomenclature musicale, en raisonnant juste sur des pulsations, le regroupement de ces pulsations en mesures, et le tempo définissant l'espace entre 2 pulsations (tempo qui peut être flottant si tu veux que ton programme fournisse une interprétation non-robotique). Ensuite les notes seront jouées sur des subdivisions paires ou impaires, avec une durée qui pourra déborder (exemple un coup de cymbale).. Mais bon courage pour obtenir un programme qui compose de façon cohérente, encore une fois c'est très ambitieux, on a déjà du mal à faire des logiciels d'écriture musicale capables de jouer les choses de façon un peu "humaine", alors si on ajoute l'aspect composition  :o


---------------
IWH  ---  Le forum de toute une génération : http://losersiv.1fr1.net (losers, sans-ami, dépressifs, allez on va faire cette merde)
Reply

Marsh Posté le 20-11-2012 à 11:26:12    

Si tu réussis à créer une vraie IA tu pourras lui payer des cours de musique par contre, en plus de lui apprendre à parler  :D


---------------
IWH  ---  Le forum de toute une génération : http://losersiv.1fr1.net (losers, sans-ami, dépressifs, allez on va faire cette merde)
Reply

Marsh Posté le 20-11-2012 à 12:08:35    

simius_computus a écrit :

Si tu obtiens ce que tu voulais, pas de souci.


 
 
Faut voir. En fait, j'ai ceci à l'affichage :
 

Sign: 6/ 8 ; Tempo:1.740E+02 ; Bar beat: 2. 1. 7


 
Avec 8 constant, j'ai un kick à chaque fois que le nombre du milieu de Bar_Beat change. Quelque soit le numérateur. je me demande si c'est normal...

Reply

Marsh Posté le 20-11-2012 à 13:55:59    

A quoi correspondent les chiffres de "Bar_Beat" ?


---------------
IWH  ---  Le forum de toute une génération : http://losersiv.1fr1.net (losers, sans-ami, dépressifs, allez on va faire cette merde)
Reply

Marsh Posté le 20-11-2012 à 14:11:12    

simius_computus a écrit :

A quoi correspondent les chiffres de "Bar_Beat" ?


En théorie....
Le premier chiffre c'est le numéro de mesure selon la signature courante.
Le second, c'est le temps dans la mesure
le dernier est le numéro de note dans un temps selon de dénominateur de la signature.
 
Je suis en train de tester une signature pouvant prendre 1..16/1...16 en tirant les deux aléatoirement. à chaque mesure. Ca donne pas mal.

Message cité 2 fois
Message édité par Profil supprimé le 20-11-2012 à 14:11:30
Reply

Marsh Posté le 22-11-2012 à 13:50:21    


 
 
 
Bon, ça va pas du tout ça.
 
Qui c'est qui m'aide ?
 
S'il vous plaît !


Message édité par Profil supprimé le 22-11-2012 à 13:50:44
Reply

Marsh Posté le 22-11-2012 à 18:03:25    


 
 
 
Je ne comprends pas bien ta définition des deux derniers chiffres.
Pour moi une mesure en 6/8 est une mesure à 6 "temps" (6 pulsations on va dire, le "temps" étant la définition de la durée d'une noire, or là ce sont 6 croches mais ça n'a d'importance que dans la notation musicale); Donc le "temps dans la mesure" ce serait la place de ta note dans la mesure, par exemple 4 pour une note placée pile au milieu.
 
"numéro de note dans un temps selon le dénominateur" je ne vois pas


---------------
IWH  ---  Le forum de toute une génération : http://losersiv.1fr1.net (losers, sans-ami, dépressifs, allez on va faire cette merde)
Reply

Marsh Posté le 22-11-2012 à 20:32:54    

simius_computus a écrit :


 
 
"numéro de note dans un temps selon le dénominateur" je ne vois pas


 
Merci simius déjà pour ça.
 
Je suis en train de prendre un exemple sur un soft existant.. Je crois qu'en fait, j'étais pas très loin de ce qui se fait.
 
Faut que je réfléchisse.
 

Reply

Marsh Posté le 22-11-2012 à 22:07:17    

Donc, merci encore Simius. je crois que je vois le bout de la fin.
Voici ce que j'ai fait avec Ada. Le but est d'afficher correctement les information de la division du temps en musique.
 
Un paquet déclarant les types de base.

Code :
  1. package Q is
  2.  
  3.  
  4.   pragma Pure(Q);
  5.  
  6.   type Tempo_Type is delta 0.1 digits 4 range 1.0..999.9;  
  7.   -- Le tempo entre 1 et 999.9 bpm
  8.  
  9.   subtype Num_Type is Positive range Positive'First..16;
  10.   -- Le numérateur de la signature rythmique.
  11.  
  12.   subtype Den_Type is Positive range 1..4;
  13.   -- Le facteur du dénominateur de la signature rythmique.
  14.   -- 1 pour 2
  15.   -- 2 pour 4
  16.   -- 3 pour 8
  17.   -- 4 pour 16.
  18.  
  19.   type Signature_Type is
  20.      record
  21.      Num     : Num_Type := Num_Type'First;
  22.      Den     : Den_Type := Den_Type'First;
  23.      end record;
  24.   -- Une signature rythmique
  25.  
  26.   subtype Step_Index_Type is Positive range Positive'First..Num_Type'Last*2**Den_Type'Last;
  27.   -- Un type pour indexer les pas d'une mesure.
  28.  
  29.   subtype Bar_Index_Type is Long_Long_Integer range 1..Long_Long_Integer'Last;        
  30.   -- Un type pour compter les mesures.
  31.  
  32. end Q;


 
Une paquet fournissant le type ad'hoc pour mesurer le temps.

Code :
  1. package Q.Transport is      
  2.  
  3.   type Transporter_Type is    
  4.      record
  5.      Tempo          : Tempo_Type      := Tempo_Type'First;
  6.      Signature      : Signature_Type  := (Num_Type'first, Den_Type'first);
  7.      Current_Step   : Step_Index_Type := Step_Index_Type'First;
  8.      Bar_Index      : Bar_Index_Type  := Bar_Index_Type'First;
  9.      end record;  
  10.   -- Un type qui regroupe les informations sur le transport.
  11.  
  12.  
  13.   function Quantum(Transporter : in Transporter_Type) return Duration;      
  14.   -- Renvoie la durée d'un pas.
  15.  
  16. end Q.Transport;


 
Le main qui affiche l'information sur le transport et incrémente celle ci au tempo correspondant.

Code :
  1. with Q, Q.Transport;
  2. use Q, Q.Transport;
  3.  
  4. with Text_Io;
  5. use Text_Io;
  6.  
  7. procedure Main is
  8.  
  9.  
  10.   Transporter : Transporter_Type := (120.0, (4, 2), 1, 1);  
  11. begin
  12.      
  13.   loop
  14.      
  15.      Text_Io.Put(Character'Val(13) &
  16.             "bar beat : " &
  17.             Long_Long_Integer'Image(Transporter.Bar_Index) & "." &
  18.             Integer'Image(Transporter.Current_Step/2**Transporter.Signature.Den mod Transporter.Signature.Num + 1) & "." &
  19.             Integer'Image(Transporter.Current_Step mod (16/(2**Transporter.Signature.Den)) + 1));
  20.      
  21.      if Transporter.Current_Step + 1 > Transporter.Signature.Num*2**Transporter.Signature.Den then
  22.     
  23.      Transporter.Bar_Index := Transporter.Bar_Index + 1;
  24.      Transporter.Current_Step := Step_Index_Type'First;
  25.      else
  26.      Transporter.Current_Step := Transporter.Current_Step + 1;
  27.      end if;
  28.      
  29.      delay Quantum(Transporter);            
  30.   end loop;
  31. end Main;

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed