Welcome to %s forums

BrainModular Users Forum

Login Register

Besoin d'aide pour le scripting

discutons de sujets variés
Post Reply
divers69
Member
Posts: 12
Contact:

Unread post by divers69 » 28 May 2018, 10:24

Bonjour à tous, content d'être là et d'être un nouvel utilisateur d'Usine !

Je suis très intéressé par l’aspect scripting du logiciel mais j’ai un peu du mal avec ce langage et les exemples fournis ne me permettent pas d’y voir plus clair (je suis plus à l’aise avec l’asp ou le javascript pour le web).
Besoin d'aide !

Voici ce que je souhaiterais faire :
Dans un rack, placer un fichier wav puis ajouter 5 autres fichiers wav dans la liste.

Le script devra :

Lire le premier pendant une durée définie (par exemple, 30 secondes) avant de se mettre en pause et de lancer le deuxième qui devra également être lu pendant une durée définie avant de se mettre en pause et de lancer le suivant, et ainsi de suite jusqu'au dernier.

J'aurais besoin de savoir comment :
- faire une boucle (for n=1 to 5)
- lancer la lecture du son n
- définir sa durée
- mettre sur pause
- passer au suivant (n+1)
- en option, (si possible) définir un fader entre deux extraits d’une durée 10 secondes.


Pouvez-vous m’aider et m'apporter quelques élément pour ce script? J'’aurais alors suffisamment d’éléments pour aller plus loin !
Sinon, des liens avec des exemples qui pourraient correspondre ?

Merci d'avance !

23fx23
Member
Posts: 2545
Contact:

Unread post by 23fx23 » 28 May 2018, 13:30

salut, voici un petit ex qui j'espere pourra t'aider un peu,
(ça fait un petit moment que je me suis pas servi du script alors ya tet plus simple, mais en gros ça marche^^)
la c pas vraiment une boucle qui me semble moins adaptée a ce cas de figure, mais il y a une variable file_number qui incremente et va piocher dans un array défini les durées maxi.
tu peux copier paste le texte ds un script et init ncompile:

Code: Select all

//////////////////////////////////////////////////////
const max_files = 5;            //global constant of number of files
//////////////////////////////////////////////////////
// Paramters declaration                                           
//////////////////////////////////////////////////////
var start : Tparameter;       //start button parameter                                    
var stop  : Tparameter;       //stop button parameter        
var playing : Tparameter;     // swicth of playing status                     
var paused : Tparameter;      // switch of paused status            
var pause_duration : Tparameter;    // parameter for pauseduration in seconds

var file_seconds: Tparameter;        //current file diplayed time
var pause_seconds: Tparameter;       //current pause displayed time                          
var file_number: Tparameter;         // current file number

var durations : array [0..max_files-1] of integer = [3,5,4,5,5];    
                            // file playing durations in seconds
// Global Variables
                                
  var file_num : integer;
  var file_time : single;                         
  var file_trigger_time : single;  
  var file_max_time : integer; 
  
  var pause_time : single;  
  var pause_trigger_time : single;
  var pause_max_time : single;  
  
  var run : boolean;
  var pause : boolean; 
                          
