IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Ada Discussion :

Analyse et décisions d'une architecture logicielle pour instrument MIDI avec Ada.


Sujet :

Ada

  1. #1
    Invité
    Invité(e)
    Par défaut Analyse et décisions d'une architecture logicielle pour instrument MIDI avec Ada.
    Bonjour, bonjour tout le monde, bonjour Ada.

    Amateur en programmation informatique et musicale, avec un niveau débutant (de 15ans quand même) j'ai l'ambition de développer une interface logicielle pour instrument MIDI.

    Je viens ici pour proposer de partager ce programme avec la communauté Ada parce qu'écrit avec Ada et pour faire un appel à contribution explicite pour élaborer mon programme.

    Encore en cours d'analyse, j'essaie actuellement de déméler les propriétés des divers composants qui constitue une interface MIDI digne de ce nom.

    Entre les Entrées/sorties MIDI et le moindre bouton d'interface, il existe toute une architecture bien complexe pour transmettre l'information voulue en temps réel et obtenir le jeu désiré, que je souhaiterez revoir avec vous, et peut-être décider ensemble des propriété finales de l'interface.

    Pour le moment, je vois mon interface comme une liste dynamique d'instrument (E/S) pouvant exploiter 16 canaux.

    Mais comment cela se traduit-il informatiquement parlant ?

    Quelle sont les méthodes possible pour générer le jeu musical souhaité ?

    Jusqu'ici j'ai écrit des programmes qui comportaient :
    • un séquenceur ;
    • un séquenceur de modulation ;
    • quelque générateurs de notes =>
      • réseaux de neurones artificiels ;


    j'espère avoir votre aide pour ce programme qui a vocation à permettre de produire une musique électronique moderne et créative.

    Merci de votre lecture, et j'espère de votre participation.

  2. #2
    Invité
    Invité(e)
    Par défaut avancement
    Bonjour,

    J'ai pas bien avancé, vous comprendrez.

    Néanmoins j'ai fait ceci :

    specifications :

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

    Debut de l'implementation :

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


    Utilisation :

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


    Et en fait j'essaie de suivre ce modèle analytique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    --
        Menus
            Ficher : ouvrir, fermer, sauvegarder, nouveau, quitter.
     
     
            Edition : insérer, supprimer.
     
     
            Transport : Démarrer, arrêter, jouer, enregistrer, tempo, en_boucle, taille.
     
     
            Options : format, timers, géométries de banques, tempo, catégories.
     
     
            Aide : Man, howto, compile, install, about.
     
     
        Vues
            supprimer, nouveau, type, nom, ID, Edit, Save, Load.
     
        Flux
            Sources, destinations, type, data1, data2, time.
     
        Plug-ins
     
            Harmonie, Rythmie, Génétique, Program_Change, Timbre_Swap, breaks, signature, tempo,
     
            Sysex, sous_séquenceur, séquenceur_de_modulation, Arpeggiator, Programmable, I.A.

  3. #3
    Invité
    Invité(e)
    Par défaut Ultrason 2015-0.1.10 : cherche contributeur Windows.
    Bonjour,

    Je viens surtout vous mettre au jus de mon avancement et de mes décisions du coup.
    En image (under MS Windows) ça donne ceci :
    Nom : Ultrason-2015-0.1.10.jpg
Affichages : 136
Taille : 81,8 Ko

    Vous reconnaîtrez chaque zone de données sauf peut-être dans le transport ou l'on trouve 5 zone don 3 sont des durées sur 24h et deux vide dont l'une est la signature l'autre la position, c'est la que c'est important, estimée en fractions de mesure.

    Ca va peut-être faire sauter le son, mais bon c'est de la musique.
    Enfin on verra je garde à l'oeil le problème du calage.
    Mais qu'en pensez vous ?

    Pour le fonctionnement globale, je rappelle que c'est un compositeur virtuel basé sur l'exploitation de plugins générateur de donnée MIDI.
    Comme c'est une interface utilisateur c'est pour que l'utilistauer interagisse donc en fait là on à que la surface.

    Le développement des plugins devrait être surnaturel.
    Je suis à la recherche de développeur Ada sur Windows pour exploiter le MIDI sur Windows. S'il vous plait ?

  4. #4
    Invité
    Invité(e)
    Par défaut Premier crash de l'analiste/programmeur.
    Bonjour,

    J'essuis acuellement un premier echec en ayant cru pouvoir mettre des bontons et combo boxes dans des lignes d'un tableau avec Gtk.

    J'en suis là.Nom : Ultrason-2015-0.2.4.jpg
Affichages : 122
Taille : 66,7 Ko

    Donc ça oblige à cliquer une fois de plus, mais peut-être plusieurs fois en moins également !
    Parce-que là maintenant, j'ai l'intention de faire deux boites de dialogue pour :

    - selectionner le périphérique à utiliser avec un bouton Ok et on edite.
    - selectionner le type de plugin à utiliser avec un bouton Ok et on edite.

    Je cherche si je pourais éventuellment ajouter des fonctions dans ces boites de dialogue.

    Merci.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Je m'attaque au développement des plug-ins.
    Donc, j'ai fait un test sur Gnu/Linux, un PC 2 core à 3Ghz, l'affichage dans le flow est assé lourd.
    La stratégie au départ c'était de gérer le transport avec des timeout Glib.Main....
    Alors, je me tatte.

    En image en version 0.5.1 qui parle d'elle même :Nom : Ultrason-2015-0.5.1.jpg
Affichages : 135
Taille : 114,9 Ko

    J'ai du taf, j'y retourne.

    Bippez moi au besoin !

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    J'ai complètement revue ma stratégie orienté timeout pour les évennements.

    J'ai donc implémenté 4 procéssus de type tâche, un transporteur qui envoie les donnéer à un exécutant et un donneur d'ordre parmis plusieurs qui envoient à une interface avec le transporteur.

    Plus le tampon pour l'affiichage. Ca fait 5.
    Bon c'est un prototype.

    Je me suis appliquer pour obtenir ce que je veux, maintenant, je vais le faire comme je veux. Mais ça risque d'être long. A plus.

Discussions similaires

  1. Réponses: 0
    Dernier message: 15/07/2014, 21h31
  2. Réponses: 0
    Dernier message: 01/04/2014, 19h02
  3. Réponses: 1
    Dernier message: 09/03/2014, 15h09
  4. Réflexion sur une architecture logicielle
    Par khayyam90 dans le forum Développement 2D, 3D et Jeux
    Réponses: 14
    Dernier message: 10/12/2006, 21h17
  5. Qu'est ce qu'une architecture logicielle?
    Par car dans le forum Architecture
    Réponses: 1
    Dernier message: 11/11/2004, 17h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo