[Ada] [Conception] Un compositeur interprète avec Ada.

Un compositeur interprète avec Ada. [Ada] [Conception] - Ada - Programmation

Marsh Posté le 09-08-2009 à 15:52:34    

Bonjour,
j'ai rien fais, parce que je reprend tout depuis le début.
 
Donc, je souhaite modéliser un compositeur interprète de musique avec Ada.
 
Seulement, malgré mon expérience de quelque 10 de programmes, je ne sais toujours pas programmer correctement. Je viens donc chercher conseil ou modèle pour ce nouveau projet.
 
Merci de votre contribution.


Message édité par The matrix le 13-08-2009 à 09:39:10

---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 09-08-2009 à 15:52:34   

Reply

Marsh Posté le 12-08-2009 à 20:49:49    

Bonjour,
En attendant d'avoir conseil, j'ai fait ceci.
@+


---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 13-08-2009 à 08:04:07    

Bonjour  :hello: , j'ai oublié de préciser que pour ce projet, je souhaite modéliser une solution orienté objet.
N'ayant suivit que 30minutes de cours sur le sujet, toute précisions sera la bienvenue.
J'utilise une bibliothèque MIDI, libportmidi, pour envoyer les messages MIDI aux instruments.
Je ne sais pourtant pas si une modélisation objet serait adapté à ce programme temps réel.
Par temps réel, j'entends un programme qui va suivre une horloge.
Merci pour votre contribution.  :jap:  
 
 


---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 13-08-2009 à 08:17:28    

Pour vous faire un topo... J'ai :
 
- un orchestre composé de :
  - N musicien(s)
  - N instrument(s)
 
- une œuvre composé de :
 - N partitions
 
