Publicité

Annonce

Réduire
Aucune annonce.

un projet level 11 : Ultrason (compositeur virtuel pour instruments MIDI)

Réduire
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • un projet level 11 : Ultrason (compositeur virtuel pour instruments MIDI)

    Bonjour,

    Vous me connaissez peut-être, je suis amateur en programmation informatique et musicale.
    Je compose et j'écris des programme pour instrument midi.
    Appelé couramment compositeur virtuel mes programmes génèrent des instructions MIDI à destination des instruments.

    La génération d'instruction midi est un défi d'art et d'imagination que tout bon compositeur doit relever pour produire une musique agréable.
    Comment alors parvenir à cette finalité avec un simple ordinateur ?

    La création d'un programme qui réaliserait cette prouesse est une question d'ingénierie de haute voltige.
    J'espère alors que vous ne serez pas deçu de ma présentation, en avant première et avant production, d'un programme à ma porté.

    Mon programme est orienté plug-ins, c'est à dire que l'on sélectionne un ensemble d'un nombre de type de générateur, fixé par l'utilisateur, dans une liste définie, que l'utilisateur configure pour générer la musique qu'il désire grâce au instruments MIDI connectés à l'ordianteur.

    Comme plug-in générateur, j'ai l'intention d'écrire des générateurs à base d'algorithlme génétique, réseaux de neurones, et d'autres méthode à définir peut-être.
    Pour vous présenter plus en détail le projet, le programme est écrit avec le langage Ada et utilise la bibliothèque graphique GtkAda pour l'interface H/M.

    Ultrason sera, théoriquement ! Multi-instrument, multi-timbral, avec des fonction timbre swap et program change et incluera un sequenceur de modulation.
    Le sequeneur de modulation permetra durant le jeu du compositeur d'enregistrer et/ou de jouer une sequence de modulation jouée en temps réel.

    Pour suivre l'évolution de ce programme depuis sa naissance dirais-je, je vous invite à suivre ce fil.

    En image à l'heure qu'il est l'ouverture du programme provoque l'affichage d'un message qui nous invite à choisir le nombre maximum de plug-in utilisé dans le jeu.
    Ultrason.jpg

    Vous pouvez aussi vous rendre sur Sourceforge pour récupérer les sources :


    Il vous faudra alors un compilateur Gnat avec GtkAda pour obtenir ce programme pour Gnu/Linux.

    Mais pour le moment, il ne fait absolument rien à par écrire quelque message dans le terminal.
    Loin d'être intégré donc, ce prototype fonctionnel est un freeware open source pour le bonheur de l'open mind.

    J'espère donc votre contribution active et constructive pour mener ce projet au level qu'il mérite.
    Si vous êtes programmeur ou si vous avez de l'inspiration je suis preneur.
    Fichiers attachés
    Dernière modification par jovalise, 30 avril 2015, 10h04.
    Lightman : a small MIDI composer : download

  • #2
    Ultrason 2015-0.1.1

    Bonjour.

    Ultrason est aujourd'hui en version 2015-0.1.1.

    Voici un rapport d'analyse de l'objet Application ak Ultrason :

    J'ai découpé le problème en trois couche (architecture 3-tiers)

    Menus permettant de modifier des paramètres 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.

    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 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.

    supprimer, nouveau, type, nom, ID, Edit, Save, Load.

    Flux d'information en temps réel selon la vue (périphériques ou plugins).

    Sources, destinations, type, data1, data2, time.

    Et définit une classe d'objets MIDI :


    Classe de plugins, permettant de générer et gérer un workflow musical avancé.

    Harmonie, Rythmie, Génétique, Program_Change, Timbre_Swap, breaks, signature, tempo,
    Sysex, sous_séquenceur, séquenceur_de_modulation, Arpeggiator, Programmable, I.A.




    Synthèse :


    ---------------------------------------------------------------
    -- flots --> nil --> le flox passe par une oreille et repart part l'autre.
    -- views --> user --> ou pas, le musicien peut encore agire.
    -- menus --> file --> en étant assurer de respecter le cadre qu'il a définit.
    -- class --> M.I.D.I. --> grâce aux divers objets MIDI.
    -- |- Modify/Save/Quit
    ---------------------------------------------------------------
    Dernière modification par jovalise, 08 mai 2015, 10h36. Motif: Ajout de la synthèse.
    Lightman : a small MIDI composer : download

    Commentaire


    • #3
      Bonjour,

      Je viens vous présenter en image la version 0.1.6 du programme Ultrason.
      Ultrason-2015-0.1.6.jpg
      Image que j'espère correspondra à la forme finale du logiciel.
      De haut en bas, après les menus, à gauche les flox MIDI, à droite en haut les périphériques, en bas les plugins et en fin au bas de fenêtre un espace réservé au transport.
      Après ça c'est facile à faire.
      Vous trouverez les sources sur Sourceforge en cherchant Ultrason.
      Ne compile en l'état que sur Gnu/Linux et encore, j'ai utilisé un bibliothèque qui n'est pas disponible sur Windows, je ne sais plus très bien ou j'en suis.
      Je cherche un solution.
      L'application n'est pas terminé mais enfin, on devrait l'avoir sur Gnu/Linux d'ici la fin de l'annnée, peut-être meme de l'été.
      Lightman : a small MIDI composer : download

      Commentaire


      • #4
        Bonsoir, ou bonjour.

        Je reviens pour vous demander un avis ultime sur la conception du problème.

        D'abord pour visualiser ma solution, un image de la zone "transport" de l'application :
        Transport-0.1.8.jpg

        De gauche à droite, en haut le transport général, en bas le transport des plugins permettant d'enregistre une séquence de modulation, la zone vide est celle de la signature.
        En suite plus à droite, en haut une zone vide destiné à afficher la position dans un format spécial, en bas une durée sur 24heures indiquant l'écoulement du projet en cours ; Et enfin plus à droite en haut la position relative à la position courante du curseur gauche noté L et en bas le curseur droit noté R.

        Tout ca est intéressant si on aborde la raison de ces choix. Les curseurs permete à la fois id'insérer des mesures au curseur left de dimention : curseur left-curseur right, et d'envoyer des données entre les curseurs.

        Bonne nuit. ou bonne journée.
        Lightman : a small MIDI composer : download

        Commentaire


        • #5
          Re- bonjour,

          Un peu de code ?


          Je pense que ça vaut le détour, j'ai, je pense implémenté le mieu que je savait en tout cas, un séquenceur dans l'idée de l'un d'entre vous me semble t-il qui m'avait souflé de gérer le positionnement et la durée des note grace au temps, directement dirais- je, plutôt que de gérer des mesure est 1/4 de mesure et 1/16 et ainsi de suite.

          Du coup mon séquenceur resemble à une liste chaîné circulaire ou pas selon un attribut "en boucle" de mesures gérér grace à trois pointeurs, une position courante, un curseur gauche et un curseur droit pour insérer, suprimer des mesure entre les curseur, selection, copier/colled des données entre les curseur.

          J'ai pas terminé quand même ! Vous pensez bien.

          Voici un code avec le language Ada, ma fois for simple à comprendre.
          D'abord la spécification ou entête, partie déclarative du programme, du séquenceur.
          Code:
          with Ada.Calendar;
          use Ada.Calendar;
          generic
             Laps_Time : Day_Duration := 86400.0;
          package Ultrason.Computing is
          
             subtype Laps_Type is Duration range 0.0..Laps_Time * 2.0-1.0;
          
             type Step_Record is
                record
                   Tempo : Float := 120.0;
                   Hours : Laps_Type := 0.0;
                end record;
             type Step_Set is array (Positive range <>) of Step_Record;
          
             type Step_Sequencer_Record(Size : Positive) is
                record
                   Set : Step_Set(1..Size);
                end record;
          
             type Bar_Type;
             type Bar_Access is access all Bar_Type;
             type Bar_Type(Step_Max : Positive) is
                record
                   Steps : Step_Sequencer_Record(Step_Max);
                   Next  : Bar_Access;
                end record;
          
          
             Right_Max : constant Bar_Access := new Bar_Type ' (1, (1, (others => (120.0, Laps_Type'Last))), Next => null);
             Left_Max  : constant Bar_Access := new Bar_Type ' (1, (1, (others => (120.0, Laps_Time-1.0))), Next => Right_max);
             Left_Min  : constant Bar_Access := new Bar_Type ' (1, (1, (others => (120.0, 0.0))), Next => Left_Max);
          
          
             type Bar_Sequencer_Record is
                record
                   Left_Min  : Bar_Access;
                   Left_Max  : Bar_Access;
                   Right_Max : Bar_Access;
                end record;
          
             type Buffered_Bar_Sequencer_record is
                record
                   Bar_Sequencer : Bar_Sequencer_Record := (Left_Min, Left_Max, Right_Max);
                   Current       : Bar_Access := Left_Min;
                   Left          : Bar_Access := Left_Min;
                   Right         : Bar_Access := Left_Min;
                   In_Loop       : Boolean := False;
                end record;
             procedure Initialize(Bufferd_Bar_Sequencer : out Buffered_Bar_Sequencer_Record;
                                  In_Loop : in Boolean := False);
             procedure Set_In_Loop(Bufferd_Bar_Sequencer : in out Buffered_Bar_Sequencer_Record;
                                   In_Loop : in Boolean := True);
             function is_In_Loop(Bufferd_Bar_Sequencer : in Buffered_Bar_Sequencer_Record) return Boolean;
             procedure Inssert_Bars_Before
               (Buffered_Bar_Sequencer : in out Buffered_Bar_Sequencer_Record;
                Left, Right           : in out Bar_Access;
                Bars                   : in Bar_Sequencer_Record);
             procedure Remove_Bars_Between
               (Buffered_Bar_Sequencer : in out Buffered_Bar_Sequencer_Record;
                Left, Right           : in out Bar_Access);
             -- Select region.                                                                                                                                                                                                
             -- Copy region.                                                                                                                                                                                                  
             -- Paste region.                                                                                                                                                                                                 
             function Set_Next
               (Buffered_Bar_Sequencer : access Buffered_Bar_Sequencer_Record) return Boolean;
          
          end ultrason.Computing;

          L'implémentation : la partie exécution (suite d'instructions) du programme à exécuter

          Juste l'initialisation, et une fonction qui nous permet de nous déplacer dans le temps (voir Set_Next).

          Code:
          package body Ultrason.Computing is
             procedure Initialize(Bufferd_Bar_Sequencer : out Buffered_Bar_Sequencer_Record;
                                  In_Loop : in Boolean := False) is
             begin
                Bufferd_Bar_Sequencer.current := Bufferd_Bar_Sequencer.Bar_Sequencer.Left_Min;
                Bufferd_Bar_Sequencer.Left := Bufferd_Bar_Sequencer.Bar_Sequencer.Left_Min;
                Bufferd_Bar_Sequencer.Right := Bufferd_Bar_Sequencer.Bar_Sequencer.Left_Max;
                Bufferd_Bar_Sequencer.In_Loop := In_Loop;
                if In_Loop then
                   if Bufferd_Bar_Sequencer.Left /= null then
                      Bufferd_Bar_Sequencer.Right.Next :=
                        Bufferd_Bar_Sequencer.Left;
                   end if;
                end if;
          
             end Initialize;
          
             procedure Set_In_Loop(Bufferd_Bar_Sequencer : in out Buffered_Bar_Sequencer_Record;
                                   In_Loop : in Boolean := True) is
             begin
                Bufferd_Bar_Sequencer.In_Loop := In_Loop;
             end Set_In_Loop;
          
             function is_In_Loop(Bufferd_Bar_Sequencer : in Buffered_Bar_Sequencer_Record) return Boolean is
             begin
                return Bufferd_Bar_Sequencer.In_loop;
             end Is_In_Loop;
          
             procedure Inssert_Bars_Before
               (Buffered_Bar_Sequencer : in out Buffered_Bar_Sequencer_Record;
                Left, Right           : in out Bar_Access;
                Bars                   : in Bar_Sequencer_Record) is
             begin
                null;
             end Inssert_Bars_Before;
          
             procedure Remove_Bars_Between
               (Buffered_Bar_Sequencer : in out Buffered_Bar_Sequencer_Record;
                Left, Right           : in out Bar_Access) is
             begin
                null;
             end Remove_Bars_Between;
          
             -- Select region.                                                                                                                                                                                                
             -- Copy region.                                                                                                                                                                                                  
             -- Paste region.                                                                                                                                                                                                 
          
             function Set_Next
               (Buffered_Bar_Sequencer : access Buffered_Bar_Sequencer_Record) return Boolean is
             begin
                if Buffered_Bar_Sequencer.Current.Next /= null then
                   Buffered_Bar_Sequencer.Current :=
                     Buffered_Bar_Sequencer.Current.Next;
                   if Buffered_Bar_Sequencer.Left.Next /= null then
                      Buffered_Bar_Sequencer.Left :=
                        Buffered_Bar_Sequencer.Left.next;
                   end if;
                   if Buffered_Bar_Sequencer.Right.Next /= null then
                      Buffered_Bar_Sequencer.Right :=
                        Buffered_Bar_Sequencer.Right.next;
                   end if;
                   return True;
                else
                   return False;
                end if;
             end Set_Next;
          end ultrason.Computing;
          Et ça tourne.

          Un inconvéniant pour le moment, la durée minimal d'un morceau est fixé à la compilation, c'est à dire qu'il est nécessaire d'écrire dans les sources du programme pour modifier cette durée et recompiler le programme.

          un avantage, on peut jouer 48heures sans boucler.
          Un nouveau Screenshot sur Gnu/Linux :
          Ultrason-2015-0.2.2.jpg

          En version 0.2.2 disponible sur Sourceforge projet ultrason.

          Il reste à écrire chacun des plugins, la gestion des périphériques et le routages des méssages, en gros, mais c'est pas rien quand même.
          Merci.
          Lightman : a small MIDI composer : download

          Commentaire


          • #6
            Bonjour, bonsoir.

            En espérant vous faire plaisir ou vous intéresser dans un premier temps à mon projet qui commence à être fonctionnel, je viens vous vous présenter avec un nouveau screenshot l'avancement du projet.
            Ultrason-2015-0.2.8.jpg

            Donc en cliquant sur les checkbox de la colonne edit on ouvre une boite de dialogue qui nous demende le type de de plug-in ou de périphérique utilisé.
            Dans les devices, une autre boite de dialogue s'afficher après la selection du type de périphérique nous proposant de selectionner une entrée et une sortie.
            Les colonne Names son éditable pas l'utilisateur, la check box de la colonne edit, permetra d'afficher le flux midi en provennance ou à destination des périphériques et plug-ins dans la table flow.
            Lightman : a small MIDI composer : download

            Commentaire


            • #7
              Bonjour,

              J'arrive à la phase la plus plaisante, musicalement parlant, celle de développer les plug-in générateurs d'instruction MIDI.
              Mais avant de générer une instruction MIDI il faut créer une partition.
              Pour faire ceci, je vais développez un plug-in particulier, peut-être entre autres, le Band Master (ou chef d'orchestre) qui aura pour rôle de décider de la signature, du tempo et des instruments à mettre en jeu à un moment ou à un autre.

              Après j'ai quelque plug-in générateur de notes : Genetic, Arpeggiateur, Harmonic, Melodic, Rythmic.
              Et quelque plug-in de gestion des instruments : timbre swap, program change, tempo sync, messages SysEx.

              Reste les plug-ins spéciaux : Mod séquenceur, Step séquenceur, programmable, auto-initialisation.

              Et il me reste un emplacement !

              Auriez vous une idée d'un plug-in que je devrais ajouter à mon compositeur ?
              S'il vous plait ?
              Merci.


              Et j'ai une autre requête à vous adresser concernant les catégories d'instruments :
              J'ai pris exemple un peu ou carrément sur le Radias qui propose 16 catégories d'instrument, mais j'en ai oublié, bref, je souhaiterais savoir si les catégories suivante sont pertinante et quelles sont les manquantes ?

              • - lead
              • - bass
              • - string
              • - pad
              • - fx
              • - synth
              • - keyboard
              • - drum
              • - drums kit
              • audio in


              S'il vous plait !
              Merci.
              Dernière modification par jovalise, 13 mai 2015, 09h45.
              Lightman : a small MIDI composer : download

              Commentaire


              • #8
                Je rajouterais bien des sections instruments à percussions (vibraphone...), brass (cuivres...), guitares, orgues / accordéons et à vent.
                La musique c'est la vie en bleu avec... Midjay+, Motif 7 et XF, Pa50, Pa2x, Pa600, clavier maître UF8, Triton, Pa500M88, Zoom H6 et systèmes Linux Debian 9, 10, 11, 12, SID Librazik 2, 3, 4, Mx21 et Ubuntu Studio 18.04, 20.04, 22.04, 23.04 en MAO... ...en fait juste un piano droit son type "bastringue" me suffirait aussi !

                Commentaire


                • #9
                  Merci BluedId !

                  J'en ai rajouté, mais ce sera parramettrable de toute manière.

                  Merci !
                  Lightman : a small MIDI composer : download

                  Commentaire


                  • #10
                    Tu peux aussi te baser sur la norme GM (General Midi) au niveau organisation des sons : http://fr.wikipedia.org/wiki/General_MIDI
                    La musique c'est la vie en bleu avec... Midjay+, Motif 7 et XF, Pa50, Pa2x, Pa600, clavier maître UF8, Triton, Pa500M88, Zoom H6 et systèmes Linux Debian 9, 10, 11, 12, SID Librazik 2, 3, 4, Mx21 et Ubuntu Studio 18.04, 20.04, 22.04, 23.04 en MAO... ...en fait juste un piano droit son type "bastringue" me suffirait aussi !

                    Commentaire


                    • #11
                      Merci pour le lien !

                      Pour le moment, c'est comme ça :

                      "lead"
                      "bass"
                      "string N pad"
                      "Guitar N Pluck"
                      "s e"
                      "synth hard"
                      "synth soft"
                      "keyboard"
                      "hit N drum"
                      "drums kit"
                      "audio in"
                      "motion"
                      "bell N Decay"
                      "arp seq"
                      "voccoder"
                      "user"
                      Lightman : a small MIDI composer : download

                      Commentaire


                      • #12
                        "s e" ?
                        La musique c'est la vie en bleu avec... Midjay+, Motif 7 et XF, Pa50, Pa2x, Pa600, clavier maître UF8, Triton, Pa500M88, Zoom H6 et systèmes Linux Debian 9, 10, 11, 12, SID Librazik 2, 3, 4, Mx21 et Ubuntu Studio 18.04, 20.04, 22.04, 23.04 en MAO... ...en fait juste un piano droit son type "bastringue" me suffirait aussi !

                        Commentaire


                        • #13
                          Je sais pas en réalité ce que signifie S E, c'est la classification du Radias, mais pour moi ce sont les effet spéciaux.
                          Lightman : a small MIDI composer : download

                          Commentaire


                          • #14
                            Rajoute donc Radias S E
                            La musique c'est la vie en bleu avec... Midjay+, Motif 7 et XF, Pa50, Pa2x, Pa600, clavier maître UF8, Triton, Pa500M88, Zoom H6 et systèmes Linux Debian 9, 10, 11, 12, SID Librazik 2, 3, 4, Mx21 et Ubuntu Studio 18.04, 20.04, 22.04, 23.04 en MAO... ...en fait juste un piano droit son type "bastringue" me suffirait aussi !

                            Commentaire


                            • #15
                              Ben non alors.

                              S E, est le nom d'une catégory de son. Je pourais l'appeller Fx, genre un son de train, ou de sonar.
                              Lightman : a small MIDI composer : download

                              Commentaire

                              Chargement...
                              X