Page 1 of 1

Posted: 12 Jan 2015, 10:00
by drakh
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.

Posted: 12 Jan 2015, 10:15
by nay-seven
Thanks drakh, can be useful for many users, will test it for sure.

Posted: 12 Jan 2015, 12:07
by karl-marci
Hi drakh, do you mean you write Pascal programs in Lazarus and then use the compiled modules inside Usine?

Posted: 12 Jan 2015, 13:59
by sephult
Yes do tell, I am curious on how you are using the IDE in conjunction.

-S

Posted: 13 Jan 2015, 16:15
by drakh
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;