Welcome to %s forums

BrainModular Users Forum

Login Register

scripting made easier

General Discussion about whatever fits..
Post Reply
drakh
Member
Posts: 198
Location: Bratislava, SK
Contact:

Unread post by drakh » 12 Jan 2015, 10:00

So, i finally forced my self to learn scripting for Hollyhock.
the thing is i love it and hate it.

love it because i cand do lot of stuf much easier by writing a script - i am more familiar with code than with visual boxes, and the signal flow is not always working as expected. and now with controllers like akai apc or launchpad it is better to write script than patch it thru modules.

I hate it because of, ahm Pascal. And poor debuging options. I understand that make script debuging possible will bring lot of unnecessary stuff into hollyhock - actually a whole IDE. I tried rearJS VST - as webdeveloper i am more familiar with JavaScript, so in fact this plugin should be what i need. But i dindt find it useful with hollyhock, as hollyhock scripting provides me somehow easy way to prepare inputs/outputs bound to internal formats of signal in hollyhock.

So i made some smal research, and installed Lazarus - http://www.lazarus.freepascal.org/ which is nice multipilatform pascal IDE. there are some slight differences - like when you ar eusing dynamic arrays in Lazarus you have to use SetLength function, in hollyhock SetArrayLength. but overall it makes writing sripts for hollyhock much more easier. I recommend it for everyone who is writing own scripts.

User avatar
nay-seven
Site Admin
Posts: 5684
Location: rennes France
Contact:

Unread post by nay-seven » 12 Jan 2015, 10:15

Thanks drakh, can be useful for many users, will test it for sure.

karl-marci
New member
Posts: 2
Contact:

Unread post by karl-marci » 12 Jan 2015, 12:07

Hi drakh, do you mean you write Pascal programs in Lazarus and then use the compiled modules inside Usine?

sephult
Member
Posts: 1144
Contact:

Unread post by sephult » 12 Jan 2015, 13:59

Yes do tell, I am curious on how you are using the IDE in conjunction.

-S
"Every act of creation is first an act of destruction." -Picasso

drakh
Member
Posts: 198
Location: Bratislava, SK
Contact:

Unread post by drakh » 13 Jan 2015, 16:15

i use lazaurs as debugger mainly. so i wrote program - simulate some input values, and the usine "procoesss" routine, trace thru runtime. and if its is working as expected copypaste the code inside usine

lazarus code

Code: Select all

program test;

var pattern:array of integer;
var counts:array of integer;
var remainders:array of integer;
var c:integer;

procedure build(l:integer);
var i:integer;
begin
     if((l>-1))then
     begin
          for i:=0 to (counts[l]-1) do
          begin
               build(l-1);
          end;
          if&#40;remainders&#91;l&#93;<>0&#41; then
          begin
               build&#40;l-2&#41;;
          end;
     end
     else if &#40;l=-1&#41;then
     begin
          pattern&#91;c&#93;&#58;=0;
          c&#58;=c+1;
     end
     else if &#40;l=-2&#41; then
     begin
          pattern&#91;c&#93;&#58;=1;
          c&#58;=c+1;
     end;
end;

procedure bjorklund&#40;steps&#58;integer;pulses&#58;integer&#41;;
var level&#58;integer;
var st&#58;boolean;
var divisor&#58;integer;
var i&#58;integer;
begin
     divisor&#58;=steps-pulses;
     level&#58;=0;
     st&#58;=true;
     SetLength&#40;pattern,steps&#41;;
     SetLength&#40;remainders,level+1&#41;;
     remainders&#91;level&#93;&#58;=pulses;
     while&#40;st=true&#41; do
     begin
          SetLength&#40;counts,level+1&#41;;//in usine this should be SetArrayLength
          counts&#91;level&#93;&#58;= divisor div remainders&#91;level&#93;;
          SetLength&#40;remainders,level+2&#41;;
          remainders&#91;level+1&#93;&#58;=divisor mod remainders&#91;level&#93;;
          divisor&#58;=remainders&#91;level&#93;;
          level&#58;=level+1;

          if&#40;remainders&#91;level&#93;<=1&#41; then
          begin
               st&#58;=false;
          end;
     end;
     SetLength&#40;counts,level+1&#41;;
     counts&#91;level&#93;&#58;=divisor;
     c&#58;=0;
     build&#40;level&#41;;
     for i&#58;=0 to steps-1 do
     begin
          write&#40;pattern&#91;&#40;steps-1&#41;-i&#93;&#41;;
     end;
end;

