Welcome to %s forums

BrainModular Users Forum

Login Register

de l'aide pour un script

j'ai besoin d'aide sur un patch
Post Reply
Charlie O.
New member
Posts: 8
Contact:

de l'aide pour un script

Unread post by Charlie O. » 05 Feb 2026, 17:05

Salut tout le monde,

hélas je n'abouti à rien qui compile..

le script doit modifier un flux midi : sélectionner la dernière note jouée (ou la plus élevée en cas de simultanéité), la garder "On" même après le dernier "note off", en attendant le "note On" suivante (donc un jeu légato et monodique), mais en arrêtant tout si l'on rejoue la dernière note.

Do, Ré, Mi, Mi en entrée donne Do--Ré--Mi--Stop

En pratique pour jouer des notes tenues sans avoir à garder la touche enfoncée.

Le script "Set Monophonic" me parait un bon point de départ, mais après ça se gate..

Code: Select all

//////////////////////////////////////////////////////////////
// Set monophonic
// transforms a polyphonic midi flow into a monophonic
/////////////////////////////////////////////////////////////
// parameters declaration
var input     : Tparameter;
var output     : Tparameter;
var active     : Tparameter;

var i            : integer;

// initialisation : create parameters
procedure init;
begin  
 Active := CreateParam('on',ptswitch,pioInput);
 Input := CreateParam('midi in',ptMidi,pioInput);  
 Output := CreateParam('midi out',ptMidi,pioOutput);    
                                        
 Active.asFloat(1);  

 ModuleColor($FF3298DB);  
end;

// Global variables
var nb1     : integer;
var Miditmp : TMidi;
var lastsend : integer;
var incr : integer;
//////////////////////////////
// main proc
//////////////////////////////
Procedure Process;
begin
 nb1 := input.Length;  
 if Active.equal1
 then begin
   incr := 0;
   if nb1 > 0
   then begin
      for i := 0 to nb1-1        
      do begin
        MidiTmp := input.asMidi(i);  
        if MidiTmp.msg=144
         then begin
            Miditmp.msg := 128;
            MidiTmp.data1 := lastSend;
            incr := incr +1;
            output.asMidi(i+incr-1,Miditmp);  // set note off
            MidiTmp := input.asMidi(i);
            output.asMidi(i+incr,Miditmp);
            LastSend := MidiTmp.data1;
         end
         else  output.asMidi(i+incr,Miditmp);
       end;
   end;
   output.Length(nb1+incr);
  end
  else                    
  begin
      for i := 0 to nb1-1        
      do begin
        MidiTmp := input.asMidi(i);  
        output.asMidi(i,Miditmp);
      end;
      output.Length(nb1);
  end;
end;

Merci !

Who is online

Users browsing this forum: No registered users and 2 guests