[Ada][GtkAda][MIDI][Virtual Composer] Plug-ins oriented-various based

Plug-ins oriented-various based [Ada][GtkAda][MIDI][Virtual Composer] - Ada - Programmation

Marsh Posté le 06-05-2015 à 12:02:23    

Bonjour,
Je souhaiterais avoir votre aide pour analyser un projet d'interface Homme / Machine pour Instruments MIDI.
 
Voici en image ce que je projette :
http://reho.st/preview/self/fcf50afb3e4056bbe2f639ef4fa5deb3b5ddb416.jpg
 
sous le nom V2Engine 2016 ce cache une liste de menu [Ficher, Edition, Créer, Affichage, Option, Aide]
En suite à gauche une vue des divers signaux écrient dans le séquenceur et exlusivement les message sur la canal global.
A droit, deux vues, instrument pour sélectionner les séquence à afficher par instrument et une vue par plug ins pour afficher les note par plug ins.
 
Enfin en bas de fenêtre les outils pour démarer arrêter le séquenceur et le séquenceur de modulation et afficher l'état du transport.
 
Je voudrais faire ça avec Ada et GtkAda sur Gnu/Linux. Mais loin de l'implémentation, ma question porte sur la manière d'approcher e probblème sachant que c'est du temps réel, qu'il y a des périphériques en oeuvre dont il faut gérer les port et les données en entrées et sortie, l'arrêt du programme.
 
Comment procèderiez vous avec Ada 95-2014 ?
Merci pour votre aide.


Message édité par par l'anneau de l'ia le 13-05-2015 à 14:02:17

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

Marsh Posté le 06-05-2015 à 12:02:23   

Reply

Marsh Posté le 06-05-2015 à 20:35:30    

Etude de l'existant :
 
 
D'abord j'ai un ou plusieurs ordianteur à ma disposition.
Ensuite j'ai un ou plusieurs instruments MIDI "  "  ".
Puis j'ai les surfaces de contrôle, qui peuvent être des instrument.
 
J'ai la norme MIDI.
 
En suite, je désire développer une douzaine de plug-ins qui doivent pouvoir interagir les un avec les autres tels que :

  • des séquenceurs de modulation qui permettent d'enregistrer des séquence de message MIDI.
  • des générateurs harmoniques basés sur les réseau de neurones artificiels en 2, 4, 6, 8 voies de polyphonie.
  • des générateurs rythmique "     "    "    "   "    "   "   "   "  "  en 2 4 6 8 mesures.
  • des générateurs génétiques.
  • de simple sous-séquenceur polyphonique et mono permettant d'écrire simplement des patterns
  • un générateur de tempo.
  • un arpéggiateur  
  • un programeur de timbre swap.
  • un programmeur de changement de programme.
  • un programmeur de message généraux Control Change.


  • peut-être un autre générateur programmable.


 
Je dois connecter les surfaces de contrôles aux entrées et les instrument aux sorties.
Je dois pouvoir assigner une surface maître pour certain plug-ins.
Voilà pour le moment j'ai ça.


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

Marsh Posté le 06-05-2015 à 22:13:38    

Bonsoir,
 
Je me demande si en faisant un truc du genre :
 

Code :
  1. --
  2. type Application_type(Devices_Max : Positive;
  3.                      Plugins_Max : Positive) is
  4.   record
  5.      Set_Of_Devices : Devices_Set(1..Devices_max);
  6.      -- tableau de référence aux instruments.
  7.  
  8.      Set_of_Plugins_list : Plugins_List_Set(Plugins_Max);
  9.      -- tablelau de liste de référence aux plugins.
  10.  
  11.      ...
  12.      -- Somes declarations.
  13.   end record;


 
Si je part d'un bon pieds ou si je me plante ?
 
A votre avis ?
 
Merci.


Message édité par par l'anneau de l'ia le 06-05-2015 à 22:15:38

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

Marsh Posté le 07-05-2015 à 06:59:04    

Bonjour,
 
 
Ou alors, donc, un truc genre :
 

Code :
  1. type Application is
  2.   record
  3.      User_Config_filename : access string := -- Typiquement home/USER/Applications/.conf
  4.      Current_file              : -- Nom du fichier courant + l'état du ficher/ application.
  5.   end record;


 
Ca pourrait peut-être le faire également, c'est pas la même chose, c'est peut-être mieux même.


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

Marsh Posté le 08-05-2015 à 00:30:38    

Code :
  1. MIDI Composer
  2.  
  3.  
  4. Dépedences
  5.  
  6.                Théorie
  7.                 /      \
  8.               v        v
  9.       Commandes       Instruments
  10.        /       \      /      \
  11.       v         v    v        v
  12. Messages      Périphériques       Auxiliaires
  13.       \       /       \      /
  14.        v     v         v    v
  15.        Commun          Système
  16.               \      /
  17.                v    v
  18.               Standard
  19.  
  20. Menus
  21.    Ficher : ouvrir, fermer, sauvegarder, nouveau, quitter.
  22.    
  23.  
  24.    Edition : insérer, supprimer.
  25.    
  26.  
  27.    Transport : Démarrer, arrêter, jouer, enregistrer, tempo, en_boucle, taille.
  28.    
  29.  
  30.    Options : format, timers, géométries de banques, tempo, catégories.
  31.    
  32.  
  33.    Aide : Man, howto, compile, install, about.
  34.    
  35.  
  36. Vues
  37.    supprimer, nouveau, type, nom, ID, Edit, Save, Load.
  38.  
  39. Flux
  40.    Sources, destinations, type, data1, data2, time.
  41.  
  42. Plug-ins
  43.  
  44.    Harmonie, Rythmie, Génétique, Program_Change, Timbre_Swap, breaks, signature, tempo,
  45.  
  46.    Sysex, sous_séquenceur, séquenceur_de_modulation, Arpeggiator, Programmable, I.A.


Message édité par par l'anneau de l'ia le 08-05-2015 à 00:33:57

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

Marsh Posté le 08-05-2015 à 00:59:17    

Bonsoir,
 
 
Mis a part le fait que j'ai passé un block note complet et 24 heures debout pour élaborer ce semblent de spécification qui d'ailleurs m'ont régalés, je vais poursuivre ma route, mais je souhaiterais avoir votre réaction.
 
 
On pale de MIDI, en fait on peut préfixer chacun des paquets de l'arbre de dépendance avec MIDI.
 
Après c'est la couche présentation des données.
 
 - Les menus en fait des raccourci sur des fonctions, permettant de modifier des paramètre d'exécution, de gérer le processus en temps réel, d'en modifier les données, de sauvegarder un projet ou en charger un existant, et d'accéder à la documentation.
 
 - Les vues, pareil, en fait des raccourci sur des fonctions, permettant de modifier des paramètre d'exécution, de gérer le processus en temps réel, d'en modifier les données, de sauvegarder un plug-ins ou une configuration de périphérique MIDI.
 
 - Les flux, l'information en temps réel selon la vue (périphériques ou plugins)
 
En suite on a une classe de plugins, permettant de générer et gérer un workflow musical avancé.
 
 
Il me reste un page, car j'ai écrit chaque page recto et les ai mis a la poubelle sauf une la dernière exactement le post précédent.
 
Bon après c'est mon onzième programme du genre quoi.
 
Merci pour votre participation.  :sol:


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

Marsh Posté le 08-05-2015 à 05:29:28    

Bonjour, du coup mon type application semble s'approcher de ça :

Code :
  1. type Application_Type is
  2.   record
  3.      flots --> (nil)
  4.      views --> (file)
  5.      menus --> (option)
  6.      class --> (Modify/Save/Quit).


 
On parle toujours de MIDI donc, .... Ben on modifie sauvegarde et on quitte des configuration de la classe MIDI.
Flots, c'est l'effet, soit néant.
views, c'est l'action de l'utilisateur sur la config.
menus, c'est l'action de l'utilisateur sur la classe.
class, ben c'est la norme M.I.D.I.


Message édité par par l'anneau de l'ia le 08-05-2015 à 05:58:33

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

Marsh Posté le 08-05-2015 à 10:04:31    

Bonjour, second jet.
 
 
J'en recolle un peut parce que la spécification a changée.
 
 
Utilisation :
 

