Quel(s) objet(s) pour un compositeur virtuel pour instrument MIDI

Quel(s) objet(s) pour un compositeur virtuel pour instrument MIDI - Ada - Programmation

Marsh Posté le 15-02-2012 à 17:28:41    

Bonjour,
J'ai la technique mais j'ai pas l'esprit à la synthèse.
Je cherche comment modéliser un objet dont j'ignore tout à priori.
C'est un hybride de théorie musical et processus informatiques temps réel.
Je ne parviens pas à savoir ce que je doit faire.
J'ai déjà fait trois programmes sur le sujet.
Possible d'avoir un coup de main pour l'analyse ?
 
 
\Mode express
 
Je viens de partir sur une idée, voilà déjà une orientation....
 
J'ai fait une unité générique avec un paramètre générique "max_polyphony", le maximum de note maintenu en même temps.
Et j'ai définit un type "Polyphonique_Type" de type tableau de taille "max_polyphony". Et je sais maintenant que je cherche l'objet à mettre dans ce tableau. A peu près.  :D  
C'est un hybride entre un message event et peut-être une entrée dans un fichier pour lecture de mémoire. J'en sais rien.  :heink:  
 
Une idée ?

Message cité 1 fois
Message édité par Profil supprimé le 23-02-2012 à 12:44:40
Reply

Marsh Posté le 15-02-2012 à 17:28:41   

Reply

Marsh Posté le 15-02-2012 à 19:46:56    

Ah, j'ai une intuition, faut que je vous la donne.
 
En fait, ce que je doit modéliser, ce sont les instrument que je vais utiliser.
Par exemple, perso, j'ai un synthétiseur avec 2 oscillateurs+noise generator j'ai 9 wave forme sur l'oscillateur 1 etc...
Comme un drivers..., non ?

Reply

Marsh Posté le 16-02-2012 à 21:14:10    

Bonjour,
 
Peut-être regarder des solutions existantes comme CSound ou SuperCollider.
 
Cordialement,
MaxS

Reply

Marsh Posté le 18-02-2012 à 08:55:41    

Monjour, bonjour MaxS,
Pour te répondre tout de suite MaxS, après avoir jeté un petit coup d'oeil sur ce que pourraient être ces deux machins, je n'ai pas l'intention d'utiliser autre chose que le langage Ada avec trois petits bouts de C. Mais de toute manière, je ne pense pas qu'un programme comme celui que je vais probablement produire existe déjà. D'ailleurs, je ne sais pas encore lequel.
 
L'objectif est de produire un programme sachant composer et jouer la musique sur un instrument MIDI pour une durée indéterminée.
 
Ce que je cherche ici, c'est l'objet central du système, après je ferai mon travail.
 
Cet objet serait composé d'une vue de l'instrument (ici les Instruments MIDI), et d'une "tendance musicale" à jouer, mais c'est la que je pêche un peu. La tendance musicale, c'est très abstrait pour moi, parce qu'après il faut produire un système de production musicale à "tendance musical" et un système de production de tendance musicale. (Parce que je peux pas la donner pour une fois.)
 
Bon, y a deux minutes ça me paraissait très simple, et pis, ça devient plus compliqué... Bref.
Réutiliser c'est bien, mais qu'est que vous diriez si a chaque fois que vous proposiez de construire un nouveau truc on vous répondait "mais pour quoi t'utilises pas ça ?" C'est qui l'artiste ? [:dawa]


Message édité par Profil supprimé le 18-02-2012 à 22:08:58
Reply

Marsh Posté le 22-02-2012 à 11:24:17    


Arf, je m'en sort pas.
Bad code en fait.
 
 
j'arrive pas à savoir "quoi dépend de quoi".
 
En gros j'ai des pilote pour les entrées, des pilote pour les sorties, un sequenceur, et un compositeur.
 
Le séquenceur (task) doit avoir des entrées (entry) pour la lecture et l'écriture distinctes pour les entrées et les sortie.
 