- un compositeur qui
 - écrit les partitions (l'œuvre) sans fin et en continu.
 
- un chef d'orchestre qui
 - donne la mesure
 - démarre le concert
 - stop le concert
 - reprend le concert.
 


---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 13-08-2009 à 08:36:08    

Quelqu'un pour m'aider à établir le graphe de dépendance ?


---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 13-08-2009 à 08:42:11    

C'est pas très clair, ton histoire. Il y a des données quelque part ? Si oui elles sont modélisées comment ? Tes musiciens, ce sont des agents indépendants ? Tu veux faire quoi ? Modéliser un échange de messages entre le chef et les musiciens ?


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 13-08-2009 à 08:54:18    

el muchacho a écrit :

C'est pas très clair, ton histoire.


C'est la vue que j'ai d'un concert (symphonique)

el muchacho a écrit :


 Il y a des données quelque part ?


Bonne question, qu'entends-tu par donnée ?  
 

el muchacho a écrit :


Tes musiciens, ce sont des agents indépendants ?


Pas compris le sens de la question :/ Tu peux reformuler ?

el muchacho a écrit :


 Tu veux faire quoi ?  


Un concert.

el muchacho a écrit :


Modéliser un échange de messages entre le chef et les musiciens ?


Entre autre oui, mes musicien reçoive les partitions de du compositeur et le tempo ainsi qu'un "start" et "stop" du chef d'orchestre.
 
A priori, pour le moment.


---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 13-08-2009 à 11:17:07    

OK, j'avais pas vu ta référence à MIDI. En fait, tu veux coder un séquenceur MIDI. Tu aurais mis ça dès le départ, ça aurait été tout de suite plus clair. Je crains qu'on ne puisse pas te répondre correctement si on ne connait pas précisément la norme MIDI et si on n'a pas jeté un oeil à ta lib, parce que là on fait du temps réel dur (càd avec des délais fixes à ne pas dépasser). C'est pas incompatible avec de l'objet, mais il y a des impératifs de performance qui vont fortement influer sur l'architecture du programme. Donc ça va être un peu dur de répondre comme ça.
Mais si tu changes ton titre en "un séquenceur MIDI avec ADA", p-ê que ça peut intéresser des gens.


Message édité par el muchacho le 13-08-2009 à 11:18:00

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 13-08-2009 à 11:31:54    

Merci pour ta réponse el muchacho,
 
J'ai une grande interrogation sur l'avantage à tirer d'une modélisation orienté objet.
 
Par ailleurs, bien que mon programme soit constitué en partie comme un séquenceur, un point important est la partie composition. En effet, le programme est sensé composer la musique seul.
Donc, c'est plus qu'un séquenceur. Voilà pour le titre. Mais je vais découper le projet en deux, tu as raison, deux problème, - le séquenceur temps-réel et le compositeur.
Merci pour ton aide, ton attention...


---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 16-08-2009 à 08:53:46    

J'en suis là harmonie-0.0.1-0a.tar.gz,
 
README=Faites : "modeprobe snd_seq" dans la console root si nécessaire.
TODO="Hello !
make !
call harmonie !
initialize and run or load file betwen and try START and STOP or 'Esc' to return to main menu."
 
Je ne sais pas encore exactement comment je vais exploiter les ANN mais, j'ai mon idée.
Je même peut-être utiliser A* en combinaison.
 
J'ai trouvé une bibliothèque MIDI, MIDI.FILE , ada-midi, avec Ada, mais un soucis, pas moyen d'extraire directement le contenu d'un fichier. Obligé de le ré-écrire par une bidouille de l'implémentation de la bibliothèque.
Good luck !
 

Reply

Marsh Posté le 16-08-2009 à 08:53:46   

Reply

Marsh Posté le 18-08-2009 à 14:26:40    

Bonjour, voici l'évolution du développement ::= Harmonie-0.0.1-3a.tar.gz exploitant les réseaux de neurones artificiels.
Un fichier midi est fourni en exemple, Au clair de la lune  :D . Mais j'ai pas testé encore.  :whistle:  
 
Le code est pas terrible.. mais ça tourne. Et j'ai oublié de supprimer les infos de tracage. Masi toujours 'Esc' pour sortir. Enfin débrouillez-vous jusqu'à la prochaine version.  :D  
 
Bien sûr, si vous souhaitez participer ... n'hésitez pas !  :jap:  
 
Voilou !


---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 19-08-2009 à 11:16:08    

Salut,
 
Je comprends pas pourquoi j'ai 145 au lieu de 144 dans mon octet de Status.
Et j'ai l'impression que je parcoure plusieurs fois la même section du registre au décodage.
C'est plus qu'un impression, mais ça fais dix fois que je relis le code, je trouve pas.
 
Vous avez jeter un œil au code ? Qu'en pensez-vous ?


---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 20-08-2009 à 12:46:43    

Bonjour,  
 
Vous êtes quelque uns à vous intéresser au projet...Voici quelques corrections du paquet précédent ::= Harmonie-0.0.1-4a.tar.gz
 
Vous trouverais un fichier Hello.mid, le fichier avec lequel j'ai testé le programme qui génère un note-on suivie d'un note-off et ce en boucle. j'ai ajouter une note dans le fichier TODO, Les meta évènements ne sont pas gérés, et la gestion du temps n'est pas implémentée.
 
Merci à ceux qui me filent des coups de pouce pour réaliser ce programme.  :jap:  
 
Voilou !
 
Good luck !
 
 
Edit : j'ai encore oublié de supprimer les info de traçage et de décommenter quelque ligne dans la tache Harmonie dans midi_engine.adb !

Message cité 1 fois
Message édité par The matrix le 20-08-2009 à 13:02:41

---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 22-08-2009 à 15:25:48    

The matrix a écrit :

Bonjour,  
.../...
Vous êtes quelque uns à vous intéresser au projet...Voici quelques corrections du paquet précédent  
.../..
Edit : j'ai encore oublié de supprimer les info de traçage et de décommenter quelque ligne dans la tache Harmonie dans midi_engine.adb !


 
 
Ah non, cette fois j'ai tout mis propre !  :D  
 
Up et Link ::=  Harmonie-0.0.1-5b
 
N'hésitez pas...
 
 
What else? Merci, bien à vous !


Message édité par The matrix le 22-08-2009 à 15:28:15

---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 22-08-2009 à 17:58:06    

Re- !  
 
En attendant que je gère les méta évènements, il semble qu'un instruction "Buffer_Length := 0;" dans le case Meta de Section s'impose. C'est dans les ligne 610 du fichier midi_engine.adb , mais je suis tout décalé là.


Message édité par The matrix le 22-08-2009 à 17:58:51

---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 26-08-2009 à 18:09:12    

Bonjour,
je viens vous soumettre pour analyse un petit bout de code. Mon projet est copieux, je vais y allez petit à petit. Sans prétention, j'aimerai parvenir à écrire du code correct avec Ada, n'ayant suivi que 300 en gros de cours de prog  je ne sais pas si je suis bon.
 
Il s'agit du que du main file dans le lequel je réalise l'acquisition de paramètres nécessaire à l'exploitation de la suite du programme.
 
Pseudo-Code ::
 
Si aucun nom de fichier n'est fournit en ligne de commande, on lit le fichier par défault;
En cas d'exception, on saisie les données, puis selon l'utilisateur, on les enregistre.
Si non (si un  nom de fichier est founit), on lit le fichier dont le nom est donné en ligne de commande ;
En cas d'exception, on saisie les données, puis selon l'utilisateur, on les enregistre.
 
Pour le code, c'est un poil plus fastidieux :
 
Les boucle Prepare0 et Prepare1 sont strictement les même.
 

Code :
  1. --    Harmonie is an virtual music composer.
  2. --    Copyright (C) 2009 Manuel De Girardi
  3.  
  4. --    This program is free software: you can redistribute it and/or modify
  5. --    it under the terms of the GNU General Public License as published by
  6. --    the Free Software Foundation, either version 3 of the License, or
  7. --    (at your option) any later version.
  8.  
  9. --    This program is distributed in the hope that it will be useful,
  10. --    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. --    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. --    GNU General Public License for more details.
  13.  
  14. --    You should have received a copy of the GNU General Public License
  15. --    along with this program.  If not, see <http://www.gnu.org/licenses/>.
  16.  
  17.  
  18. -------------------------------------------------------------------------------
  19. -- Author      : Manuel De Girardi
  20. -- Date        : 2009/08/26
  21. -- Version     : 0.1.0-0a
  22. -- Description : Compositeur-intepreteur de musique automatique.
  23. -------------------------------------------------------------------------------
  24.  
  25. with Text_Io, Ada.Command_Line;
  26. use Text_Io, Ada.Command_Line;
  27. with Ada.Strings.Fixed;
  28. use Ada.Strings.Fixed;
  29.  
  30. with Portmidi;
  31. use Portmidi;
  32.  
  33. with Interfaces.C;
  34. use Interfaces.C;
  35.  
  36. procedure Main is
  37.  
  38.   subtype T_Channel is Natural range 0..15;
  39.  
  40.   Default : constant String := "orchester.txt";
  41.   File : File_Type;
  42.   type T_Info is
  43.      record
  44.         Global_Channel : T_Channel;
  45.         Device_Id : Natural;
  46.      end record;
  47.   type T_Tab_Pos is array (Positive range 1..256) of T_info;
  48.   Tab_Pos : T_Tab_Pos;
  49.   line : String(1..64);
  50.   Last,
  51.   Choice : Natural := 0;
  52.   Char : Character;
  53.   Name : T_ErrorText;
  54.   device : Positive := 1;
  55.   Channel : Natural;
  56.   The_Deviceinfo : DeviceInfo;
  57.  
  58.   use DeviceInfo_Conversion;
  59.   use ErrorText_Conversion;
  60.  
  61. begin
  62.  
  63.   if Argument_count = 0 then
  64.      begin
  65.         Open(File, In_File, Default);
  66.         while not End_Of_File(File) loop
  67.            Get_Line(File, Line, Last);
  68.            Tab_Pos(Device).Device_Id := Natural'Value(Line(1..Index(Line, "," )-1));
  69.            Tab_Pos(Device).Global_Channel := Natural'Value(Line(Index(Line, "," )+1..last));
  70.            Device := Device+1;
  71.         end loop;
  72.         Close(File);
  73.      exception
  74.         when Name_Error =>
  75.            begin
  76.           Prepare0:
  77.               loop
  78.                  Put_line("ID, Device Name" );
  79.                  for I in 0..Pm_CountDevices-1 loop
  80.                     The_DeviceInfo :=
  81.                       DeviceInfo_Conversion.To_pointer
  82.                       (Pm_GetDeviceInfo(I)).all;
  83.                     if The_Deviceinfo.Output = 1 then
  84.                        Name := To_Pointer(The_Deviceinfo.name).all;
  85.                        Put(Integer'Image(I));
  86.                        Put_line(", " & Interfaces.C.To_Ada(Name));
  87.                     end if;
  88.                  end loop;
  89.                  loop
  90.                     begin
  91.                        Put("Enter output device ID of instrument" & Integer'Image(Device) & " or 'Enter' to terminate : " );
  92.                        Get_line(line, Last);
  93.                        if Last /= 0 then
  94.                           Choice := Natural'Value(Line(1..Last));
  95.                        else
  96.                           exit Prepare0;
  97.                        end if;
  98.                        case Choice is
  99.                           when 0..255 =>
  100.                              Tab_Pos(Device).Device_Id := Choice;
  101.                              exit;
  102.                           when others =>
  103.                              New_Line;
  104.                        end case;
  105.                     exception
  106.                        when others =>
  107.                           Last := 0;
  108.                           Put("Press any key to continue" );
  109.                           Skip_Line;
  110.                           New_Line;
  111.                     end;
  112.                  end loop;
  113.                  loop
  114.                     begin
  115.                        Put("Enter global channel for device ID " &
  116.                            Integer'Image(Tab_Pos(Device).Device_Id) & ": " );
  117.                        Get_line(line, Last);
  118.                        if Last /= 0 then
  119.                           Channel := Natural'Value(Line(1..Last));
  120.                        else
  121.                           Channel := 0;
  122.                        end if;
  123.                        case Channel is
  124.                           when 0..15 =>
  125.                              Tab_Pos(Device).Global_Channel := T_Channel(Channel);
  126.                              Device := Device+1;
  127.                              exit;
  128.                           when others =>
  129.                              New_Line;
  130.                        end case;
  131.                     exception
  132.                        when others =>
  133.                           Last := 0;
  134.                           Put("Press any key to continue" );
  135.                           Skip_Line;
  136.                           New_Line;
  137.                     end;
  138.                  end loop;
  139.               end loop Prepare0;
  140.               if Device /= 0 then
  141.                  loop
  142.                     Put("Save configuration ? (y/n) : " );
  143.                     Get_Immediate(Char);
  144.                     case Char is
  145.                        when 'Y' | 'y' =>
  146.                           loop
  147.                              begin
  148.                                 New_Line;
  149.                                 Put("Enter filename (Default=""orchester.txt"" ) : " );
  150.                                 Get_Line(Line, Last);
  151.                                 if Last /= 0 then
  152.                                    Create(File, Out_File, Line(1..Last));
  153.                                 else
  154.                                    Create(File, Out_File, Default);
  155.                                 end if;
  156.                                 for I in 1..Device-1 loop
  157.                                    Put_line(File, Integer'Image(Tab_Pos(I).Device_Id) &
  158.                                             ',' &
  159.                                             Integer'Image(Tab_Pos(I).Global_Channel));
  160.                                 end loop;
  161.                                 Close(File);
  162.                                 exit;
  163.                              exception
  164.                                 when Name_Error =>
  165.                                    Put_line("Filename is too long!" );
  166.                              end;
  167.                           end loop;
  168.                           exit;
  169.                        when 'N' | 'n' =>
  170.                           exit;
  171.                        when others =>
  172.                           New_Line;
  173.                     end case;
  174.                  end loop;
  175.               end if;
  176.            end;
  177.      end;
  178.   else
  179.      begin
  180.         Open(File, In_File, Argument(1));
  181.         while not End_Of_File(File) loop
  182.            Get_Line(File, Line, Last);
  183.            Tab_Pos(Device).Device_Id := Natural'Value(Line(1..Index(Line, "," )-1));
  184.            Tab_Pos(Device).Global_channel := Natural'Value(Line(Index(Line, "," )+1..last));
  185.            Device := Device+1;
  186.         end loop;
  187.         Close(File);
  188.  
  189.      exception
  190.         when Name_Error =>
  191.            begin
  192.           Prepare1:
  193.               loop
  194.                  Put_line("ID, Device Name" );
  195.                  for I in 0..Pm_CountDevices-1 loop
  196.                     The_DeviceInfo :=
  197.                       DeviceInfo_Conversion.To_pointer
  198.                       (Pm_GetDeviceInfo(I)).all;
  199.                     if The_Deviceinfo.Output = 1 then
  200.                        Name := To_Pointer(The_Deviceinfo.name).all;
  201.                        Put(Integer'Image(I));
  202.                        Put_line(", " & Interfaces.C.To_Ada(Name));
  203.                     end if;
  204.                  end loop;
  205.                  loop
  206.                     begin
  207.                        Put("Enter output device ID of instrument" & Integer'Image(Device) & " or 'Enter' to terminate : " );
  208.                        Get_line(line, Last);
  209.                        if Last /= 0 then
  210.                           Choice := Natural'Value(Line(1..Last));
  211.                        else
  212.                           exit Prepare1;
  213.                        end if;
  214.                        case Choice is
  215.                           when 0..255 =>
  216.                              Tab_Pos(Device).Device_Id := Choice;
  217.                              exit;
  218.                           when others =>
  219.                              New_Line;
  220.                        end case;
  221.                     exception
  222.                        when others =>
  223.                           Last := 0;
  224.                           Put("Press any key to continue" );
  225.                           Skip_Line;
  226.                           New_Line;
  227.                     end;
  228.                  end loop;
  229.                  loop
  230.                     begin
  231.                        Put("Enter global channel for device ID " &
  232.                            Integer'Image(Tab_Pos(Device).Device_Id) & ": " );
  233.                        Get_line(line, Last);
  234.                        if Last /= 0 then
  235.                           Channel := Natural'Value(Line(1..Last));
  236.                        else
  237.                           Channel := 0;
  238.                        end if;
  239.                        case Channel is
  240.                           when 0..15 =>
  241.                              Tab_Pos(Device).Global_Channel := T_Channel(Channel);
  242.                              Device := Device+1;
  243.                              exit;
  244.                           when others =>
  245.                              New_Line;
  246.                        end case;
  247.                     exception
  248.                        when others =>
  249.                           Last := 0;
  250.                           Put("Press any key to continue" );
  251.                           Skip_Line;
  252.                           New_Line;
  253.                     end;
  254.                  end loop;
  255.               end loop Prepare1;
  256.               if Device /= 0 then
  257.                  loop
  258.                     Put("Save configuration ? (y/n) : " );
  259.                     Get_Immediate(Char);
  260.                     case Char is
  261.                        when 'Y' | 'y' =>
  262.                           loop
  263.                              begin
  264.                                 New_Line;
  265.                                 Put("Enter filename (Default=""orchester.txt"" ) : " );
  266.                                 Get_Line(Line, Last);
  267.                                 if Last /= 0 then
  268.                                    Create(File, Out_File, Line(1..Last));
  269.                                 else
  270.                                    Create(File, Out_File, Default);
  271.                                 end if;
  272.                                 for I in 1..Device-1 loop
  273.                                    Put_line(File, Integer'Image(Tab_Pos(I).Device_Id) &
  274.                                             ',' &
  275.                                             Integer'Image(Tab_Pos(I).Global_Channel));
  276.                                 end loop;
  277.                                 Close(File);
  278.                                 exit;
  279.                              exception
  280.                                 when Name_Error =>
  281.                                    Put_line("Filename is too long!" );
  282.                              end;
  283.                           end loop;
  284.                           exit;
  285.                        when 'N' | 'n' =>
  286.                           exit;
  287.                        when others =>
  288.                           New_Line;
  289.                     end case;
  290.                  end loop;
  291.               end if;
  292.            end;
  293.  
  294.      end;
  295.   end if;
  296.  
  297. end Main;


 
Voilà, manque t-il quelque chose ?
S'il vos plaît, merci, bien à vous.


---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 16-09-2009 à 21:33:22    

Bonjour,
 
Je viens poster les dernière sources du projet,
 
Alors, je ne peux pas bien tester les dernière fonctionnalités...Car je n'ai pas de clavier et en plus je ne sais pas en jouer, enfin bon, j'aurais pu mieux faire.... Donc, j'ai pas tester si l'interaction entre le jeu au clavier et le jeu de l'ordinateur étaient équilibré... Car les dernière modif, justement, c'est la lecture du jeu au clavier. Ca passe dans un réseaux de neurones et c'est sensé modifier le jeu de l'ordinateur.
 
Voila. Et le lien Harmonie-1.1.0.7a pour Gnu/linux, nécessité la lib portmidi0-dev


Message édité par The matrix le 16-09-2009 à 21:34:04

---------------
des gestes simples et ponctués, par quelques points presque importants, la précision coordonnée, d'une île déserte, des plans secrets, d'un architecte, à la retraite, passionné par son métier, refaire le monde, à son idée, tracer des routes, les emprunter
Reply

Marsh Posté le 16-10-2012 à 17:53:58    

Hey !
 
 
Salutations à tous les accro de technologie, pour vous satisfaire sur ce sujet, j'ai un peu de code.  :D  
 
Mais là n'est pas la question, ce que je veux ces comparer le les codes d'année en année.
 
Voici comment je génère mes drums aujourd'hui !
 
 

Code :
  1. with Alchemist.Midi.Implementation;
  2. use Alchemist.Midi.Implementation;
  3. with Alchemist.Midi.Sheduler;
  4. with Calendar;
  5. use Calendar;
  6. generic
  7.   Channel : Channel_Type;
  8.   with package Sheduler is new Alchemist.Midi.Sheduler(<> );
  9. package Alchemist.Drums_Producer is
  10.  
  11.   task Drums_Process is
  12.      entry Initialize;
  13.      entry Start(Date : in Time; Tempo : in Float);
  14.      entry Stop;
  15.      entry Halt;
  16.   end Drums_Process;
  17.  
  18. end Alchemist.Drums_Producer;


 

Code :
  1. with Text_Io;
  2.  
  3. with Interfaces.C;
  4.  
  5. with Ada.Numerics.Discrete_Random;
  6.  
  7. package body Alchemist.Drums_Producer is  
  8.  
  9.   use Interfaces;                  
  10.            
  11.   use Sheduler, Sheduler.Messages_vectors;                                      
  12.  
  13.  
  14.  
  15.  
  16.   type Step_Seq_Type is array (Positive range <> ) of Vector;
  17.  
  18.   type Step_Seq_Access is access Step_Seq_Type;
  19.  
  20.   type Part_Type is array (Positive range <> ) of Step_Seq_Access;
  21.  
  22.  
  23.   Empty : Step_Seq_Access := new Step_Seq_Type ' (Empty_Vector,
  24.                           Empty_Vector,
  25.                           Empty_Vector,
  26.                            Empty_Vector,
  27.                            Empty_Vector,
  28.                           Empty_Vector,
  29.                           Empty_Vector,
  30.                            Empty_Vector,
  31.                            Empty_Vector,
  32.                           Empty_Vector,
  33.                           Empty_Vector,
  34.                            Empty_Vector,
  35.                            Empty_Vector,
  36.                           Empty_Vector,
  37.                           Empty_Vector,
  38.                           Empty_Vector);
  39.  
  40.   Foot : Step_Seq_Access := new Step_Seq_Type ' (Empty_Vector & Note_On(Channel, 36, 100),                          
  41.                           Empty_Vector & Note_Off(Channel, 36),
  42.                           Empty_Vector,
  43.                           Empty_Vector,
  44.                           Empty_Vector,
  45.                           Empty_Vector,
  46.                           Empty_Vector,
  47.                           Empty_Vector,
  48.                           Empty_Vector & Note_On(Channel, 36, 100),
  49.                           Empty_Vector & Note_Off(Channel, 36),
  50.                           Empty_Vector,
  51.                           Empty_Vector,
  52.                           Empty_Vector,
  53.                           Empty_Vector,
  54.                           Empty_Vector,
  55.                           Empty_Vector);
  56.  
  57.   hats : Step_Seq_Access := new Step_Seq_Type ' (Empty_Vector & Note_On(Channel, 36, 100),                          
  58.                           Empty_Vector & Note_Off(Channel, 36),
  59.                           Empty_Vector,
  60.                           Empty_Vector,
  61.                           Empty_Vector & Note_On(Channel, 46, 100),
  62.                           Empty_Vector & Note_Off(Channel, 46),
  63.                           Empty_Vector,
  64.                           Empty_Vector,
  65.                           Empty_Vector & Note_On(Channel, 36, 100),
  66.                           Empty_Vector & Note_Off(Channel, 36),
  67.                           Empty_Vector,
  68.                           Empty_Vector,
  69.                           Empty_Vector & Note_On(Channel, 46, 100),
  70.                           Empty_Vector & Note_Off(Channel, 46),
  71.                           Empty_Vector,
  72.                           Empty_Vector);
  73.  
  74.   Hats2 : Step_Seq_Access := new Step_Seq_Type ' (Empty_Vector & Note_On(Channel, 36, 100) & Note_On(Channel, 44, 100),                  
  75.                            Empty_Vector & Note_Off(Channel, 36)  & Note_Off(Channel, 44),
  76.                            Empty_Vector,
  77.                            Empty_Vector,
  78.                            Empty_Vector & Note_On(Channel, 46, 100)  & Note_On(Channel, 44, 100),
  79.                            Empty_Vector & Note_Off(Channel, 46)  & Note_Off(Channel, 44),
  80.                            Empty_Vector & Note_On(Channel, 44, 100),
  81.                            Empty_Vector & Note_Off(Channel, 44),
  82.                            Empty_Vector & Note_On(Channel, 36, 100) & Note_On(Channel, 44, 100),
  83.                            Empty_Vector & Note_Off(Channel, 36)  & Note_Off(Channel, 44),
  84.                            Empty_Vector,
  85.                            Empty_Vector,
  86.                            Empty_Vector & Note_On(Channel, 46, 100)  & Note_On(Channel, 44, 100),
  87.                            Empty_Vector & Note_Off(Channel, 46) & Note_Off(Channel, 44),
  88.                            Empty_Vector & Note_On(Channel, 44, 100),
  89.                            Empty_Vector & Note_Off(Channel, 44));
  90.  
  91.  
  92.  
  93.  
  94.   Break_Foot : Step_Seq_Access := new Step_Seq_Type ' (Empty_Vector & Note_On(Channel, 44, 100),                  
  95.                             Empty_Vector,
  96.                             Empty_Vector,
  97.                             Empty_Vector,
  98.                             Empty_Vector & Note_On(Channel, 46, 100)  & Note_On(Channel, 44, 100),
  99.                             Empty_Vector,
  100.                             Empty_Vector & Note_On(Channel, 44, 100),
  101.                             Empty_Vector,
  102.                             Empty_Vector & Note_On(Channel, 44, 100),
  103.                             Empty_Vector,
  104.                             Empty_Vector,
  105.                             Empty_Vector,
  106.                             Empty_Vector & Note_On(Channel, 46, 100)  & Note_On(Channel, 44, 100),
  107.                             Empty_Vector,
  108.                             Empty_Vector & Note_On(Channel, 44, 100),
  109.                             Empty_Vector);
  110.  
  111.   Break_End : Step_Seq_Access := new Step_Seq_Type ' (Empty_Vector & Note_On(Channel, 44, 100) & Note_On(Channel, 36, 100),                  
  112.                                Empty_Vector,
  113.                                Empty_Vector,
  114.                                Empty_Vector,
  115.                                Empty_Vector & Note_On(Channel, 46, 100)  & Note_On(Channel, 44, 100),
  116.                                Empty_Vector,
  117.                                Empty_Vector & Note_On(Channel, 44, 100),
  118.                                Empty_Vector,
  119.                                Empty_Vector & Note_On(Channel, 44, 100) & Note_On(Channel, 36, 100),
  120.                                Empty_Vector,
  121.                                Empty_Vector,
  122.                                Empty_Vector,
  123.                                Empty_Vector & Note_On(Channel, 46, 100)  & Note_On(Channel, 44, 100) & Note_On(Channel, 36, 100),
  124.                                Empty_Vector,
  125.                                Empty_Vector & Note_On(Channel, 44, 100)  & Note_On(Channel, 36, 100),
  126.                                Empty_Vector);
  127.  
  128.  
  129.  
  130.  
  131.   Num_Part : constant Positive := Max_Step / 64;
  132.  
  133.   subtype Part_Index_Type is Positive range 1..Num_Part;
  134.      
  135.  
  136.  
  137.   Parts : Part_Type(Part_Index_type) := (1 => hats, 2 => foot, 3 => Break_Foot, 4 => Break_end, 5 => Break_Foot, 6 => foot, 7=> Empty, 8 => Break_End,
  138.                       9 .. 16 => Hats2,
  139.                       17 => Break_End, 18 => Empty, 19 => Foot, 20 => Empty, 21 => hats, 22 => Break_end, 23 => Empty, 24 => Hats2,  
  140.                         Others => hats2);        
  141.  
  142.  
  143.  
  144.  
  145.   function Step_Of(Step_Seq : in Step_Seq_Type; Step : in Step_Index_Type) return Vector is
  146.   begin
  147.      return Step_Seq(Step_Seq'First+( Step mod Step_Seq'Length));
  148.   end Step_Of;
  149.    
  150.  
  151.   package Part_Index_Rand is new Ada.Numerics.Discrete_Random(Part_Index_Type);
  152.   Part_Gen : Part_Index_Rand.Generator;
  153.  
  154.   task body Drums_Process is
  155.      End_Of_Task : Boolean := False;
  156.      Suspended   : Boolean := True;
  157.      Start_Time  : Time;
  158.      Quantum     : Duration;
  159.      
  160.      Current_Step: Step_Index_Type := 1;
  161.      The_Vector : Vector;
  162.      The_Tempo   : Float := 120.0;      
  163.      
  164.      
  165.   begin
  166.      Part_Index_Rand.Reset(Part_Gen);
  167.      accept Initialize do    
  168.      for I in Step_Index_Type loop                    
  169.         Sheduler_Process.Receive(Step_Of(Parts(Part_Index_Rand.Random(Part_Gen)).all, I), I);
  170.      end loop;
  171.      end Initialize;
  172.      
  173.      while not End_Of_Task loop
  174.      while Suspended loop
  175.         select
  176.            accept Start(Date : in Time; Tempo : in Float) do
  177.           Start_Time := Date;
  178.           Quantum :=  Duration(60000.0/Tempo/8.0/1000.0);
  179.           The_Tempo := Tempo;
  180.           Suspended := False;            
  181.            end Start;
  182.         or
  183.            accept Stop;
  184.         or
  185.            accept Halt do
  186.           End_Of_Task := True;
  187.            end Halt;
  188.            exit;
  189.         end select;
  190.      end loop;
  191.      Sheduler_Process.Receive(Empty_Vector & Message(16#FA#, 0,0), Current_step);
  192.      while not Suspended loop
  193.         select
  194.            accept Start(Date : in Time; Tempo : in Float) do
  195.           Start_Time := Date;
  196.           Quantum :=  Duration(60000.0/Tempo/8.0/1000.0);
  197.           The_Tempo := Tempo;
  198.            end Start;
  199.         or
  200.            accept Stop do
  201.           Suspended := True;
  202.            end Stop;          
  203.         or
  204.            accept Halt do
  205.           End_Of_Task := True;
  206.            end Halt;
  207.            exit;
  208.         or
  209.            delay until Start_Time;
  210.            Start_Time := Start_Time + Quantum;
  211.            Clear(The_Vector);
  212.           
  213.            The_Vector := Step_Of(Parts(Part_Index_Rand.Random(Part_Gen)).all, Current_Step);
  214.           
  215.            Sheduler_Process.Receive(The_Vector, Current_step);
  216.           
  217.            if Current_Step + 1 > Step_Index_Type'Last-1 then
  218.           Current_Step := 1;
  219.            else
  220.           Current_Step := Current_Step + 1;
  221.           
  222.            end if;
  223.           
  224.           
  225.           
  226.           
  227.         end select;
  228.      end loop;
  229.      end loop;
  230.   end Drums_Process;
  231.  
  232. end Alchemist.Drums_Producer;


 
 
J'accorde  5 à 10 degrés d'efficacité à cette méthode.
 
Ce que je veux c'est comparer les code avec ce de demain ou de dans dix ans.
En même temps si vous avez un avis sur la question... Bienvenue.


Message édité par Profil supprimé le 16-10-2012 à 17:58:14
Reply

Sujets relatifs:

Leave a Replay

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