begin
bjorklund&#40;5,5&#41;;
readln;//you should remov
end.
hollyhock code

Code: Select all

//////////////////////////
// 
/////////////////////////
// parameters declaration
var o_arr&#58;tParameter;
var i_steps&#58;tParameter;  
var i_pulses&#58;tParameter;

   
var counts&#58; array of integer;             
var pattern&#58; array of integer; 
var remainders&#58; array of integer;
var c&#58;integer;
var steps&#58;integer;
var pulses&#58;integer;

var has_changed&#58;boolean;
                              
procedure get_steps;
begin
   steps&#58;=round&#40;GetValue&#40;i_steps&#41;&#41;;
   has_changed&#58;=true;
end;                   

procedure get_pulses;
begin      
   pulses&#58;=round&#40;GetValue&#40;i_pulses&#41;&#41;;
   has_changed&#58;=true;  
end;

procedure build&#40;l&#58;integer&#41;;
var i&#58;integer;
begin
     if&#40;&#40;l>-1&#41;&#41;then
     begin
          for i&#58;=0 to &#40;counts&#91;l&#93;-1&#41; do
          begin
               build&#40;l-1&#41;;
          end;
          if&#40;remainders&#91;l&#93;<>0&#41; then
          begin
               build&#40;l-2&#41;;
          end;
     end
     else if &#40;l=-1&#41;then
     begin
          pattern&#91;c&#93;&#58;=0;
          c&#58;=c+1;
     end
     else if &#40;l=-2&#41; then
     begin
          pattern&#91;c&#93;&#58;=1;
          c&#58;=c+1;
     end;
end;    
                               
procedure bjorklund&#40;s&#58;integer;p&#58;integer&#41;;
var level&#58;integer;
var st&#58;boolean;
var divisor&#58;integer;
var i&#58;integer;
begin
     divisor&#58;=s-p;   
     level&#58;=0;
     st&#58;=true;
     SetArrayLength&#40;remainders,level+1&#41;;
     remainders&#91;level&#93;&#58;=p;
     while&#40;st=true&#41; do
     begin
          SetArrayLength&#40;counts,level+1&#41;;
          counts&#91;level&#93;&#58;= divisor div remainders&#91;level&#93;;
          SetArrayLength&#40;remainders,level+2&#41;;
          remainders&#91;level+1&#93;&#58;=divisor mod remainders&#91;level&#93;;
          divisor&#58;=remainders&#91;level&#93;;
          level&#58;=level+1;

          if&#40;remainders&#91;level&#93;<=1&#41; then
          begin
               st&#58;=false;
          end;
     end;
     SetArrayLength&#40;counts,level+1&#41;;
     counts&#91;level&#93;&#58;=divisor;
     c&#58;=0;
     build&#40;level&#41;;      
end;         
// initialisation &#58; create parameters
procedure init;
begin  
 o_arr &#58;= CreateParam&#40;'cells out', ptArray&#41;;
 SetIsInput&#40;o_arr,false&#41;;  
 i_steps&#58;=CreateParam&#40;'steps', ptDataField&#41;;
 SetIsOutPut&#40;i_steps,false&#41;;
 i_pulses&#58;=CreateParam&#40;'pulses', ptDataField&#41;;
 SetIsOutPut&#40;i_pulses,false&#41;;
 get_steps&#40;&#41;;
 get_pulses&#40;&#41;;
end; 
                          

// Callback procedure
Procedure Callback&#40;n&#58;integer&#41;; 
begin                   
   CASE n OF
      i_steps&#58;get_steps&#40;&#41;;
      i_pulses&#58;get_pulses&#40;&#41;;
   END;
end;                    

                                    
//////////////////////////////
// main proc                                  
//////////////////////////////
Procedure Process;     
var arr_l&#58;integer;
var i&#58;integer;
begin
   arr_l&#58;=0;               
   if&#40;has_changed=true&#41; then
   begin                   
      SetArrayLength&#40;pattern,steps&#41;;
      get_steps&#40;&#41;;
      get_pulses&#40;&#41;;
      bjorklund&#40;steps,pulses&#41;;  
      for i&#58;=0 to steps-1 do
      begin
          SetDataArrayValue&#40;o_arr,i,pattern&#91;&#40;steps-1&#41;-i&#93;&#41;;
          //SetDataArrayValue&#40;o_arr,i,1&#41;;
      end;
      arr_l&#58;=steps;
      has_changed&#58;=false;
   end;
   SetLength&#40;o_arr,arr_l&#41;;
end;

Post Reply

Who is online

Users browsing this forum: Google [Bot] and 77 guests