J'arrive pas à déterminer qui va lire quoi.
 

Reply

Marsh Posté le 22-02-2012 à 17:53:56    

Si ce que tu veux faire, c'est un programme qui crée de la musique à partir de certains paramètres comme le nb max de notes jouées en même temps, le tempo, le style musical, ça existe déjà ;)
 
Et bien souvent, on trouve des algos génétiques dans ce type de création (par ex, avec des colonies de fourmis). En 2002, j'avais un  copain qui ont fait un programme de "fourmis musicales"...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 22-02-2012 à 18:03:41    

Bonjour rufo.
Ouais, je me doute bien que je suis pas le premier à penser à ça.
 
J'en suis pas encore à l'implémentation du compositeur, mais j'ai entendu ailleurs que la génétique pouvait être intéressante.
 
Là, je me prend la tête pour organiser mon séquenceur avec les accès au entrées et sorties MIDI.

Reply

Marsh Posté le 30-12-2012 à 02:09:19    

Bonjour,
 
je viens mettre à jour le sujet avec de nouveaux éléments pour construire mes objets musicaux.
 
J'écris actuellement un programme qui doit au final générer diverses formes de musiques selon trois modes de composition.
 
J'ai d'abord définit les modes : naturel, fusion, fission
En suite les formes : classique, jazz, electro, techno, acid, etc...
Une liste de type d'instrument comme : drums, lead, bass, clavier soft, clavier hard... etc.
 
avec ça je veux pouvoir piloter un synthétiseur multi-timbre.
 
Pour le moment, j'ai définit quelques types.
 

Code :
  1. with Midi_Theory;
  2.  
  3. package Phoebus is
  4.  
  5.   use Midi_Theory;
  6.  
  7.   type Form_Type is (Null_Item,
  8.                      Classical, Electro, Jazz,
  9.                      Acid, Techno, Hardtech, Tribe,
  10.                      Hardcore, Trance, Minimal, DnB);
  11.   Default_Form : constant Form_Type := Null_Item;
  12.  
  13.   type Category_Type is (Off, Drums_Kit, Global,
  14.                          Bass, Lead, Synth_Hard, Synth_Soft,
  15.                          Motion, Strings_N_Pads, Keyboard, Guitare_N_Pluck,
  16.                          Bell_N_Decay, Hit_N_Drum, S_E, Arp_Seq,
  17.                          Split, Audio_In, Vocoder, User);
  18.  
  19.  
  20.   type Orchester_Type is array (Channel_Type) of Category_Type;
  21.  
  22.   type Program_Type is
  23.      record
  24.         Form      : Form_Type := Null_Item;
  25.         Orchester : Orchester_Type := (others =>  off);
  26.      end record;
  27.  
  28.   Null_Program : constant Program_Type := (Null_Item, (others => Off));
  29.  
  30.   type Program_Access is access all Program_Type;
  31.  
  32.   type Bank_Type is array (Natural range <>, Natural range <>, Natural range <> ) of Program_Access;
  33.  
  34.  
  35.   function Initialize_From_File(Filename : in String) return Bank_Type;
  36.  
  37.   procedure Save_To_File(Filename : in String; Bank     : in Bank_Type);
  38.  
  39.  
  40.   subtype Num_Type is Positive range 1..16;
  41.   subtype Den_Type is Positive range 1..16;
  42.  
  43.   type Schema_Type is
  44.      record
  45.         Num : Num_Type := 4;
  46.         Den : Den_Type := 4;
  47.      end record;
  48.  
  49.   type Schemas_Type is array (Natural range <> ) of Schema_Type;
  50.  
  51.   type Mode_Type is (Nature, Fusion, Fission, Silence);
  52.  
  53.   type Tempo_Type is delta 0.1 range 1.0..999.9;
  54.  
  55.   subtype Bar_Index_Type is Long_Long_Integer range 1..Long_Long_Integer'Last;
  56.  
  57.   type Transport_Type(Schema_Max : Positive := 16) is
  58.      record
  59.         Tempo          : Tempo_Type      := 120.0;
  60.         Schema         : Schema_Type     := (4, 16);
  61.         Current_Step   : Natural         := 0;
  62.         Bar_Index      : Bar_Index_Type  := 1;
  63.      end record;
  64.   -- Un type qui regroupe les informations sur le transport.                                                                            
  65.  
  66.   type Transport_Access is access Transport_Type;
  67.  
  68.  
  69.   function Quantum(Transport : in Transport_Type) return Duration;
  70.   -- Renvoie la durée d'un pas.                                                                                                        
  71.  
  72.  
  73.  
  74.   type Part_Type(Mode : Mode_Type;
  75.                  last : Positive) is
  76.      record
  77.         Initial_Form : Form_Type := Default_Form;
  78.         Schemas      : Schemas_Type(0..last);
  79.         Tempo        : Tempo_Type := 120.0;
  80.         case Mode is
  81.            when Fusion | Fission =>
  82.               Terminal_Form : Form_Type := Default_Form;
  83.            when others =>
  84.               null;
  85.         end case;
  86.      end record;
  87.  
  88.   type Part_Access is access all Part_Type;
  89.  
  90.   Default_Part : constant Part_Access := new Part_Type ' (Silence, 1, Default_Form, (others => (4, 4)),  120.0);
  91. end Phoebus;