//////////////////////////////////////////////////////
// initialisation procedure
//////////////////////////////////////////////////////
procedure init;        //create ui parameters
begin  
 start := CreateParam('start',ptButton);
 SetIsOutput(start,false);      
 
 stop := CreateParam('stop',ptButton);           
 SetIsOutput(stop,false);  
 
 pause_duration := CreateParam('pause_duration',ptDataFader );
 SetIsOutput(pause_duration,false);
 SetFormat(pause_duration, '%.0f');
 SetMin(pause_duration,0);                                       
 SetMax(pause_duration,100); 
 SetValue(pause_duration,5);
 SetDefaultValue(pause_duration,5); 
 SetSymbol(pause_duration,'seconds');              
 
 playing := CreateParam('playing',ptSwitch);
 SetIsInput(playing,false);                                 
 
 file_seconds := CreateParam('file_seconds',ptDataFader );
 SetIsInput(file_seconds,false);
 SetFormat(file_seconds, '%.2f');
 SetMin(file_seconds,0);          
 SetMax(file_seconds,500);               
 SetDefaultValue(file_seconds,0);           
  
 file_number := CreateParam('file_number',ptDataFader );
 SetIsInput(file_number,false);
 SetMin(file_number,0);                       
 SetMax(file_number,max_files-1); 
 SetDefaultValue(file_number,0);                  
 
 paused := CreateParam('paused',ptSwitch);
 SetIsInput(paused,false);   
 
 pause_seconds := CreateParam('pause_seconds',ptDataFader );
 SetIsInput(pause_seconds,false);
 SetFormat(pause_seconds, '%.2f');
 SetMin(pause_seconds,0);          
 SetMax(pause_seconds,30);               
 SetDefaultValue(pause_seconds,0); 
 SetSymbol(pause_seconds,'seconds');             
  
 //init variables                                                  
 file_num := 0;
 file_time := 0;  
 file_max_time = 500;                      
 file_trigger_time := 0;    
 pause_time := 0;  
 pause_trigger_time := 0;
 pause_max_time := 5;    
 run := false;                 
 pause := false; 

end;                                                   
         

/////////////////////////////////////////////
Procedure RESET()
begin   

   file_trigger_time := time;  
   file_time := 0; 
   file_max_time := 100000; 
   setvalue(file_seconds,0);
                                                           
   if (file_num >= max_files) then                     
   begin
   run := false;
   setvalue(file_number,0); 
   setvalue(playing,0);
   end;
   

end;     
/////////////////////////////////////////
Procedure PAUSE_PROC()                          
begin                            
   pause := true; 
   setvalue(paused,1);   
   pause_trigger_time := time;
   run := false;
end;                                                 
///////////////////////////////////////////
Procedure Callback (n: integer)
begin 
                                   
         if( n = start) then  
         begin                            
          file_num := 0;
          file_trigger_time := time;                   
          run := true; 
          pause_max_time := getvalue(pause_duration);
         end; 
         
         if( n = stop) then  
         begin                               
          run := false;
          setvalue(file_seconds,0);
          setvalue(file_number,0);
          setvalue(playing,0);             
         end; 
         
end; //callback               
//////////////////////////////////////////////////////
// Main Loop procedure
//////////////////////////////////////////////////////
Procedure Process;
begin   

  if (pause) then 
  begin 
   setvalue(playing,0);
   pause_time := (time - pause_trigger_time) * 100000; //as time is in nanosed    
   setvalue(pause_seconds, pause_time); 
  
    if (pause_time >= pause_max_time ) then 
     begin 
      pause := false;             
      setvalue(paused,0);                 
      setvalue(pause_seconds, 0);
      run:= true;
      RESET();       //reset file second counter            
     end;
  
  end;

  
  if (run) then                        
  begin                                            
   setvalue(playing,1);
   file_time := (time - file_trigger_time) * 100000;   //as time is in nanosec
   setvalue(file_seconds,file_time);  
                  
   file_max_time := durations[file_num];  //check in array what is max_time  
                       
  if (file_time >= file_max_time) then    // if over          
   begin
    PAUSE_PROC();                          //start pause procedure    
    inc(file_num);                         // increment file number        
    setvalue(file_number,file_num);        
   end;
  
  end;

end; //process
/////////////////////

divers69
Member
Posts: 12
Contact:

Unread post by divers69 » 28 May 2018, 13:39

Bonjour 23fx23, merci beaucoup ! Je regarde ça très vite et te dis.

divers69
Member
Posts: 12
Contact:

Unread post by divers69 » 28 May 2018, 15:44