Code :
  1. ----------------------------------------
  2. -- Ultrason is Virtual MIDI Composer. --
  3. ----------------------------------------
  4. -- Author      : The matrix.
  5. -- Date        : 2015-05-06.
  6. -- Version     : 2015-0.1.0.
  7. -- Description : Ultrason is small MIDI
  8. --               Virtual Composer.
  9. ----------------------------------------
  10. -- Depend of portmidi library.        --
  11. ----------------------------------------
  12.  
  13. with Ultrason;
  14. with Ada.Text_Io;
  15. use Ada;
  16. procedure Main is  
  17.        
  18.   package My_Song is new Ultrason(Plug_Max => 128, Category_Max => 16);
  19.  
  20.   use My_Song;
  21.        
  22.   Ultrason : Ultrason_Access;
  23.   Char   : Character;  
  24. begin
  25.  
  26.   loop
  27.      Modifier(Ultrason);
  28.      Saver(Ultrason);
  29.      Text_Io.Put("Press enter to abort !" );
  30.      Text_Io.Get_immediate(Char);
  31.      case Char is
  32.      when Character'Val(13)| Character'Val(10) =>
  33.         Quitter(Ultrason);
  34.         exit;
  35.      when others =>
  36.         null;      
  37.      end case;      
  38.   end loop;
  39. end Main;


 
 

Code :
  1. ----------------------------------------
  2. -- Depend of portmidi library.        --
  3. ----------------------------------------
  4. with Ada.Calendar;
  5. use Ada.Calendar;
  6. with Gtk;
  7. with Gtk.Window;
  8. use Gtk, Gtk.Window;
  9.  
  10. Generic
  11.   Plug_Max : Positive;
  12.   Category_Max : Positive;
  13. package Ultrason is  
  14.   type Ultrason_Record;
  15.   type Ultrason_Access is access all Ultrason_Record'Class;
  16.   type Theories_Type;
  17.   type Theories_Access is access all Theories_Type;
  18.   type Ultrason_Record is new Gtk_Window_Record with
  19.      record
  20.      Theory : Theories_Access;
  21.      end record;      
  22.   procedure Modifier(Ultrason : in out Ultrason_access);
  23.   -- Modifier for Plugins and options.
  24.  
  25.   procedure saver(Ultrason : in out Ultrason_access);
  26.   -- saver for plugin and option.
  27.  
  28.  
  29.   procedure Quitter(Ultrason : in out Ultrason_access);
  30.   --- abort process.  
  31.  
  32.   package MIDI is
  33.      
  34.      type Categories_Set is array (Positive range <> ) of access String;
  35.      
  36.      type Categories_Record is tagged
  37.      record
  38.         Categories : Categories_Set(1..Category_Max);
  39.         Last       : Natural := 0;
  40.      end record;
  41.      
  42.      type Categories_Access is access all Categories_Record'Class;
  43.      
  44.      type Timer_Record is
  45.      record
  46.         Date : Time := Clock;
  47.      end record;
  48.      type Timers_Access is access all Timer_Record;
  49.      type Banks_Geometry_Type is
  50.      record
  51.         MSB_Max : Integer := 0;
  52.         LSB_Max : Integer := 0;
  53.         MSB_Min : Integer := 0;
  54.         LSB_Min : Integer := 0;
  55.      end record;
  56.      
  57.      type MIDI_Options_record is tagged
  58.      record
  59.         Tempo : Float := 0.0;
  60.         Categories : Categories_Access;
  61.         In_Loop : Boolean := False;
  62.         Timers  : Timers_Access;
  63.         Format  : access String;
  64.         Bank_Geometry : Banks_Geometry_type;
  65.      end record;
  66.      type MIDI_Options is access MIDI_Options_Record;
  67.   end MIDI;
  68.  
  69.   use MIDI;
  70.  
  71.   type Plugin_Record is Abstract tagged null record;
  72.  
  73.   type Plugin_Access is access all Plugin_Record'Class;
  74.  
  75.   type Plugins_Set is array (Positive range <> ) of Plugin_Access;
  76.  
  77.   type Plugins_Access is access Plugins_Set(1..Plug_Max);
  78.  
  79.   type Theories_Type is
  80.      record
  81.     
  82.      -- null;
  83.      -- Flots
  84.     
  85.      File         : access String;
  86.      -- views
  87.     
  88.      Options      : MIDI_Options;
  89.      -- Menus         
  90.     
  91.      devices, Aux : Plugins_Access;
  92.      -- class
  93.      end record;        
  94. end Ultrason;


 
 
C'était pour le moment pas possible de faire comme prévu.
 
 
Pour la gestion du temps,
 
J'ai pensé simple, faire un type exhauster_type (elapsed, remaining) le "gap-buffer" sera entre les deux avant remaining ou après elepsed.
Et un double sequencer avec chacun l'état d'exhauster qu'il mérite.
Peut-être mettre un sémaphore avec chaque sequencer pour l'implementation.
 
 
 
juste pour l'exemple du hack à trouver ici pour que ça passe.
 
 
 
Implementation