Message édité par Profil supprimé le 02-01-2013 à 09:59:05
Reply

Marsh Posté le 30-12-2012 à 17:04:30    

Qques references biblio:
Algorithmic Composition: Paradigms of Automated Music Generation - Gerhard Nierhaus - Springer (le contenu vaut pas le titre en fait)
The Rubato Composer Music Software: Component-Based Implementation of a Functorial Concept Architecture - Gérard Milmeister - Springer
Applications of Generative String-Substitution Systems in Computer Music - R L Dubois - Thèse Univ de Columbia
Composing Music with Computers - Eduardo Reck Miranda - Focal Press
 
A+,


Message édité par gilou le 31-12-2012 à 11:34:28

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 02-01-2013 à 09:27:32    

Bonjour,
 
Merci Gilou, et bienvenue sur le topic ; Je pige rien à l'english, c'est probablement dommage.
 
Après, avec les type définis ci-dessus je défini un nouveau type qui englobe les dit types.
 

Code :
  1. with Step_Sequences;
  2. package Phoebus.Bandmaster is
  3.  
  4.   use Step_Sequences;
  5.  
  6.   type Break_Type is (No_Break, Bass_Break, Break, Break_Down);
  7.  
  8.   type Master_Type is
  9.      record
  10.         The_Part         : Part_Access;
  11.         The_Transport    : Transport_Access;
  12.         The_Schema_Index : Natural := 0;
  13.         The_Program      : Program_Access;
  14.         The_Break        : Break_Type := No_Break;
  15.         The_Step_Seq     : Step_Seq_Access;
  16.      end record;
  17.  
  18.   procedure Masterize(Master : in out Master_Type);
  19.  
  20. end Phoebus.Bandmaster;


 
Et voilà, je dois produire la musique selon les paramètres de masterization.
 
Ca fait un paquet de paramètres à prendre en compte  [:sniperlk]  
 
A ceux-ci évidemment, je pense que vont s'ajouter encore d'autres paramètre en fonction des formes et des catégories des instruments joués.

Reply

Marsh Posté le 02-01-2013 à 09:27:32   

Reply

Marsh Posté le 02-01-2013 à 22:02:04    

Je vais plutôt faire un truc dans le genre :
 
 

Code :
  1. --
  2.   task type Composer_Type(Category : Category_Type) is
  3.  
  4.      entry Start(Quantum : in Duration);
  5.      entry Stop;
  6.      entry Halt;
  7.      entry Compose(Form     : in Form_Type;
  8.                    Channel  : in Channel_Type;
  9.                    Schema   : in Schema_type);
  10.      entry Receive(Buffer : in Buffer_Type);
  11.      entry Send(Step_Seq  : out Step_Seq_Access);
  12.   end Composer_Type;
  13.  
  14.   type Composer_Access is access Composer_Type;
  15.  
  16.   type Composers_Set_Type is array (Category_Type) of Composer_Access;


 
