Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2798 connectés 

  FORUM HardWare.fr
  Programmation
  Algo

  Gestion d'un "gap-buffer" dans un séquenceur MIDI

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Gestion d'un "gap-buffer" dans un séquenceur MIDI

n°2257798
par l'anne​au de l'ia
word master
Posté le 10-05-2015 à 23:18:04  profilanswer
 

Bonjour,
 
En réalité, je suis pas encore documenté ou très peu sur le Gap-Buffer dont je souhaiterais trouver une adaptation pour un séquenceur MIDI.
 
Donc j'ai une ou deux listes de mesures diverses et variées, j'ai une position courante dans une des deux listes, et j'ai deux curseurs à position variable dans les liste pour insérer ou supprimer des mesures.
Les mesures avant la position courante, ne peuvent pas être éditées car elle sont déjà jouées.
 
Donc, j'avais en tête de créer deux listes de mesures, une marquée "remain" l'autre "exhaust".
 
Mon buffer ne peut donc se trouver que dans remain.
 
Je cherche d'avantage d'information sur les gap-buffer, en français.
Je cherche des idée pour gérer mon truc.
 
S'il vous plait !
Merci.
 
Je pense,
 
Peut-être calculer les curseur "left" et "right" relativement à la position courante.
 
Par exemple, dans la liste remain, on aura toujours right après left et left après courant.
 
Donc calculer left de courant+N et right de courant+M.
 
avec courant<N ou M<= fin de séquence.
 
Ah oui, l'objectif est de pouvoir insérer ou supprimer des mesures dans la liste remain,
et de pouvoir écrire entre les deux curseurs.


Message édité par par l'anneau de l'ia le 10-05-2015 à 23:37:17

---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
mood
Publicité
Posté le 10-05-2015 à 23:18:04  profilanswer
 

n°2257802
par l'anne​au de l'ia
word master
Posté le 11-05-2015 à 03:55:30  profilanswer
 

Donc,
 
J'ai trois positions de trois curseur, le courant le gauche et le droit.
Les curseurs peuvent prendre des valeurs de 0.0s à 23:59:59.99h.
Donc mon curseur gauche sera à 24h max de mon curseur courant.
Et mon curseur droit à 24h max de mon curseur gauche.
 
Pour insérer et/ou supprimer des mesure (en spécifiant signature et tempo).
les donnée après insertion sont donc après 48h maximum de zone éditable.
 
Plutôt !
 
Voilà, je réfléchissais à voix haute.
 
Qu'en pensez vous ?


Message édité par par l'anneau de l'ia le 11-05-2015 à 03:56:42

---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
n°2257803
par l'anne​au de l'ia
word master
Posté le 11-05-2015 à 04:02:57  profilanswer
 

Editable, Editible, Editée !
 
Je ne sais plus.
 
En tout cas c'est pas simple.
Peut-être mesurer en mesure et fractions de mesure aussi !  :love:


---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
n°2257805
par l'anne​au de l'ia
word master
Posté le 11-05-2015 à 07:09:51  profilanswer
 

Bonjour,
 
Je pense que j'ai trouvé un truc pas mal pour avancer, c'est de faire un séquenceur qui donnee l'heure.
On écrit l'heures au fur et à mesure qu'on crée des mesure on boucle toutes les 48h
Dans un autre process on attend l'heure indiquée par le séquenceur.
 
De l'idée non ?


Message édité par par l'anneau de l'ia le 11-05-2015 à 07:11:19

---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
n°2257806
par l'anne​au de l'ia
word master
Posté le 11-05-2015 à 07:30:57  profilanswer
 