Code :
  1. with Gtk.Handlers;
  2. with Gtk.Main;
  3.  
  4. package body Ultrason is  
  5.  
  6.   Theory : Theories_Access;
  7.  
  8.   procedure Modifier(Ultrason : in out Ultrason_Access) is
  9.      
  10.   begin
  11.      -- initialize Ultrason;
  12.      if Ultrason = null then
  13.      Ultrason := new Ultrason_Record;
  14.      Ultrason.Theory := new Theories_Type;
  15.      else
  16.      Ultrason.Theory := Theory;
  17.      end if;      
  18.      if Ultrason.Theory = null then
  19.      raise Program_Error;
  20.      end if;
  21.      Gtk.Main.Init;      
  22.      
  23.      initialize(Gtk_Window_record(Ultrason.all)'Access);
  24.      Gtk.Window.Show_All(Gtk_Window_record(Ultrason.all)'Access);
  25.      Gtk.Main.Main;
  26.      Theory := Ultrason.Theory;
  27.   end Modifier;      
  28.   -- Modifier for Plugins and options.
  29.      
  30.   procedure saver(Ultrason : in out Ultrason_Access) is
  31.   begin
  32.      null;
  33.   end Saver;
  34.   -- saver for plugin and option.
  35.  
  36.  
  37.   procedure Quitter(Ultrason : in out Ultrason_Access) is
  38.   begin
  39.      null;
  40.   end Quitter;
  41.   --- abort process.
  42.  
  43.  
  44. end Ultrason;


 
 
Notez l'attribut access pour récupérer le pointeur après conversion en local du type global.


Message édité par par l'anneau de l'ia le 08-05-2015 à 10:14:41

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

Marsh Posté le 10-05-2015 à 22:38:58    

Bonjour, ou bonsoir.
 
 
J'ai changer un peut les plans.
 
J'ai simplement garder un iniitialization de l'appli dans laquelle on fera saver et quitter.
 
En image j'en suis là !
 
http://reho.st/medium/self/8ae58bf165f7f64c1c392b1c61e497ec9e370cfa.jpg
 
Donc des menus faits avec UI_Manager
Des zone des données faites avec Tree_View sur GtkAda.
 
La question qui ce pose maintenant est : comment faire le reste.
Bon, heureusement j'y ai un peu réfléchis en concevant l'interface.
Mais je reste avide de votre connaissance et appréciation du concept.


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

Marsh Posté le 11-05-2015 à 20:10:40    

C'est rigolo.
 
 
 :lol:  
 
 
Je suis fier de mon bouzin, parce qu'il me plait bien.
Je me régale de l'analyse et de l'implémentation.
 
Allé encore un screenshot Ultrason 2015-0.2.4, puisque c'est le nom,
http://reho.st/preview/self/4c44d8d705122c1aebd0828080850c1368c3a483.jpg
 
 
Donc on note l'apparition d'une zone de transport, pour le transport général et les séquenceurs de modulations.
Et 5 zone blanche accueillant pour certain une heure sur 24 heures.
Celle à peut-près  au centre c'est la position courante, ... voir MIDI gap buffer.
 
Au dessus à droite, deux zone de données Devices et Plugns, permettant de nommer, catégoriser, trier par noms, les périphériques MIDI qui peuvent être des controlleurs des instruments, et les plugins.
 
Un boite à cocher pour chaque périphérique, c'est pas bien adapté, mais ça peut fonctionner.
 
Si vous cmpiler le programme.
 
Vous verrez, le temps peut passer très vite parfois  :whistle: .just click play !
 
Reste environs 17 plugins à développez qui après édition devraient pouvoir être sauvgardé et realouable.
 
Pour une fois, au bout de deux jour de taf, ou trois, j'ai pas l'impression d'une usine à gaz. C'est plus clair.
Bon j'ai 17 plug-ings, j'ai compté j'ai écris au moins 15 mouture de générateur, séquenceur, et autre joyeuseté.
Donc, à vue de neuz.
Un soft un plug-in à intégrer.
 
 :hello:


Message édité par par l'anneau de l'ia le 11-05-2015 à 20:12:18

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

Marsh Posté le 11-05-2015 à 20:10:40   

Reply

Marsh Posté le 13-05-2015 à 13:37:17    

Bonjour,
 
Je suis en cours d'analyse des fux de données résultantes et je souhaiterais avoir confirmation ou simplement votre avis.
 
Donc j'écris un compositeur virtuel pour instrument MIDI, on traite des messages MIDI dont les caractéristiques qui sont, la source la destination, le type de message un premier paramettre, un second et un compteur horaire, que l'on va afficher par selection de périphériques pouvant être des instruments, des cartes son, des controleur et des plug-ins à gauche dans la section Flow.
 
J'ai donc deux sources de donnée et deux destinations, les entrées utilisateur (via les instruments, les cartes son, les controleurs) et les entrée de plug-ins, les premier à destination des seconds et les seconds l'inverse.
 
J'ai fait un petit graphe c'est plus simple.
 
 
 
    --------   Plug-ins - output   -------- Device_Id                Devices - input    ------
    |                                                   v                                ^                    |
inter plug-ins                       partitions(Sequencers)----------------           inter-devices
    |                                                                                                          |
    ---------- Plug-ins - input <-------------Device_Id  <------     Devices - output -------
 
Donc, grâce à un identifiant de périphérique, je vais me semble t-il afficher les flux de la sortie de la partition qui sont les entrées des péripéhriques et le flux à la sortie des périphériques qui sont les entrées des plug-ins.
 
Plug-ins output et Devices input en fait !
 
inter-plugs-in et inter- devices pouront peut-être faire l'objet d'un autre traitement.
 
On va afficher potentiellement deux fois les message de modulation à destination du plug-in mod_sequenceur, et peut-ê d'autres mais c'est pas grave puisque c'est filtré par selection.
 
 
Donc, me plante- je ?
S'il ous plait !
Merci.
 
 
Correction, modification, coloriage, synthèse.
Re-Correction, re-modification, re-coloriage, synthèse. et l'antithèse alors !  :D  :D


Message édité par par l'anneau de l'ia le 13-05-2015 à 14:10:25

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

Marsh Posté le 13-05-2015 à 14:23:10    

l'embrouille !
 
Vous corrigerer, je fatigue. ! Désolé. :/


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

Marsh Posté le 15-05-2015 à 12:40:19    

Bonjour !
 
Ca commence à jetter !
 
C'est pas terminé, l'affichage coûte chère, je vais peut-être changer de stratégie.
En version 0.5.1, un plugin de teste envoie simplement un note on et note off dans le flow à afficher.
 
http://reho.st/medium/self/80a66012fb07907e78053d5e916aa7a56dd35994.jpg


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

Marsh Posté le 23-05-2015 à 02:27:57    

Bonjour,
 
Apparemment je suis très embêté.
Je dois développer 15 plug-ins répartis dans 5 catégories :
 
Classés par catégories :
 

[*]Chef d'orchestre ou band master
 
[*]Auto initialisation ou A.I. Self.
 
[*]Générateurs de notes ou Notes generators.
 
     [*] Algorithme génétique ;
     [*] Harmonique neurale ;
     [*] Melodique neurale ;
     [*] Rythmique neurale ;
     [*] Arpeggiator.
 
[*]Gestionnaires de périphérique
     [*] Echange de timbre ;
     [*] Changement de programme ;
     [*] Synchronisation d'horloge ;
     [*] Message Exclusif.
 
 
[*] Composants utilisateur
     [*] Programmable ;
     [*] Sequenceur de modulation ;
     [*] Step sequenceur Monophonique ;
     [*] Step sequenceur polyphonique.


 
Qui doivent permetre d'élaborer une architecture musicale agréable et variée en exploitant le maximum de paramètres.
 
Voici mon code avec Ada pour publier ici les paramètre que j'ai intégrés dans un paquetage unique regroupant quelque idées de mes pécédant programmes.
 

Code :
  1. with Ada.Calendar;
  2. use Ada.Calendar;
  3. with Ada.Calendar.Arithmetic;
  4. use Ada.Calendar.Arithmetic;
  5.  
  6. with Interfaces.C;
  7. use Interfaces;
  8.  
  9. with Ada.Containers.Vectors;
  10. use Ada.Containers;
  11.  
  12. generic
  13.   Device_Max : Positive := 128;
  14.   Laps_Time  : Day_Duration := 86400.0;  
  15. package Ultrason.Computing is
  16.  
  17.   subtype Laps_Type is Duration range 0.0..Laps_Time * 2.0-1.0;
  18.  
  19.   subtype Numerator_Type is Positive range 1..16;
  20.   subtype Denominator_Type is natural range 0..64;  
  21.  
  22.   type Signature_Type is
  23.      record
  24.      Time_Number   : Numerator_Type := 4;
  25.      Time_Unit     : Denominator_Type := 16;
  26.      end record;
  27.  
  28.   function image(Signature : in Signature_Type) return String;
  29.  
  30.   type Tempo_Type is delta 0.1 digits 4 range 1.0..999.9;
  31.  
  32.   Bar_Max : constant Long_Integer := Long_Integer'Last;
  33.  
  34.   type Bar_Index_Type is new Long_Integer range 1..Bar_max;
  35.  
  36.   type Bar_Beat_Type is
  37.      record
  38.      Bar       : Bar_Index_type      := 1;
  39.      Time      : Numerator_Type      := 1;
  40.      Step      : Denominator_type    := 1;
  41.      Fraction  : Natural             := 0;
  42.      end record;  
  43.   function image(Bar_Beat : in Bar_Beat_Type) return String;
  44.  
  45.  
  46.  
  47.  
  48.   Message_Max : constant Positive := 128;
  49.  
  50.   subtype Message_Index_Type is Positive range 1..Message_Max;
  51.  
  52.   package Step_Vectors is new Ada.Containers.Vectors(Message_Index_Type, C.Long, C."=" );
  53.  
  54.   subtype Step_Vector_Type is Step_Vectors.Vector;
  55.  
  56.   use Step_Vectors;
  57.  
  58.   type Step_Record is
  59.      record    
  60.      Tempo  : Tempo_Type := 120.0;
  61.      Hour   : Laps_Type := 0.0;
  62.      Step   : Step_Vector_Type := Empty_Vector;
  63.      end record;
  64.  
  65.   Null_Step : constant Step_Record := (120.0, 0.0, Empty_Vector);
  66.   type Step_Access is access all Step_Record;
  67.  
  68.   type Seq_Type;  
  69.  
  70.   type Seq_Access is access all Seq_Type;
  71.   type Seq_Type is
  72.      record
  73.      Step  : Step_Access;
  74.      Next  : Seq_Access;
  75.      Prev  : Seq_Access;
  76.      end record;
  77.  
  78.  
  79.   Right_Max : constant Seq_Access := new Seq_Type ' (Step => new Step_Record ' (120.0, Laps_Time-1.0, Empty_vector), Next => null, Prev => null);
  80.   Left_Max  : constant Seq_Access := new Seq_Type ' (Step => new Step_Record ' (120.0, Laps_Time-1.0, Empty_vector), Next => null, Prev => null);
  81.   Left_Min  : constant Seq_Access := new Seq_Type ' (Step => New Step_Record ' (120.0, 0.0, Empty_vector), Next => null, prev => null);
  82.  
  83.   type Sequence_Record is
  84.      record
  85.      First         : Seq_Access := Left_Min;
  86.      Last          : Seq_Access := Left_Min;
  87.      Current       : Seq_Access := null;
  88.      Left          : Seq_Access := Left_Min;
  89.      Right         : Seq_Access := null;    
  90.      Length : Natural := 0;
  91.      end record;
  92.   type Sequences_Set_Type is array (Positive range <> ) of access Sequence_Record;
  93.   type Partition_Record is
  94.      record
  95.      Sequences : Sequences_Set_Type(1..Device_Max);
  96.      end record;
  97.  
  98.  
  99.      -- Form index.
  100.   type Form_Index is new Natural range 0..15;
  101.  
  102.   -- The forms used on mixed forms.
  103.   type Forms_Names_Set_Type is array (Form_Index) of access String;
  104.  
  105.   Forms_Names_Set : Forms_Names_Set_Type :=
  106.     (new String ' ("Industrial" ),            
  107.      new String ' ("Minimal" ),
  108.      new String ' ("Classical" ),
  109.      new String ' ("Baroque" ),      
  110.      new String ' ("Rock" ),
  111.      new String ' ("Hard Rock" ),            
  112.      new String ' ("New Wave" ),
  113.      new String ' ("House" ),            
  114.      new String ' ("Acid" ),
  115.      new String ' ("Transe" ),      
  116.      new String ' ("Techno" ),
  117.      new String ' ("Tribe" ),      
  118.      new String ' ("Drums and Bass" ),
  119.      new String ' ("Jungle" ),      
  120.      new String ' ("Hard Core" ),
  121.      new String ' ("Progressive" ));
  122.  
  123.   -- Mixed forms type.
  124.   type Mixed_Form_Type is (Fusion, Fission, Unmixed, Silence);
  125.  
  126.  
  127.   package MIDI is            
  128.      
  129.          
  130.      type Category_Index_Type is new Positive range 1..16;
  131.      
  132.      type Categories_Set_Type is array (Category_Index_Type range <> ) of access String;
  133.            
  134.      
  135.      Categories_Default : Categories_Set_Type(1..16) :=
  136.     (new String ' ("lead" ),
  137.      new String ' ("bass" ),    
  138.      new String ' ("string N pad" ),
  139.      new String ' ("Guitar N Pluck" ),
  140.      new String ' ("Fx" ),
  141.      new String ' ("synth hard" ),
  142.      new String ' ("synth soft" ),
  143.      new String ' ("keyboard" ),
  144.      new String ' ("hit N drum" ),
  145.      new String ' ("drums kit" ),
  146.      new String ' ("audio in" ),
  147.      new String ' ("motion" ),    
  148.      new String ' ("bell N Decay" ),
  149.      new String ' ("user" ),
  150.      new String ' ("arp seq" ),
  151.      new String ' ("voccoder" )
  152.     );
  153.      
  154.      type Categories_Record(Category_Max : Category_Index_Type) is tagged
  155.      record
  156.         Category : Categories_Set_type(1..Category_Max);
  157.         Last       : Natural := 0;
  158.      end record;
  159.      
  160.      type Categories_Access is access all Categories_Record'Class;
  161.      
  162.      type Timer_Record is
  163.      record
  164.         Date : Time := Clock;
  165.         Elapsed_Days : Day_Count := 0;
  166.         Elapsed_Hours : Day_Duration := 0.0;
  167.      end record;
  168.      type Timers_Access is access all Timer_Record;
  169.      Stand : constant access String := new String ' ("standard" );
  170.      Text  : constant access String := new String ' ("text" );
  171.      
  172.      type MIDI_Options_Record is tagged
  173.      record
  174.         Tempo      : Tempo_Type := 120.0;
  175.         Signature  : Signature_Type := (4, 4);        
  176.         In_Loop    : Boolean := False;
  177.         Timers     : Timers_Access := new Timer_Record;
  178.         Format     : access String := Stand;
  179.         Categories : Categories_Access := new Categories_Record ' (16, Categories_Default, 16);
  180.      end record;
  181.      
  182.      type MIDI_Options is access MIDI_Options_Record;
  183.      
  184.   end MIDI;
  185.  
  186.   use MIDI;
  187.  
  188.   type Buffered_Partition_Record is
  189.      record         
  190.      Partition     : Partition_Record;
  191.      Tempo         : Tempo_Type := 120.0;
  192.      Signature     : Signature_Type := (4, 4);
  193.      Date          : Time := Clock;
  194.      In_Loop       : Boolean := False;
  195.      Bar_Beat      : Bar_Beat_Type := (1, 1, 1, 0);    
  196.      Current       : Seq_Access;
  197.      Left          : Seq_Access := Left_Min;
  198.      Right         : Seq_Access := null;
  199.      Mixed_Form    : Mixed_Form_Type := Unmixed;
  200.      Options       : MIDI_Options := new MIDI_Options_Record;
  201.      end record;
  202.  
  203.   type Buffered_Partition_Access is access all Buffered_Partition_Record;
  204.  
  205.   procedure Initialize(Buffered_Partition : out Buffered_Partition_Record;
  206.             Seq                : in Seq_Access;
  207.             Device_Id          : in Positive;
  208.             In_Loop : in Boolean := False);
  209.   procedure Set_In_Loop(Buffered_Partition : in out Buffered_Partition_Record;
  210.              In_Loop : in Boolean);
  211.   function is_In_Loop(Buffered_Partition : in Buffered_Partition_Record) return Boolean;
  212.  
  213.   function Exhausted(Buffered_Partition : in Buffered_Partition_Record) return Boolean;
  214.  
  215.   function Get_Signature(Buffered_Partition : in Buffered_Partition_Record) return Signature_Type;
  216.  
  217.   procedure set_Signature(Buffered_Partition : in out Buffered_Partition_Record;
  218.                Signature : in Signature_Type);  
  219.  
  220.   function Quantum (Signature : in Signature_Type; Tempo : in Tempo_type) return Duration;
  221.  
  222.   procedure Insert_Steps_Before
  223.     (Buffered_Partition : in out Buffered_Partition_Record;
  224.      Left, Right            : in out Seq_Access;
  225.      Steps                  : in Seq_Access;
  226.      Device_Id              : in positive);
  227.   procedure Remove_Steps_Between
  228.     (Buffered_Partition     : in out Buffered_Partition_Record;
  229.      Left, Right            : in out Seq_Access);
  230.   -- Select region.
  231.   -- Copy region.
  232.   -- Paste region.
  233.   function Set_Next
  234.     (Sequence : access Sequence_Record) return Boolean;
  235.  
  236.   type Step_Set_Type is array (1..Device_Max) of Step_Access;
  237.  
  238.   function Set_Next
  239.     (Buffered_Partition : access Buffered_Partition_Record) return Step_Set_Type;
  240.  
  241.   function Next_Step(Buffered_Partition : access Buffered_Partition_record) return Boolean;
  242.  
  243. end ultrason.Computing;


 
Et j'ai quatre autres paquetages en fait pour gérer le MIDI qu'utilise le paquetage.
En gros, les messages, les périphérique, les paramètres des instrument et une bibliothèque d'interface MIDI.
 
Avec notament les définitions sur la géométrie des instruments utilisés :

Code :
  1. --
  2.   subtype Bank_Type is Interfaces.C.Long range 0..127;
  3.   -- Valeurs admises pour les changements de banque.                          
  4.  
  5.   type Bank_Geometry_Type is
  6.      record
  7.         MSB_Bank_Max : Bank_Type := 0;
  8.         LSB_Bank_Max : Bank_Type := 127;
  9.      end record;
  10.  
  11.   subtype Timbre_Id_Type is Natural range 0..15;
  12.  
  13.   type Map_Geometry_Type is
  14.      record
  15.         Num_Timbre    : Timbre_Id_Type := 0;
  16.         Bank_Geometry : Bank_Geometry_Type := (Bank_Type'first, Bank_Type'Firs\
  17. t);
  18.      end record;


 
 
Voilà, ceux sont mes outils.
Après j'aimerais bien enregistrer charger plus de données sur les instruments telles que les noms des programmes, leur architecture et les valeurs de leurs paramètres. Mais c'est pas gagné.
 
Le défi c'est de faire un programme éfficace, souple, puissant, autonome, et évolutif.
bon, je vais lire mon pavé lentement.
Merci pour votre soutiens.


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

Marsh Posté le 23-05-2015 à 02:48:01    

Et j'ai ce type en plus :

Code :
  1. type Break_Type is (Null_Break, Down_Break, Up_Break, Full_Break);


 
Et mon type MIDI_Options_type devient :
 

Code :
  1. type MIDI_Options_Record is tagged
  2.         record
  3.            Tempo        : Tempo_Type := 120.0;
  4.            Signature    : Signature_Type := (4, 4);
  5.            In_Loop      : Boolean := False;
  6.            Timers       : Timers_Access := new Timer_Record;
  7.            Format       : access String := Stand;
  8.            Categories   : Categories_Access := new Categories_Record ' (16, Categories_Default, 16);
  9.            --  Forms_Set    : Forms_Names_Set_Type := Forms_Names_Set;        
  10.            --  Current_Form : Form_Index := 0;                                
  11.            --  Next_Form    : Form_Index := 0;                                
  12.            --  Mixed_Form   : Mixed_Form_Type := Unmixed;                      
  13.            --  Previsious_Break : Break_Type := Null_break;                    
  14.            --  Current_Break    : Break_Type := Down_Break;                    
  15.         end record;


 
Le type break j'espère va m'aider à composer le son.
Mais c'est pas simple.


Message édité par par l'anneau de l'ia le 23-05-2015 à 02:48:34

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

Marsh Posté le 23-05-2015 à 04:05:53    

J'avais sortie un algo tout pourite pour le transport j'ai trouvé mieux mais j'ai quand même un problème d'algo.
Avancer seulement si c'est le moment de jouer et avancer la position quand même.
 
Y  pas un dilèmme là !


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

Marsh Posté le 23-05-2015 à 15:51:58    

Bonjour,
 
Donc, après j'ai un paquetage utilisateur dans lequel je défini des classe de plugins exploitant les type et structure du paquet précédent :
 

Code :
  1. -- Plug-ins classes.                                                                            
  2.   type Plugin_Record;
  3.  
  4.   task type Plugin_Manager_Process(Plugin : access Plugin_Record'Class) is
  5.      entry Start(Partition : in Buffered_Partition_Access);
  6.      entry Stop;
  7.      entry Halt;
  8.      entry Receive(Sequence : in out Seq_Access;Last : in out Seq_Access; Device : in Positive);
  9.      entry Exhaust(Tempo : out Tempo_Type;Signature : out Signature_Type; Date : out Time);
  10.      entry Exhausted;
  11.   end Plugin_Manager_Process;
  12.  
  13.  
  14.   type Plugin_MIDI_Options_Type is
  15.      record
  16.         Tempo      : Tempo_Type := 120.0;
  17.         Signature  : Signature_Type := (4, 4);
  18.         In_Loop    : Boolean := False;
  19.         Timers     : Timers_Access := new Timer_Record;
  20.         Current_Form : Form_Index := 0;
  21.      end record;
  22.  
  23.   type Plugin_Record is limited new MIDI_Record with
  24.      record
  25.         Device_Id : Natural := 0;
  26.         Filename : access String;
  27.         Name     : access String;
  28.         Format     : access String := Stand;
  29.         Manager : Plugin_Manager_Process(Plugin_Record'Access);
  30.         Options : Plugin_MIDI_Options_Type;
  31.      end record;
  32.  
  33.  
  34.   ----------------------------------------------------                                            
  35.   -- Masters Plug-ins  classes.                                                                  
  36.  
  37.   type Band_Master_Record is new Plugin_Record with
  38.      record
  39.         Mixed_Form : Mixed_Form_Type := Unmixed;
  40.         Current_Form : Form_Index := 0;
  41.         Next_Form    : Form_Index := 0;
  42.         Previsious_Break : Break_Type := Null_break;
  43.         Current_Break    : Break_Type := Down_Break;
  44.      end record;
  45.  
  46.   type Ai_Self_Record is new Plugin_Record with
  47.      record
  48.         null;
  49.      end record;
  50.  
  51.   type Note_Generator_Record is new Plugin_Record with
  52.      record
  53.         Timbre_Category   : Category_Index_Type := 1;
  54.      end record;
  55.  
  56.   type Device_Manager_Record is new Plugin_Record with
  57.      record
  58.         null;
  59.      end record;
  60.  
  61.   type User_Composant_Record is new Plugin_Record with
  62.      record
  63.         null;
  64.      end record;


 
Ce qui fait quand même un sacret paquet de paramètres :

Code :
  1. --
  2.         Tempo      : Tempo_Type := 120.0;
  3.         Signature  : Signature_Type := (4, 4);
  4.         In_Loop    : Boolean := False;
  5.         Timers     : Timers_Access := new Timer_Record;
  6.         Current_Form : Form_Index := 0;
  7. -- and
  8.         Device_Id : Natural := 0;
  9.         Filename : access String;
  10.         Name     : access String;
  11.         Format     : access String := Stand;
  12.         Manager : Plugin_Manager_Process(Plugin_Record'Access);
  13.         Options : Plugin_MIDI_Options_Type;
  14. -- and
  15.         Mixed_Form : Mixed_Form_Type := Unmixed;
  16.         Current_Form : Form_Index := 0;
  17.         Next_Form    : Form_Index := 0;
  18.         Previsious_Break : Break_Type := Null_break;
  19.         Current_Break    : Break_Type := Down_Break;
  20. -- or
  21.        Timbre_Category   : Category_Index_Type := 1;


 
Il en manque encore beaucoup selon les plugins.


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

Marsh Posté le 27-05-2015 à 15:32:12    

Hey !
 
 
 
Premier plugin génétique implémenté dans la version 0.8.7 dispo sur Sourceforge projet Ultrason.
 
 
Détails de l'implémentation :
 

Code :
  1. --
  2.       Genetic_Code(Population_Size           => 100,
  3.                            Max_Generations           =>   10,
  4.                            Num_No_Change_Generations =>    1,
  5.                            Mutation_Probability      =>   0.033,
  6.                            Num_Elite_Saved           =>    1,
  7.                            Best                      =>Elohim,
  8.                            Fit                       =>Fitness);
  9.               Real_Hour := Clock;
  10.               for I in elohim.Chord'Range loop
  11.  
  12.                  Print(Elohim.Chord(I));
  13.                  Text_Io.Put("Fit : " );
  14.                  Text_Io.Put_line(Float'Image(Fitness));
  15.  
  16.                  Note := (Key => Value_type(Elohim.Chord(I).Key),
  17.                           Sens => Value_Type(Elohim.Chord(I).Sens),
  18.  
  19.                           On_Hour => (Real_hour - Date) + Quantum(Tempo)/4 +
  20.  
  21.                             Quantum(Tempo)/4 * (I),
  22.  
  23.  
  24.                              Off_Hour => (Real_hour - Date) + Quantum(Tempo)/4 +
  25.  
  26.                             Quantum(Tempo)/4 * (I) +
  27.                             Quantum(Tempo)/4);


Message édité par par l'anneau de l'ia le 27-05-2015 à 15:32:37

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

Marsh Posté le 29-05-2015 à 15:00:56    

Je viens de passer 2 heures à chercher pourquoi le programme ne termine pas.
En fait je ne comprends pas.
En fait j'ai pas écrit l'instruction qui va bien, mais je cherche pourquoi elle marche pas.
Oh !
 
 :lol:  
 
 
Problème solvé.


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

Marsh Posté le 31-05-2015 à 19:20:09    

Je fais du Jazz avec de l'aléatoire et de la génétique.
A 151bpm, deux timbres.


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

Marsh Posté le 06-06-2015 à 13:42:30    

Bonjour,
 
Je recommence à zéro, pas trop tard...
 
Voic le nouveau Mainfile,  

Code :
  1. ----------------------------------------                                        
  2. -- Ultrason is Virtual MIDI Composer. --                                        
  3. ----------------------------------------                                        
  4. -- Author      : The matrix.                                                    
  5. -- Date        : 2015-06-06.                                                    
  6. -- Version     : 1.0.0.                                                        
  7. -- Description : Ultrason is small MIDI                                        
  8. --               Virtual Composer.                                              
  9. ----------------------------------------                                        
  10.  
  11.  
  12. with Ultra.Son.MIDI.Virtual;
  13. use Ultra.Son.MIDI.Virtual;
  14. with Ultra.Son.MIDI.Virtual.Composer;
  15. use Ultra.Son.MIDI.Virtual.Composer;
  16. with Ultra.Son.X.Gtk_Ada.Main;
  17. use Ultra.Son.X.Gtk_Ada.Main;
  18. use Ultra, Ultra.Son;
  19. with Gtk.Main;
  20. with Ada.Command_Line;
  21. use Ada.Command_Line;
  22. with Gnat.Os_Lib;
  23. use Gnat;
  24. procedure Ultrason is
  25.  
  26.  
  27.   Filename : String_Access;
  28.   Work : Work_Access;
  29.  
  30. begin
  31.  
  32.   if Argument_Count /= 0 then
  33.      if Os_Lib.Is_Regular_File (Argument (Argument_Count)) then
  34.         Filename := new String ' (Argument(Argument_Count));
  35.      else
  36.         raise Specification_Error;
  37.      end if;
  38.   else
  39.      Filename := new String ' ("" );
  40.   end if;
  41.  
  42.   Work := new Work_Type;
  43.  
  44.   Work.Initialize (Filename.all);
  45.  
  46.   Ultrason_Composer.Initialize(Work);
  47.  
  48.   declare
  49.  
  50.      Window : Ultrason_Window;
  51.   begin
  52.  
  53.      Gtk.Main.Init;
  54.  
  55.      Initialize (Window, Work);
  56.  
  57.      Gtk.Main.Main;
  58.   end;
  59. exception
  60.   when Specification_Error =>
  61.      null;
  62. end Ultrason;


 
Voici le premier jet de la spécification de l'objet Work_Type :
 

Code :
  1. with Ada.Finalization;
  2. use Ada.Finalization;
  3. with Ada.Unchecked_Deallocation;
  4. package Ultra.Son.MIDI.Virtual is
  5.  
  6.   type String_Access is access all String;
  7.  
  8.   procedure String_Free is
  9.      new Ada.Unchecked_Deallocation (String, String_Access);
  10.  
  11.   type Work_Type;
  12.  
  13.   type Work_Type is new Limited_Controlled with
  14.      record
  15.  
  16.         Filename : String_Access;
  17.  
  18.         --  Options  : Options_Type;                                          
  19.  
  20.         --  Plugins_Set : Plugins_Set;                                        
  21.         --  Devices_Set : Devices_Set;                                        
  22.  
  23.         --  Work_State  : Work_State_Type;                                    
  24.  
  25.         --  Load_Average : Load_Average_Type;                                  
  26.  
  27.      end record;
  28.  
  29.   type Work_Access is access all Work_Type'Class;
  30.  
  31.   procedure Initialize (Work : in out Work_Type'Class;
  32.                         Filename : in String := "" );
  33.  
  34.   procedure Finalize (Work : in out Work_Type'Class);
  35.  
  36. private
  37.  
  38.   procedure Load_File (Work : in out Work_Type'Class);
  39.  
  40. end Ultra.Son.MIDI.Virtual;


 
Le composer est une tache, le paquetage Gtk_Ada est la gestion graphique de l'objet Work et du traitement de la tache composer.
 
Je vous poste pas le dernier plan mal fait, puis ça fera une surprise.
 
 
Question : puis faire mieux et comment ?


Message édité par par l'anneau de l'ia le 06-06-2015 à 13:43:10

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

Marsh Posté le 07-06-2015 à 02:19:46    

Nouvelle version, nouvelle interface :  
 
https://a.fsdn.com/con/app/proj/ultrason/screenshots/ultrason-1.0.4.jpg
 
C'est pas terminé quand même.  :o


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

Marsh Posté le 30-12-2017 à 16:04:15    

Bonjour,
 
Vous êtes pet-être intéressé par ce projet alors je viens pour une mise à jour des évennement chez localghost.
 
Ultrason, est le nom de l'application en cours de développement chez localghost.
C'est un compositeur virtuel pour instruments MIDI multi- timbral.
 
vous pouvez trouvez la totalité des sources sur sourceforge projet : "ultrason".
 
la version courante reprends simplement la version précédente en partageant cette fois chacun des périphérique avec chacune des instance de des divers fichier don le nom est passé en ligne de commande.
Ce qui permet de jouer plusieur morceau simultanément ou de les jouer à la suite en play list en boucle ou pas.
 
La prochaine version 6.x.x sera elle réellement orienté plugins avec une vrai implémentation de gestion de plugins.
 
Elle fournira 11 plugin distinct, répertorié dans 6 catégorie :
 
Program change et CC change list  
Step sequencer
Arp sequencer
Neural network generator
Genetical kgenerator
Natural language Modulator.
 
Merci pour vos retours.
 
Bonne continuation, et bonne fin d'année.

Reply

Marsh Posté le 31-12-2017 à 21:13:34    

Ca c'est la fonction  initialize....
 

Code :
  1. function Initialize(Works : in Work_Array;
  2.                    Verbose, Auto_Play, In_Loop, Help : in Boolean)
  3.                      return Main_Windows is
  4.  
  5.      Wins : constant Main_Windows := new Interfaces_Record;
  6.  
  7.  
  8.      Source : constant Main_Sources.G_Source_Func := Self'Access;
  9.   begin
  10.      Wins.Auto_Play := Auto_Play;
  11.      Wins.In_Loop := In_Loop;
  12.      Wins.Verbose := Verbose;
  13.      Wins.Help := Help;
  14.      for work in Works'Range loop
  15.         if Works(Work) /= null then
  16.            Wins.Works_Processes(Work) := new Work_Processing_Record;
  17.            Wins.Works_Processes(Work).Initialize(Works(Work));
  18.            Wins.Windows(Work) :=
  19.              new Work_Window_Record(Works(Work),
  20.                                     Wins.Works_Processes(Work),
  21.                                     Work,
  22.                                     Wins.all'access);
  23.            Wins.Windows(Work).Initialize;
  24.         end if;
  25.      end loop;
  26.      if Wins.Auto_Play then
  27.         Wins.Main_Automation := Main_Sources.Timeout_Add (Interval => 1500,
  28.                                                           Data     => Wins,
  29.                                                           Func     => Source);
  30.      end if;
  31.      return Wins;
  32.   end Initialize;


 
Ca c'est la sortie sur la console :
 

Citation :

Work [] ready.
initializing output driver for device : M-Track 2X2M MIDI 1instrument N° 1
initializing Input driver for device : M-Track 2X2M MIDI 1instrument N° 1
Input_Driver starting...
Halting all process...
Processes stopped
Stopping input driver...
Message Received...
Message Ok !
Message lost...
Input_Driver stopping...
Input_Driver Halted...
Deamon input starting...
Deamon input stopped...
Deamon input halted...
Mod Sequencer starting...
Mod Sequencer stopping...
Mod Sequencer halted.
Input finalization done.
Processes halted
End of Program.
Messages boxe halted


 
Ca descend du paquet Ultrason-6.3.1a.tgz sur 88.189.147.62.
C'est une archie pour une appli de type player en play list automatique. la c'est specifique un poil pour le MIDI (Musical Instrument Digitale Interface).
 
Je trouve que c'est de mieux en mieux organiseé. Pas trop de Warning (pour le moment).
 
Il me reste à développer les plugins avec l'interface qui va bien.
 
Merci pour vos retour.


Message édité par Profil supprimé le 31-12-2017 à 21:42:06
Reply

Marsh Posté le 07-01-2018 à 19:13:05    

Bonjour,
 
Petit enrichissement des générateur génétique en version beta parce que l'interface n'est pas encore développer pour ces plugins.
Plus la possibilité de sauvegagrder les step sequenceur.
Mais attention, et c'est pour ça que je viens, si vous selectionner votre premier plugin sur l'emplacement N il se retrouvera à l'emplacment N° 1
 
Sous entendu le programme élimine les place vide entre sauvegarde et rechargement sur la ligne de commede du nom de fichier sauvegardé.
 
Ca c'est pour la 6.5.11a.
 
Bonne continuation.
 
Arf, zut, trompé de catégorie de forum.
 
 
Bref, j'ai pas de solution, parce que si non, je devrai créer des plugin vide avec des processus qui font rien et c'est lourd.
 
Je peux pas écrire plus d'un message toute les trois minutes, merci les gars ! [:natas]


Message édité par Profil supprimé le 07-01-2018 à 19:19:02
Reply

Marsh Posté le 13-01-2018 à 20:42:59    

yep !
 
 
J'arrive avec une superbe application qui fonctionne si on s'en sert bien.
 
Bon bref. c'est la dernière version du paquet ultrason gnu- avec spécialement pour cette version une image du graphe de dépendances.
 
je voudrais avoir votre avis concernant ma programmation avec Ada... Pas professionnelement parlant mais à l'ouvrage quand même.
 
S'il vous plait !
 
Voici l'image du graphe :
 
 
http://88.189.147.62/ultrason-graph.png


Message édité par Profil supprimé le 13-01-2018 à 20:57:44
Reply

Marsh Posté le 13-01-2018 à 21:11:54    

Oui alors, j'ai pas donné le lien pour les sources du programme.
 
C'est sur sourceforge ou sur ma machine à 88.189.147.62.
 
le main file :
 

Code :
  1. --    Ultrason is small Virtual Composer for MIDI instruments.
  2. --    Copyright (C) 2017 M. 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 2 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, write to the Free Software
  16. --    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
  17. -----------------------------------------------------------------
  18. -- Authors     : E. Sens                                       --
  19. -- Date        : Sat 13 Jan 11:20:38 GMT 2018                  --
  20. -- Version     : 6.6.3                                         --
  21. -- Description : Virtual Composer for MIDI instruments written --
  22. --               with Ada programming language.                --
  23. -- Ultrason version 6 : This version accept multiple files     --
  24. -- to open the main application in autoplay and/or in loop.    --
  25. --                                                             --
  26. -- Dependencies : Ada, Gnat, GtkAda, portmidi-dev              --
  27. -----------------------------------------------------------------
  28. -- Accept -i -v -h -a -l switchs and then multiple filenames.  --
  29. -- Where :
  30. --           "-i" switch is ignore indicator for first device. --
  31. --           "-v" switch is verbose console messages. not used.--
  32. --           "-h" switch is help message printing en exit.     --
  33. --           "-a" switch is auto_play indicator.               --
  34. --           "-l" switch is in_loop indicator for play list.   --
  35. -----------------------------------------------------------------
  36.  
  37.  
  38. with GNAT.Command_Line;                 use GNAT.Command_Line;
  39. with Libsens.Exceptions;                use Libsens.Exceptions;
  40. with Libsens.Virtual;                   use Libsens.Virtual;
  41. with Libsens.Virtual.Work_Class;        use Libsens.Virtual.Work_Class;
  42. with Libsens.Applications.Windows;      use Libsens.Applications.Windows;
  43. with Text_Io;                           use Text_Io;
  44. with Gtk.Main;
  45. procedure Main is
  46.  
  47.      
  48.   Works_Processes : Main_Windows;
  49.   Works   : Work_Array;
  50.   Work_Id : Natural := 0;
  51.  
  52.   Auto_Play : Boolean := False;  
  53.   In_Loop   : Boolean := False;
  54.  
  55.   Verbose   : Boolean := False;
  56.   Help      : Boolean := False;  
  57.   Ignore    : Boolean := False;
  58. begin
  59.  
  60.   begin
  61.      
  62.      begin
  63.        
  64.         loop
  65.            case Getopt ("i a l v h" ) is
  66.               -- Accept :=
  67.               -- v verbose ;
  68.               -- h help ;
  69.               -- a auto play ;
  70.               -- l in loop ;
  71.               when ASCII.NUL => exit;
  72.                  when 'i' =>
  73.                  if Full_Switch = "i" then
  74.                     Put_Line ("Got ignore" );
  75.                     ignore:= True;
  76.                  end if;
  77.               when 'a' =>
  78.                  if Full_Switch = "a" then
  79.                     Put_Line ("Got auto play" );
  80.                     Auto_Play := True;
  81.                  end if;
  82.               when 'l' =>
  83.                  if Full_Switch = "l" then
  84.                     In_Loop := True;
  85.                     Put_Line ("Got in loop" );
  86.                  end if;
  87.               when 'v' =>                
  88.                  if Full_Switch = "v" then
  89.                     Verbose := True;
  90.                     Put_Line ("Got verbose" );
  91.                  end if;
  92.               when 'h' =>
  93.                  if Full_Switch = "h" then
  94.                     Help := True;
  95.                     Put_Line ("Got help" );
  96.                  end if;
  97.                  -- Put_Line ("Got b + " & Parameter);
  98.               when others =>
  99.                  raise Program_Error; -- cannot occur
  100.            end case;
  101.         end loop;
  102.        
  103.         if Help then          
  104.            Put_Line("ultrason : usage : ultarson [ -a ] [ -l ] [ -i ] [ -h ] [ -v ] [Filename(s)...]" );
  105.            return;
  106.         end if;        
  107.        
  108.         declare
  109.            
  110.         begin
  111.            
  112.            loop
  113.               declare
  114.                  S : constant String := Get_Argument (Do_Expansion => True);
  115.               begin    
  116.                  exit when S'Length = 0;
  117.                  Put_Line ("Adding work for " & S);
  118.                  Works(Work_Num(Work_Id+1)) := new Work_Record;
  119.                  Works(Work_Num(Work_Id+1)).Initialize(Work_Num(Work_Id+1), S);
  120.                  Work_Id := Work_Id + 1;
  121.               end;  
  122.            end loop;
  123.                            
  124.         end;
  125.      exception
  126.         when Invalid_Switch    => Put_Line ("Invalid Switch " & Full_Switch);
  127.            raise Spec_Error;
  128.         when Invalid_Parameter => Put_Line ("No parameter for " & Full_Switch);
  129.            raise Spec_Error;
  130.      end;                              
  131.   end;
  132.   if Work_Id = 0 then
  133.      Works(Work_Num(Work_Id+1)) := new Work_Record;
  134.      Works(Work_Num(Work_Id+1)).Initialize(Work_Num(Work_Id+1), "" );      
  135.      Work_Id := Work_Id + 1;    
  136.   end if;
  137.  
  138.   Gtk.Main.Init;
  139.   Works_Processes := Initialize(Works, Verbose, Auto_Play, In_Loop, Help, Ignore);
  140.   if Works_Processes /= null then
  141.      Works_Processes.Last := Work_Num(Work_Id);      
  142.      Gtk.Main.Main;  
  143.   end if;
  144. end Main;


 
 
Works_processes est une liste de fichiers ouverts pour chacun desquels un processus globale de gestion de plugin et une fenêtre son crées.
 
Les différent plugin font appel à diverse bibliothèque dédié à la composition.
 
les service de génétique et réseaux de neurones artificiels sont fournit par la bibliothèque PragmARC. (Ada Reusable Components).

Reply

Marsh Posté le 24-01-2018 à 17:30:55    

Avant de reprendre l'implémentation suivante, j'ai une idée quand même.
 
Je implémenter un Plugin qui sera doté d'une wave lable pour un LFO.
 
Problème, je sais pas ce qu'est une onde ni et surtout comment ça ce modélise.
 
J'ai bien fait un peu de traitement du signal dans mes études mais rien à voir avec la prog.
 
Un coup de main serait bien venu sur ce coup !
 
S'il vous plait.

Reply

Marsh Posté le 24-01-2018 à 18:03:36    

Bonjour, je cherche, le topic sur le sujet connexe que je sais exister ici.
 
le sujet en question traite des meilleur moyen d'obtenir zéro et 1 alternativement mais je trouve pas.
 
Vous êtes nombreux à avoir contribués à ce sujet !
 
J'espère que mon appel sera entendu.
 
Merci, bonne continuation.
 
yep , trouvé finalement. c'est ici, j'espère obtenir encore beaucoup de contribution sur le sujet !
 
https://forum.hardware.fr/hfr/Progr [...] 8560_1.htm


Message édité par Profil supprimé le 24-01-2018 à 18:08:02
Reply

Marsh Posté le 30-01-2018 à 10:49:46    

Bonjour. Bonsoir, selon ... s'il fait jour ou s'il fait nuit.
 
Je projette un nouveau programme à la fois plus simple d'utilisation et plus puissant abstraitement.
 
Le programme devrait être une interface général MIDI permettant d'écrire et de lire des fichier MIDI et de les jouer avec grâce à quelque outils correspondant au exigence de des normes MIDI, un step séquenceur, une Ctrl change séquencer, un Prgm change séquencer, more maybe.
 
Bien que je sois à la fois étudiant en informatique et utilisateur d'outils de Musique Assistée par Ordinateur, je connais encore très peu les normes MIDI, mais je vais y remédier.
 
Pour le moment j'ai simplement défini une application General MIDI de manière générale avec une fenêtre cachée et (pour le moment) une fenêtre de travail par laquelle on accède aux préferences qui contiennent la liste des périphérique utilisable que l'on doit allimenter grace à une boite de dialog qui elle est attachée à la fenêtre cachée de l'application.
 
Et j'ai grossièrement copié/collé un code d'exploitation du MIDI de l'ancienne version qui fournit l'objet "Orcherster" qui est un ensemble d'instruments qui seront en suite exploités dans la mise en oeuvre des processus MIDI.
 
En image, ça donne ceci :
http://88.189.147.62/Gmface-preferences.png
 
 
Le main file (pour le moment) :  

Code :
  1. ----------------------------------------------------
  2. -- Gmface is General MIDI attempt to interfacing. --
  3. -- Copyright (C) 2018 Manuel De Girardi           --
  4. ----------------------------------------------------
  5. --         gggg       mm              mm          --
  6. --       ggg  ggg     mmmm          mmmm          --
  7. --     gg             mm  mm      mm  mm          --
  8. --    gg    ggggggg   mm    mm  mm    mm          --
  9. --     gg     gg      mm      mm      mm          --
  10. --      ggg   gg      mm              mm          --
  11. --         gggg       mm              mm   face   --
  12. --                                                --
  13. ----------------------------------------------------
  14. -- Date        : Tue Jan 30 00:27:38 CET 2018     --
  15. -- Version     : 0.0.3gnu_src                     --
  16. -- Authors     : E. Sens                          --
  17. -- Description : General MIDI interface           --
  18. ----------------------------------------------------
  19. -- This program is free software; you can redistribute it and/or modify
  20. -- it under the terms of the GNU General Public License as published by
  21. -- the Free Software Foundation; either version 2 of the License, or
  22. -- (at your option) any later version.
  23.  
  24. -- This program is distributed in the hope that it will be useful,
  25. -- but WITHOUT ANY WARRANTY; without even the implied warranty of
  26. -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  27. -- GNU General Public License for more details.
  28.  
  29. -- You should have received a copy of the GNU General Public License
  30. -- along with this program; if not, write to the Free Software
  31. -- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
  32.  
  33.  
  34. with Gmface.Gm_Application.Gtk_Interface;
  35. use Gmface.Gm_Application.Gtk_Interface;
  36.  
  37. procedure Gmfacemain is
  38.  
  39.   Gtk_Interface : Gtk_Interface_Pointer;
  40. begin
  41.   Gtk_New(Gtk_Interface);
  42. end Gmfacemain;


 
La bibliothèque Gm_Application-Gtk_Interface (specification) :

Code :
  1. ------------------------------------------------------------------------------
  2. -- Gmface-Gm_Application-Gtk_Interface : GtkAda Gm interface of Gmface.     --
  3. ------------------------------------------------------------------------------
  4. with Gmface.Gm_Midi.Instruments;        use Gmface.Gm_Midi.Instruments;
  5. with Gmface.Gm_Midi.Drivers;            use Gmface.Gm_Midi.Drivers;
  6.  
  7. with System.Address_To_Access_Conversions;
  8. with GtkAda.Application;                use GtkAda.Application;
  9. with Gmface.Gm_Application.Gm_Interface;use Gmface.Gm_Application.Gm_Interface;
  10.  
  11. with Gtk.Application_Window;            use Gtk.Application_Window;
  12.  
  13. with Gtk.Window;                        use Gtk.Window;
  14. with Gtk.Box;                           use Gtk.Box;
  15. with Gtk.Notebook;                      use Gtk.Notebook;
  16. with Gtk.Combo_Box_Text;                use Gtk.Combo_Box_Text;
  17.  
  18. with Gtk.Action_Group;
  19. pragma Elaborate_All(Gtk.Action_Group);
  20. use Gtk.Action_Group;
  21.  
  22. with Gtk.UI_Manager;                    use Gtk.UI_Manager;
  23. package Gmface.Gm_Application.Gtk_Interface is
  24.  
  25.  
  26.  
  27.  
  28.   type Gtk_Work_Window_Record is tagged
  29.     record
  30.        Window : Gtk_Application_Window;
  31.        
  32.        Main_Vbox          : Gtk_Vbox;
  33.        
  34.        
  35.        Menus_Hbox         : Gtk_Hbox;
  36.        
  37.        App_Action_Group   : Gtk_Action_Group;
  38.        App_UI             : Gtk_UI_Manager;
  39.        --  Win_Action_Group   : Gtk_Action_Group;
  40.        --  Win_UI             : Gtk_UI_Manager;
  41.     end record;
  42.  
  43.  
  44.   package Gtk_Work_Window_Conversions
  45.   is new System.Address_To_Access_Conversions
  46.     (Gtk_Work_Window_Record);
  47.  
  48.   subtype Gtk_Work_Window_Pointer is Gtk_Work_Window_Conversions.Object_Pointer;
  49.  
  50.   type Gtk_Work_Window_Array is array (Positive range <> ) of Gtk_Work_Window_Pointer;
  51.  
  52.   type Device_Page_record is tagged
  53.      record
  54.         Input_Device  : Gtk_Combo_Box_Text;
  55.         Output_Device : Gtk_Combo_Box_Text;
  56.      end record;  
  57.   type Device_Page_Access is access all Device_Page_Record;
  58.  
  59.   type Device_Page_Array is array (Positive range <> ) of Device_Page_Access;
  60.  
  61.   type Gtk_Application_Record is tagged
  62.      record
  63.         Gm_Application  : Gm_Interface.Gm_Interface;
  64.         Devices_Pages   : Device_Page_Array(1..128);
  65.         Bandmaster      : Bandmaster_Record(128);
  66.         Notebook        : Gtk_Notebook;
  67.         Cur_Page        : Integer := -1;
  68.      end record;
  69.      
  70.   type Gtk_Interface_Record is new Gtk_Application_Record With
  71.      record
  72.         Application       : GtkAda_Application;        
  73.         Window            : Gtk_Window;
  74.         Gtk_Works_Windows : Gtk_Work_Window_Array(1..128);
  75.      end record;
  76.  
  77.   type Gtk_Interafce is access all Gtk_Interface_Record;
  78.  
  79.   package Gtk_Interface_Conversions
  80.   is new System.Address_To_Access_Conversions
  81.     (Gtk_interface_Record);
  82.  
  83.   subtype Gtk_Interface_Pointer is Gtk_Interface_Conversions.Object_Pointer;
  84.  
  85.   procedure Gtk_New(Gtk_Int : out Gtk_Interface_Pointer);
  86.  
  87.  
  88. private
  89.  
  90.   GApplication_Id : constant String := "gmface.gm_applications.gtk_interface";
  91.  
  92. end Gmface.Gm_Application.Gtk_Interface;


 
 
Donc semsiblement divergent du programme ultrason par l'ouverture sur une selection des instrument exploités préalable à l'utilisation.
Cette selection est mémorisé dans deux fichier de préferences, un pour les périphériques d'entrée selectionnés et un autre pour les périphériques de sortie.
Ces fichiers sont maintenus grâce à un paquetage Shared_Passive.
 
Voilà. Je souhaiterais avoir votre avis sur mon implémentation jusqu'ici et je souhaitais également vous inviter à contribuer à ce projet.
Vous trouverai les source sur sourceforge.net : Gmface version 0.0.4gnu_src
 
Par exemple, si quelqu'un sur Windows (parce que perso je suis surGNU/Linux, avec un serveur http sur ma machine je peux pas rebooter sans arrêt) pouvais me dire qui ça tource également sur Windows, c'est sympa.
J'utilise gnat2016 et gtkada2016, j'ai installé portmidi-dev sur mon système GNU/Linux Debian 9.3 sur une architecture AMD 64bits.
 
Merci pour vos retours et vos contributions.
 
 
Plus ouvertement je cherche un moyen de metre à jour la liste des périphérique disponible durant l'exécution du programme. (je parle pas de jouer avec de nouveau mais juste de les connaître).
(Même ce programme se limite au périphériques connectés avant l'appel sur la ligne de commande).
 
Merci encore.

Reply

Marsh Posté le 06-02-2018 à 17:21:06    


Bonjour et merci de l'intérêt que vous porter pour ce sujet :
 
Je viens juste poster ici la TODO.List du projet Gmface.
 
Et je suis en vacance.
 
A+
 

Version 0.1.5
2018-02-05 :
TODO list
 
--      Detect File types (Gmface and MIDI) -- with "GmFa" / "MThd" header.
--      Preference: msg "you must restart"
--      Main->New
--      Main->Open
--      File->Export to MIDI.
--      LFO plugin
--      Close devices when quit.
--      set form plugin ?
--      set cat plugin ?
--      set form gmface master
--      reset ?
--      MIDI player plugin.
---------------------------------------------  

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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