Parce que j'ai besoin d'interagir en temps réel avec le composer.

Reply

Marsh Posté le 07-02-2014 à 17:03:18    

Bonjour,
 
Je refais un compositeur virtuel, après Quatuor qui n'a pas fonctionné comme prévu.
Je ne vais pas faire plus simple, mais mieux.
Parce que c'est pas simple.
Je découpe à peine une dizaine de bibliothèques aujourd'hui. Il en manque probablement au moins autant.
Et justement, avez vous des idée avec l'inspiration du code ci-dessous :

Code :
  1. ----------------------------------------
  2. -- AcidPulse is Acid virtual composer.
  3. -- Copyright (C) 2014 Manuel De Girardi
  4. ----------------------------------------
  5. --                                    --
  6. --        *******************         --
  7. --        **               **         --
  8. --        **   AcidPulse   **         --
  9. --        **               **         --
  10. --        *******************         --
  11. --        **               **         --
  12. --        ** version 0.0.1 **         --
  13. --        **               **         --
  14. --        **  2014-02-07   **         --
  15. --        **               **         --
  16. --        *******************         --
  17. --                                    --
  18. ----------------------------------------
  19. -- Description : Compositeur virtuel.
  20. ----------------------------------------
  21. with Ap;
  22.  
  23. with Ap.System;
  24. with Ap.System.MIDI;
  25. with Ap.System.MIDI.Devices;
  26. with Ap.System.MIDI.Drivers;
  27. with Ap.System.MIDI.General_MIDI;
  28. with Ap.System.MIDI.General_MIDI.Generic_Instrument;
  29.  
  30. with Ap.Musical;
  31. with Ap.Musical.Theory;
  32. with Ap.Musical.Theory.Rhythm;
  33. with Ap.Musical.Theory.Melody;
  34. with Ap.Musical.Theory.Harmony;
  35.  
  36. procedure Acidpulse is
  37.        
  38. begin
  39.      
  40.   null;
  41. end Acidpulse;


Je cherche au moins les nom de deux hiérarchies de bibliothèques, une pour constituer un orchestre, et l'autre pour centraliser les flux et le pilotage.
Il manquera celle du/des compositeurs et peut-être celle de des interprètes.
Je me lance dans un truc bien chiadé, je pense.

Reply

Marsh Posté le 08-02-2014 à 19:01:12    

Bonjour,
 
Je répond à ma question précédente et je demande autre chose....
 
 
Voilà pour ce que j'ai fait :

Code :
  1. with Ap.AcidPulse.Generic_Pulser;
  2.  
  3. with AP.HMI.Xwindow;
  4.  
  5. with Gtk.Main;
  6.  
  7. procedure Acidpulse is
  8.  
  9.   package Pulser is new Ap.Acidpulse.Generic_Pulser;
  10. begin
  11.  
  12.   Pulser.Initialize;
  13.  
  14.   Gtk.Main.Init;
  15.  
  16.   declare
  17.  
  18.      package XAcidPulser is new Ap.HMI.Xwindow(Pulser);
  19.  
  20.      Xwindow : XAcidpulser.Xwindow_Type;
  21.   begin
  22.  
  23.      XAcidpulser.New_Xwindow(Xwindow);
  24.  
  25.      XAcidPulser.Initialize(Xwindow);
  26.  
  27.      Gtk.Main.Main;
  28.   end;
  29.  
  30. end Acidpulse;


 
Et j'ai gardé la liste de mon cédoupage précédant augmenté à tord ou à raison :