Désolé, j'aurais peut-être dû commencer par là mais ... comment on fait pour associer ce script à mon patch ??
A partir de la bibliothèque, j'ai fait glisser sur mon sample un Empty Script que je retrouve dans le mode Edition du patch et dans lequel j'ouvre le script que tu m'as fourni.
Je lance ensuite la lecture mais ça ne fonctionne pas. J'ai oublié de faire quelque chose?
Pourtant, les paramètres file_seconds, file_number et pause_seconds bougent bien dans le mode édition
(voir www.sensomusic.org/forums/uploads.php?f ... -Usine.png).
Une idée ? Encore merci !
PS. Le copier/coller ne fonctionne pas dans le Script Editor Panel. Je suis obligé de créer un fichier texte que j'ouvre ensuite dans le panel. C'est normal?

23fx23
Member
Posts: 2545
Contact:

Unread post by 23fx23 » 28 May 2018, 16:09

le plus simple c'est de glisser un module empty script dans le patch a coté du sampler. /modules/scipts/empty script
quand tu double clic dessus, ça ouvre l'editeur. cliquer dedans, ctrl-A puis supp, ça vire tout.
copie le code ci dessus puis dans l'editeur, ctl v, (chez moi ça marche, c bizarre), puis compile and init.
la ça a créé le script, ensuite le plus simple c de relier le playing au play loop du sampler, et file_number au file number du sampler.
quand tu double clic sur le sampler, ça affiche la liste, ajouter les 5 fichiers, si ce nombre change l'editer dans le script , et l'array des durées voulues.
la si tu clic sur le bouton start du script, ça devrait les lire en sequences, avec la pause definie entre .

Image

divers69
Member
Posts: 12
Contact:

Unread post by divers69 » 28 May 2018, 16:36

C'est top, merci !
Encore des petites choses avant de tenter de me débrouiller tout seul :
- quand je relance la lecture du patch du début, comment faire pour que le script reparte lui aussi du début? Là, il reprend là où il s'est arrêté (file_number 2 par exemple).
- Si je ne veux pas de pause entre les extraits (file_seconds=0), y a-t-il un moyen de créer un fondu entre les deux extraits?
- Comment indiquer que la lecture de l'extrait commence à 10 secondes du début ?
- Quand les 5 morceaux sont lus, recommencer depuis le début 3 fois

Merci merci merci

23fx23
Member
Posts: 2545
Contact:

Unread post by 23fx23 » 28 May 2018, 17:22

le restart ça peut etre simplement un stop puis start. il ya un module dans /patching/patch control/ patch on activation qui envoie une pulsation quand le patch démarre.
du coup tu peux relier ça au stop du script, il attend un bloc avec un wait one /patching/wait puis il fait comme si ça rapuyait sur start
Image

le reste c'est un peu plus compliqué, pour un fondu il faudrait passer par 2 samplers, et que le script genere une valeur genre crossfade qui controle un crossfade entre les 2.
et qui controle le start/stop de chaque sampler en fonction.

pour le start pos sur le sampler il y a un parametre start pos , mais c'est en pourcentage par contre. si il fallait le definir par fichier il y a plusieurs solutions:
en patch utiliser un selector /data mix selector, le select etant controlé par le file number. ou un array , avec get array element value, avec les valeurs voulues entrées
sinon dans le script, recreer un array avec les valeurs de start, et quand le num de ficher change, regarder dans cet array et envoyer la valeur correspondant dans un nouveau parametre de sortie relié au sampleur.

pour recommencer 3 fois je ferais une variable loop_nb dans le script, initialisée a 0. quand le num_fichier est >= last fichier dans le bas du script cette valeur incremente.
il faut faire un check et genre quand elle est >= a 3 run := false; par exemple

edit: je te laisse essyer c'est un bon, exercice^^ sinon je te filerait une modif du script en ex un peu plus tard

divers69
Member
Posts: 12
Contact:

Unread post by divers69 » 28 May 2018, 17:27

OK, c'est parfait, je vais tenter tout ça. Merci encore et bonne soirée

23fx23
Member
Posts: 2545
Contact:

Unread post by 23fx23 » 28 May 2018, 18:12