Pour faire ça : une liste chaîné (circulaire mais c'est pour looper sur 48h) je commence avec :
 
- une mesure à l'heure 0.0s ;
- une mesure à l'heure 86399.0s ;
- une mesure à l'heure 172799.0s,
 
et trois pointeurs sur la première mesure.
 
Je peux alors ajouter autant de mesure la ou je souhaite d'ici 47:59:59.99h.
 
Qu'en pensez vous ?
 
S'il vous plait !
 
Merci.


---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
n°2257807
par l'anne​au de l'ia
word master
Posté le 11-05-2015 à 08:46:15  profilanswer
 

Je reviens avec du code avec Ada.
 
Donc, avec Ada.... Un paquetage generique, qui va en fait prendre la durée minimum d'un projet en paramètre.
 

Code :
  1. with Ada.Calendar;
  2. use Ada.Calendar;
  3. generic
  4.   Laps_Time : Day_Duration := 86400.0;
  5.            
  6. package Computing is
  7.  
  8.   subtype Laps_Type is Duration range 0.0..(Laps_Time * 2.0)-1.0;
  9.  
  10.   type Step_Record is
  11.      record
  12.         Tempo : Float := 120.0;
  13.         Hours : Laps_Type := 0.0;
  14.      end record;
  15.   type Step_Set is array (Positive range <> ) of Step_Record;
  16.  
  17.   type Step_Sequencer_Record(Size : Positive) is
  18.      record
  19.         Set : Step_Set(1..Size);
  20.      end record;
  21.  
  22.   type Bar_Type;
  23.   type Bar_Access is access all Bar_Type;
  24.   type Bar_Type(Step_Max : Positive) is
  25.      record
  26.         Steps : Step_Sequencer_Record(Step_Max);
  27.         Next  : Bar_Access;
  28.      end record;
  29.  
  30.   type Bar_Sequencer_Record is
  31.      record
  32.         Left_Min  : Bar_Access;
  33.         Left_Max  : Bar_Access;
  34.         Right_Max : Bar_Access;
  35.      end record;
  36.  
  37.   type Buffered_Bar_Sequencer_record is
  38.      record
  39.         Bar_Sequencer : Bar_Sequencer_Record;
  40.         Current       : Bar_Access;
  41.         Left          : Bar_Access;
  42.         Right         : Bar_Access;
  43.      end record;
  44.  
  45.  
  46.   procedure Inssert_Bars_Before
  47.     (Buffered_Bar_Sequencer : in out Buffered_Bar_Sequencer_Record;
  48.      Left, Right,           : in out Bar_Access;
  49.      Bars                   : in Bar_Sequence_Record);
  50.   procedure Remove_Bars_Between
  51.     (Buffered_Bar_Sequencer : in out Buffered_Bar_Sequencer_Record;
  52.      Left, Right,           : in out Bar_Access);
  53. end Computing;


 
Après on poura selection pour copier et coller des mesures.
 
Je sais pas bien si ça tient la route par contre.


Message édité par par l'anneau de l'ia le 11-05-2015 à 08:47:30

---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
n°2257847
par l'anne​au de l'ia
word master
Posté le 11-05-2015 à 13:37:43  profilanswer
 

Bonjour,
 
Je sais pas si ça va être efficace mais ça tourne.
 
 
D'abord j'ai initialisé ma liste.

Code :
  1. Right_Max : constant Bar_Access := new Bar_Type ' (1, (1, (others => (120.0, Laps_Type'Last))), Next => null);
  2.   Left_Max  : constant Bar_Access := new Bar_Type ' (1, (1, (others => (120.0, Laps_Time-1.0))), Next => Right_max);
  3.   Left_Min  : constant Bar_Access := new Bar_Type ' (1, (1, (others => (120.0, 0.0))), Next => Left_Max);
  4.  
  5.  
  6.   type Buffered_Bar_Sequencer_record is
  7.      record
  8.      Bar_Sequencer : Bar_Sequencer_Record := (Left_Min, Left_Max, Right_Max);
  9.      Current       : Bar_Access := Left_Min;
  10.      Left          : Bar_Access := Left_Min;
  11.      Right         : Bar_Access := Left_Min;
  12.      In_Loop       : Boolean := False;
  13.      end record;
  14.  
  15.  
  16.   procedure Initialize(Bufferd_Bar_Sequencer : out Buffered_Bar_Sequencer_Record;
  17.             In_Loop : in Boolean := False) is
  18.   begin
  19.      Bufferd_Bar_Sequencer.current := Bufferd_Bar_Sequencer.Bar_Sequencer.Left_Min;
  20.      Bufferd_Bar_Sequencer.Left := Bufferd_Bar_Sequencer.Bar_Sequencer.Left_Min;
  21.      Bufferd_Bar_Sequencer.Right := Bufferd_Bar_Sequencer.Bar_Sequencer.Left_Max;    
  22.      Bufferd_Bar_Sequencer.In_Loop := In_Loop;      
  23.      if In_Loop then
  24.      if Bufferd_Bar_Sequencer.Left /= null then
  25.         Bufferd_Bar_Sequencer.Right.Next :=
  26.           Bufferd_Bar_Sequencer.Left;
  27.      end if;
  28.      end if;
  29.       
  30.   end Initialize;


 