Code :
  1. with Ap;
  2.  
  3. with Ap.System;
  4. with Ap.System.MIDI;
  5. with Ap.System.MIDI.Devices;
  6. with Ap.System.MIDI.Drivers;
  7. with Ap.System.MIDI.General_MIDI;
  8. with Ap.System.MIDI.General_MIDI.Generic_Instrument;
  9.  
  10. with Ap.Musical;
  11. with Ap.Musical.Theory;
  12. with Ap.Musical.Theory.Rhythm;
  13. with Ap.Musical.Theory.Melody;
  14. with Ap.Musical.Theory.Harmony;
  15.  
  16. with Ap.Software;
  17. with Ap.Software.Common;
  18. with Ap.Software.Tools;
  19. with Ap.Software.Engineering; -- genetics&connexions
  20. with Ap.Software.Engines; -- Sequencers&transport
  21.  
  22. with Ap.Computing;
  23. with Ap.Computing.System;
  24. with Ap.Computing.Musical;
  25. with Ap.Computing.Software;
  26.  
  27. with Ap.Acidpulse.Orchester;
  28. with Ap.AcidPulse.Composer;
  29. with Ap.Acidpulse.Pulser;
  30.  
  31. with Ap.HMI;
  32. with Ap.HMI.System;
  33. with Ap.HMI.Software;
  34. with Ap.HMI.Musical;
  35.  
  36. with Ap.HMI.Xwindow;


 
 
Du coup je passe à l'étape suivante, l'interface graphique.
J'écris un compositeur virtuel qui envoie directement la partition aux périphériques, en temps réel.
Le compositeur au totalement automatique après paramétrage, le système MIDI restant pilotable, c'est à dire que l'utilisateur peu jouer en live en plus du compositeur.
 
je cherche comment présenter mon système à l'utilisateur, comment interfacer par logiciel mon système MIDI+Compositeur.
 
Pour le moment je vois grosso modo, soit une interface, je dirais cognitive avec une architecture complexe, soit un ensemble de tableaux avec des lignes et quelques paramètres ou informations par ligne sur le système, une architecture plus simple, peut-être moins jolie, mon ergonomique moins élégante.
 
J'aurais aimé avoir votre avis rapidement, si'l vous plaît ?
 
Fritures :
Paramétrage

  • utilisation d'un ou plusieurs instrument MIDI.
  • tempo moyen à observer.
  • durée de la boucle (fin de partition)
  • jouer en boucle.
  • les paramètre musicaux.


 
Contrôle

  • lecture d'un fichier de commandes globale.
  • lecture d'un fichier de commande pour un instrument.
  • déclaration/suppression d'un contrôleur à variation paramétrable supplémentaire.
  • déclaration/suppression d'une séquence de notes supplémentaire.


 
Merci pour votre aide.
 
C'est à dire que si je me dis que je présente tous par tableau, ça deviens plus simple, mais je vais probablement faire une bêtise.
non ?

Reply

Marsh Posté le 18-09-2014 à 23:19:21    

Bonjour,
 
 
je refais un compositeur virtuel pour instrument midi pour faire de l'acid music.
 
J'ai mon type de base qui sera manipuler partout dans mon programmme.
 
C'est un controleur ; un controleur pour le moment c'est un article paramétré de son numéro de contrôle contenant une valeur.
Typiquement avec 128 contrôleurs, on modélise un instrument midi.
 
Après je vais générer des variation de valeur de ces controleurs avec une machine que je souhaiterai modéliser avec un autre jeux de contrôleur que je présenterais enfin à l'utilisateur pour paramètrer le générateur.
 
Mais pour le moment je n'ai que quelques fonctions à associer à mes contrôleur.
 
Je me suis dis déjà que je présenterais un paramètre "Acidifier" valant de 0 à 127 pour obtenir le ph voulue.
Ce serait le paramètre de finalization du générateur.
En gros je compte composer une musique occidentale plus ou moins savante que je qualifirais de naturelle, et en suite je l'acifie.
 
Si ce modèle vous branche on peut en discuter peut-être pour enrichire nos connaissances.


---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
Reply

Sujets relatifs:

Leave a Replay

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