je te mets un script modifié en cas qui loop 3 fois , tu peux editer la variable dans l'entete du script, ou te creer un parametre pour t'entrainer,
et un array pour definir les start_positions (il faut donc relier le start pos en sortie de script au start pos du sampler.

Code: Select all

//////////////////////////////////////////////////////
const max_files = 5;            //global constant of number of files 
const max_cycles = 3;           // how many times will cycle
//////////////////////////////////////////////////////
// Paramters declaration                                           
//////////////////////////////////////////////////////
var pstart : Tparameter;       //start button parameter                                    
var stop  : Tparameter;       //stop button parameter        
var playing : Tparameter;     // swicth of playing status                     
var paused : Tparameter;      // switch of paused status            
var pause_duration : Tparameter;    // parameter for pauseduration in seconds   
var start_pos : Tparameter;  
var current_cycle : Tparameter;

var file_seconds: Tparameter;        //current file diplayed time
var pause_seconds: Tparameter;       //current pause displayed time                          
var file_number: Tparameter;         // current file number

var durations : array [0..max_files-1] of integer = [3,5,4,5,5];    
                            // file playing durations in seconds 
var starts : array [0..max_files-1] of single = [0.10,0.25,0.0,0.12,0.50]; 
                             // files start pos 0 =0 1= 100 percent
                            
// Global Variables
  var cycle_nb : integer;  
                                     
  var file_num : integer;
  var file_time : single;                         
  var file_trigger_time : single;  
  var file_max_time : integer; 
  
  var pause_time : single;  
  var pause_trigger_time : single;
  var pause_max_time : single;  
  
  var run : boolean;
  var pause : boolean; 
                          
//////////////////////////////////////////////////////
// initialisation procedure
//////////////////////////////////////////////////////
procedure init;        //create ui parameters
begin  
 pstart := CreateParam('start',ptButton);
 SetIsOutput(pstart,false);      
 
 stop := CreateParam('stop',ptButton);           
 SetIsOutput(stop,false);  
 
 pause_duration := CreateParam('pause_duration',ptDataFader );
 SetIsOutput(pause_duration,false);
 SetFormat(pause_duration, '%.0f');
 SetMin(pause_duration,0);                                       
 SetMax(pause_duration,100); 
 SetValue(pause_duration,2);
 SetDefaultValue(pause_duration,5); 
 SetSymbol(pause_duration,'seconds');              
 
 playing := CreateParam('playing',ptSwitch);
 SetIsInput(playing,false);                                 
 
 file_seconds := CreateParam('file_seconds',ptDataFader );
 SetIsInput(file_seconds,false);
 SetFormat(file_seconds, '%.2f');
 SetMin(file_seconds,0);          
 SetMax(file_seconds,500);               
 SetDefaultValue(file_seconds,0);           
  
 file_number := CreateParam('file_number',ptDataFader );
 SetIsInput(file_number,false);
 SetMin(file_number,0);                       
 SetMax(file_number,max_files-1); 
 SetDefaultValue(file_number,0);                  
 
 paused := CreateParam('paused',ptSwitch);
 SetIsInput(paused,false);   
 
 pause_seconds := CreateParam('pause_seconds',ptDataFader );
 SetIsInput(pause_seconds,false);
 SetFormat(pause_seconds, '%.2f');
 SetMin(pause_seconds,0);          
 SetMax(pause_seconds,30);               
 SetDefaultValue(pause_seconds,0);   
 SetValue(pause_seconds,2);  
 SetSymbol(pause_seconds,'seconds');   
 
 start_pos := CreateParam('start_pos', ptDataFader);
 SetIsInput(start_pos,false); 
 SetFormat(start_pos, '%.2f');
 SetMin(start_pos,0);          
 SetMax(start_pos,100);               
 SetDefaultValue(start_pos,0); 
 SetSymbol(start_pos,'percent');
 
 current_cycle:= CreateParam('current_cycle',ptdatafield);
 setIsInput(current_cycle,false);
 
  
 //init variables                                                  
 file_num := 0;
 file_time := 0;  
 file_max_time = 500;                                   
 file_trigger_time := 0;                               
 pause_time := 0;  
 pause_trigger_time := 0;
 pause_max_time := 0;    
 run := false;                 
 pause := false; 
 setvalue(start_pos, starts[0]); 
 cycle_nb := 0;                       
 setvalue(current_cycle,0); 

end;                                                   
         

/////////////////////////////////////////////
Procedure RESET()
begin   

   file_trigger_time := time;  
   file_time := 0; 
   file_max_time := 100000; 
   setvalue(file_seconds,0);
                                                           
   if (file_num >= max_files) then                     
   begin
   inc(cycle_nb);
   setvalue(current_cycle,cycle_nb);
   file_num := 0;
   setvalue(file_number,0);   
   
    if(cycle_nb > max_cycles) then     //if over last cycle, completely stop    
    begin
      run := false;              
      setvalue(file_number,0);        
      setvalue(playing,0);  
    end
    else       //else only reset file nb to 0           
    begin                                       
       file_num := 0;
       setvalue(file_number,0);    
    end;
   end;
   

end;//reset     
/////////////////////////////////////////
Procedure PAUSE_PROC()                          
begin                            
   pause := true; 
   setvalue(paused,1);   
   pause_trigger_time := time;
   run := false;
end;                                                 
///////////////////////////////////////////
Procedure Callback (n: integer)
begin 
                                   
         if( n = pstart) then  
         begin   
          pause_max_time := getvalue(pause_duration);  
          file_num := 0; 
          setvalue(file_number,0);  
          cycle_nb := 0;   
          setvalue(current_cycle,0);  
          file_trigger_time := time;                   
          run := true; 
         end; 
         
         if( n = stop) then  
         begin                               
          run := false;
          setvalue(file_seconds,0);
          setvalue(file_number,0); 
          setvalue(current_cycle,0);  
          setvalue(playing,0);             
         end; 
         
         if(n = pause_duration) then
         begin
          pause_max_time := getvalue(pause_duration);
         end;
         
end; //callback               
//////////////////////////////////////////////////////
// Main Loop procedure
//////////////////////////////////////////////////////
Procedure Process;
begin   

  if (pause) then 
  begin 
   setvalue(playing,0);
   pause_time := (time - pause_trigger_time) * 100000; //as time is in nanosed    
   setvalue(pause_seconds, pause_time); 
  
    if (pause_time >= pause_max_time ) then 
     begin 
      pause := false;             
      setvalue(paused,0);                 
      setvalue(pause_seconds, 0);
      run:= true;
      RESET();       //reset file second counter            
     end;
  
  end;

  
  if (run) then                        
  begin                                            
   setvalue(playing,1);
   file_time := (time - file_trigger_time) * 100000;   //as time is in nanosec
   setvalue(file_seconds,file_time);  
                  
   file_max_time := durations[file_num];  //check in array what is max_time 

                       
  if (file_time >= file_max_time) then    // if over          
   begin
    PAUSE_PROC();                          //start pause procedure    
    inc(file_num);                         // increment file number        
    setvalue(file_number,file_num);     
    setvalue(start_pos, starts[file_num]); //check in array start pos and output to param  
   end;
  
  end;

end; //process
/////////////////////

divers69
Member
Posts: 12
Contact:

Unread post by divers69 » 29 May 2018, 09:13

Terrible ! Trop fort, merci !
Sans vouloir abuser, comment faire pour obtenir une info du sample ? je voudrais, par exemple, obtenir la valeur de DURATION. Et comment afficher des infos dans la fenêtre Trace (ou ailleurs)? Je veux, par exemple, vérifier l'info 'duration' du sample et le 'strat_pos' pour chaque extrait.
Merci encore

23fx23
Member
Posts: 2545
Contact:

Unread post by 23fx23 » 29 May 2018, 12:45

quand tu tire un cable par exemple de duration tu a 'trace_value' dans le menu, ça ça l'envoie vers la console si tu ouvre trace, (mais ça s'update que lorsqu 'il ya un changement).
ou tu peux cliquer sur le cable pour voir la valeur qui passe. sinon pour voir tout le temps tu peux simplement connecter un fader, et tu mets des valeurs max tres grandes. apres le fader tu peux le placer ou tu veux,
par ex quand tu clic sur l'icone 'oeil' du fader, dans "where", tu peux choisir top header ça le metra a coté du tempo.
si tu parlais du 'une variable dans un script tu peux utiliser la commande Writeln, ça trace dans la console (si tu clic sur trace, apres tu peux re-double cliquer dans la fenetre pour garder ouvert). writeln attends un string par contre, donc si tu veux tracer un nombre il faut le convertir par ex Writeln(IntToStr(5)); ou floattostr.
sinon perso des fois je me fais un parametre ptdtafield que j'apelle 'debug' et j'envoie les valeur que je veux verif dessus.

divers69
Member
Posts: 12
Contact:

Unread post by divers69 » 29 May 2018, 13:05

OK merci. Mais pour récupérer la valeur de duration dans le script, c'est quoi ?

23fx23
Member
Posts: 2545
Contact:

Unread post by 23fx23 » 29 May 2018, 15:01

je suis pas sur de comprendre, la valeur en sortie du sampler la recuperer dans le script? si c'est ça il faut creer un nouveau parametre dans le script, par ex un ptDatafield, et relier la sortie du sampler a l'entree du script. et faire un get value, dans la procedure callback par exemple;

tu peux mater les ex sur cette page, je la rajouterai si tu galere
http://www.sensomusic.org/manual/en/scr ... tutorial07

divers69
Member
Posts: 12
Contact:

Unread post by divers69 » 29 May 2018, 15:12

Oui, c'est exactement ça. OK, je commence à comprendre le principe. C'est énorme. Je pense pouvoir me débrouiller, merci à toi !

23fx23
Member
Posts: 2545
Contact:

Unread post by 23fx23 » 29 May 2018, 15:20

cool, wé en gros il faut toujours se dire quels parametres j'aurai besoin en entrée/sortie , les declarer, les creer, connecter le tout ,recuperer les valeurs, les traiter, regler les sortie, c comme un module/patch en fait.
ya aussi un mode 'sans fil" qui s'apelle iml pour regler /recuperer les valeurs mais ça peut etre tricky, jpense qu'il vaut mieux aprendre avec les connections dans un premier temps deja,
et j'y repense ya plus simple que le writeln si tu veux tracer des valeurs dans le script in ya aussi itrace et strace i pour les int et s pour les single(float) c plus simple.


divers69
Member
Posts: 12
Contact:

Unread post by divers69 » 04 Jun 2018, 14:55

Salut. Je commence à y voir plus clair et à tester des trucs très intéressants avec les scripts!
Une question de plus : imaginons que je dispose de cinq racks. Puis-je, à partir d'un script placé dans le premier, lancer la lecture du premier rack puis, après un certain nombre d'actions, lancer la lecture du deuxième rack qui prendra la main avec son propre script, et ainsi de suite? Pour mes besoins, je ne souhaite pas utiliser la grille.
Merci à toi

23fx23
Member
Posts: 2545
Contact:

Unread post by 23fx23 » 04 Jun 2018, 16:57

ce que tu peux faire c utiliser les datas bus. c un peu comme des liasons sans fil.
par exemple ton premier script allume un swich quand il a terminé, la tu connecte un 'from 0 to 1' qui va dans un bus disons 'to_patch2'
dans ton deuxieme patch tu as un bus receive qui reprends le meme nom et qui se connecte au start du script, et ainsi de suite.

divers69
Member
Posts: 12
Contact:

Unread post by divers69 » 04 Jun 2018, 17:15

OK, je teste ça. Merci pour la rapidité et l'efficacité de la réponse !

Post Reply

Who is online

Users browsing this forum: No registered users and 11 guests