J'ai implémenté une fonction set_Next pour passer d'élément en élément.

Code :
  1. function Set_Next
  2.     (Buffered_Bar_Sequencer : in out Buffered_Bar_Sequencer_Record) return Boolean is
  3.   begin
  4.      if Buffered_Bar_Sequencer.Current.Next /= null then
  5.      Buffered_Bar_Sequencer.Current :=
  6.        Buffered_Bar_Sequencer.Current.Next;    
  7.      if Buffered_Bar_Sequencer.Left.Next /= null then
  8.         Buffered_Bar_Sequencer.Left :=
  9.           Buffered_Bar_Sequencer.Left.next;
  10.      end if;
  11.      if Buffered_Bar_Sequencer.Right.Next /= null then
  12.         Buffered_Bar_Sequencer.Right :=
  13.           Buffered_Bar_Sequencer.Right.next;
  14.      end if;    
  15.      return True;
  16.      else
  17.      return False;
  18.      end if;    
  19.   end Set_Next;


 
 
J'ai initialisé un timeout :

Code :
  1. procedure Play (Widget : access Gtk_Widget_Record'class;
  2.                   Main_Window : in Ultrason_Access) is
  3.          
  4.      
  5.      
  6.   begin
  7.            
  8.      Main_Window.Transport_Play :=
  9.     Ultrason_G_Source.Timeout_Add(1,
  10.                       Set_Next'Access,
  11.                       Main_Window);
  12.      
  13.      
  14.   end Play;


 
Et écris une fonction interface :

Code :
  1. function Set_Next (Ultrason : Ultrason_Access) return Boolean is
  2.      Verax : Boolean := My_Computing.Set_Next(Ultrason.Buffered_Bar_Sequencer);
  3.   begin
  4.      if Verax then
  5.      Set_Text(Ultrason.Position, Formatting.Image(Ultrason.Buffered_Bar_Sequencer.Current.Steps.Set(1).Hours, true));
  6.      Set_Text(Ultrason.Cursor_Left, Formatting.Image(Ultrason.Buffered_Bar_Sequencer.Left.Steps.Set(1).Hours, true));
  7.      Set_Text(Ultrason.Cursor_Right, Formatting.Image(Ultrason.Buffered_Bar_Sequencer.right.Steps.Set(1).Hours, true));
  8.      end if;
  9.      return Verax;
  10.      
  11.   end Set_Next;


---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
n°2257869
par l'anne​au de l'ia
word master
Posté le 11-05-2015 à 15:34:27  profilanswer
 

Merci Gilou !  :love:


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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Algo

  Gestion d'un "gap-buffer" dans un séquenceur MIDI

 

Sujets relatifs
[Ada][GtkAda][MIDI][Virtual Composer] Plug-ins oriented-various basedBonnes pratiques pour une gestion de stocks très basique
gestion nom domaine site wp sur mon synoGestion d'un fichier .csv
Best practices pour la gestion de sessions pour une appli webgestion de dossiers en vb
Gestion et "regroupement" des déplacementsInsertion dynamique & gestion de la position dans la page
Gestion de Base de données partagées ExcelNouveau projet informatique de gestion du trafic routier
Plus de sujets relatifs à : Gestion d'un "gap-buffer" dans un séquenceur MIDI


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR