home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 November / CMCD1104.ISO / Software / Complet / ZynAddFX / Setup_ZynAddSubFX-2.1.1.exe / EnvelopeUI.fl < prev    next >
Encoding:
FLTK User Interface Designer  |  2004-08-17  |  24.8 KB  |  847 lines

  1. # data file for the Fltk User Interface Designer (fluid)
  2. version 1.0105 
  3. header_name {.h} 
  4. code_name {.cc}
  5. decl {//Copyright (c) 2002-2004 Nasca Octavian Paul} {} 
  6.  
  7. decl {//License: GNU GPL version 2} {} 
  8.  
  9. decl {\#include "WidgetPDial.h"} {public
  10.  
  11. decl {\#include <stdio.h>} {public
  12.  
  13. decl {\#include <stdlib.h>} {public
  14.  
  15. decl {\#include "../globals.h"} {public
  16.  
  17. decl {\#include <FL/Fl_Group.H>} {public
  18.  
  19. decl {\#include "../Params/EnvelopeParams.h"} {public
  20.  
  21. decl {\#include <FL/Fl_Box.H>} {public
  22.  
  23. decl {\#include <FL/fl_draw.H>} {public
  24.  
  25. decl {\#include <FL/fl_ask.H>} {public
  26.  
  27. decl {\#include "PresetsUI.h"} {public
  28.  
  29. class EnvelopeFreeEdit {: {public Fl_Box}
  30. } {
  31.   Function {EnvelopeFreeEdit(int x,int y, int w, int h, const char *label=0):Fl_Box(x,y,w,h,label)} {} {
  32.     code {env=NULL;
  33. pair=NULL;} {}
  34.   }
  35.   Function {init(EnvelopeParams *env_)} {} {
  36.     code {env=env_;
  37. oldx=-1;
  38. currentpoint=-1;
  39. cpx=0;
  40. lastpoint=-1;} {}
  41.   }
  42.   Function {setpair(Fl_Box *pair_)} {} {
  43.     code {pair=pair_;} {}
  44.   }
  45.   Function {getpointx(int n)} {return_type int
  46.   } {
  47.     code {int lx=w()-10;
  48. int npoints=env->Penvpoints;
  49.  
  50. float  sum=0;
  51. for (int i=1;i<npoints;i++) sum+=env->getdt(i)+1;
  52.  
  53. float sumbefore=0;//the sum of all points before the computed point
  54. for (int i=1;i<=n;i++) sumbefore+=env->getdt(i)+1;
  55.  
  56. return((int) (sumbefore/(REALTYPE) sum*lx));} {}
  57.   }
  58.   Function {getpointy(int n)} {return_type int
  59.   } {
  60.     code {int ly=h()-10;
  61.  
  62. return((int) ((1.0-env->Penvval[n]/127.0)*ly));} {}
  63.   }
  64.   Function {getnearest(int x,int y)} {return_type int
  65.   } {
  66.     code {x-=5;y-=5;
  67.  
  68. int nearestpoint=0;
  69. int nearestval=1000000;//a big value
  70. for (int i=0;i<env->Penvpoints;i++){
  71.    int distance=abs(x-getpointx(i))+abs(y-getpointy(i));
  72.    if (distance<nearestval) {
  73.      nearestpoint=i;
  74.      nearestval=distance;  
  75.    };
  76. };
  77. return(nearestpoint);} {}
  78.   }
  79.   Function {draw()} {private
  80.   } {
  81.     code {int ox=x(),oy=y(),lx=w(),ly=h();
  82. if (env->Pfreemode==0) env->converttofree();
  83. int npoints=env->Penvpoints;
  84.  
  85. if (active_r()) fl_color(FL_BLACK);
  86.     else fl_color(90,90,90);
  87. if (!active_r()) currentpoint=-1;
  88.  
  89. fl_rectf(ox,oy,lx,ly);
  90.  
  91. ox+=5;oy+=5;lx-=10;ly-=10;
  92.  
  93. //draw the lines
  94. fl_color(FL_GRAY);
  95.  
  96. fl_line_style(FL_SOLID);
  97. fl_line(ox+2,oy+ly/2,ox+lx-2,oy+ly/2);
  98.  
  99. //draws the evelope points and lines
  100. Fl_Color alb=FL_WHITE;
  101. if (!active_r()) alb=fl_rgb_color(180,180,180);
  102. fl_color(alb);
  103. int oldxx=0,xx=0,oldyy=0,yy=getpointy(0);
  104. fl_rectf(ox-3,oy+yy-3,6,6);
  105. for (int i=1;i<npoints;i++){
  106.     oldxx=xx;oldyy=yy;
  107.     xx=getpointx(i);yy=getpointy(i);
  108.     if (i==currentpoint) fl_color(FL_RED);
  109.         else fl_color(alb);
  110.     fl_line(ox+oldxx,oy+oldyy,ox+xx,oy+yy);
  111.     fl_rectf(ox+xx-3,oy+yy-3,6,6);
  112. };
  113.  
  114. //draw the last moved point point (if exists)
  115. if (lastpoint>=0){
  116.     fl_color(FL_CYAN);
  117.     fl_rectf(ox+getpointx(lastpoint)-5,oy+getpointy(lastpoint)-5,10,10);
  118. };
  119.  
  120. //draw the sustain position
  121. if (env->Penvsustain>0){
  122.     fl_color(FL_YELLOW);
  123.     xx=getpointx(env->Penvsustain);
  124.     fl_line(ox+xx,oy+0,ox+xx,oy+ly);
  125. };
  126.  
  127. //Show the envelope duration and the current line duration
  128. fl_font(FL_HELVETICA|FL_BOLD,10);
  129. float time=0.0;
  130. if (currentpoint<=0){
  131.    fl_color(alb);
  132.    for (int i=1;i<npoints;i++) time+=env->getdt(i);
  133. } else {
  134.    fl_color(255,0,0);
  135.    time=env->getdt(currentpoint);
  136. };
  137. char tmpstr[20];
  138. if (time<1000.0) snprintf((char *)&tmpstr,20,"%.1fms",time);
  139.      else snprintf((char *)&tmpstr,20,"%.2fs",time/1000.0);
  140. fl_draw(tmpstr,ox+lx-20,oy+ly-10,20,10,FL_ALIGN_RIGHT,NULL,0);} {}
  141.   }
  142.   Function {handle(int event)} {return_type int
  143.   } {
  144.     code {int x_=Fl::event_x()-x();
  145. int y_=Fl::event_y()-y();
  146.  
  147. if (event==FL_PUSH) {
  148.   currentpoint=getnearest(x_,y_);
  149.   cpx=x_;
  150.   cpdt=env->Penvdt[currentpoint];
  151.   lastpoint=currentpoint;
  152.   redraw();
  153.   if (pair!=NULL) pair->redraw();
  154. };
  155.  
  156. if (event==FL_RELEASE){
  157.   currentpoint=-1;
  158.   redraw();
  159.   if (pair!=NULL) pair->redraw();
  160. };
  161.  
  162. if ((event==FL_DRAG)&&(currentpoint>=0)){
  163.   int ny=127-(int) (y_*127.0/h());
  164.   if (ny<0) ny=0;if (ny>127) ny=127;
  165.   env->Penvval[currentpoint]=ny;
  166.  
  167.   int dx=(int)((x_-cpx)*0.1);
  168.   int newdt=cpdt+dx;
  169.   if (newdt<0) newdt=0;if (newdt>127) newdt=127;
  170.   if (currentpoint!=0) env->Penvdt[currentpoint]=newdt;
  171.      else env->Penvdt[currentpoint]=0;
  172.  
  173.   redraw();
  174.   if (pair!=NULL) pair->redraw();
  175. };
  176.  
  177.  
  178. return(1);} {}
  179.   }
  180.   decl {Fl_Box *pair;} {}
  181.   decl {EnvelopeParams *env;} {}
  182.   decl {int oldx,oldy;} {}
  183.   decl {int currentpoint,cpx,cpdt;} {}
  184.   decl {int lastpoint;} {public
  185.   }
  186.  
  187. class EnvelopeUI {: {public Fl_Group,PresetsUI_}
  188. } {
  189.   Function {EnvelopeUI(int x,int y, int w, int h, const char *label=0):Fl_Group(x,y,w,h,label)} {} {
  190.     code {env=NULL;
  191. freemodeeditwindow=NULL;
  192. envADSR=NULL;
  193. envASR=NULL;
  194. envADSRfilter=NULL;
  195. envASRbw=NULL;
  196. envfree=NULL;} {}
  197.   }
  198.   Function {~EnvelopeUI()} {} {
  199.     code {envwindow->hide();
  200. hide();
  201. freemodeeditwindow->hide();
  202. delete (freemodeeditwindow);} {selected
  203.     }
  204.   }
  205.   Function {make_freemode_edit_window()} {} {
  206.     Fl_Window freemodeeditwindow {
  207.       label Envelope
  208.       xywh {60 308 575 180} type Double hide
  209.     } {
  210.       Fl_Box freeedit {
  211.         label Envelope
  212.         xywh {5 5 565 145} box FLAT_BOX color 0
  213.         code0 {o->init(env);}
  214.         class EnvelopeFreeEdit
  215.       }
  216.       Fl_Button {} {
  217.         label {Add point}
  218.         callback {int curpoint=freeedit->lastpoint;
  219. if (curpoint<0) return;
  220. //if (curpoint>=env->Penvpoints-1) return;
  221. if (env->Penvpoints>=MAX_ENVELOPE_POINTS) return;
  222.  
  223. for (int i=env->Penvpoints;i>=curpoint+1;i--){
  224.    env->Penvdt[i]=env->Penvdt[i-1];
  225.    env->Penvval[i]=env->Penvval[i-1];
  226. };
  227.  
  228. if (curpoint==0) {
  229.   env->Penvdt[1]=64;
  230. };
  231.  
  232. env->Penvpoints++;
  233. if (curpoint<=env->Penvsustain) env->Penvsustain++;
  234.  
  235. freeedit->lastpoint+=1;
  236. freeedit->redraw();
  237. envfree->redraw();
  238.  
  239. sustaincounter->value(env->Penvsustain);
  240. sustaincounter->maximum(env->Penvpoints-2);}
  241.         xywh {115 155 80 20} box THIN_UP_BOX
  242.         code0 {if (env->Pfreemode==0) o->hide();}
  243.       }
  244.       Fl_Button {} {
  245.         label {Delete point}
  246.         callback {int curpoint=freeedit->lastpoint;
  247. if (curpoint<1) return;
  248. if (curpoint>=env->Penvpoints-1) return;
  249. if (env->Penvpoints<=3) return;
  250.  
  251. for (int i=curpoint+1;i<env->Penvpoints;i++){
  252.    env->Penvdt[i-1]=env->Penvdt[i];
  253.    env->Penvval[i-1]=env->Penvval[i];
  254. };
  255.  
  256. env->Penvpoints--;
  257.  
  258. if (curpoint<=env->Penvsustain) env->Penvsustain--;
  259.  
  260.  
  261. freeedit->lastpoint-=1;
  262. freeedit->redraw();
  263. envfree->redraw();
  264.  
  265. sustaincounter->value(env->Penvsustain);
  266. sustaincounter->maximum(env->Penvpoints-2);}
  267.         xywh {200 155 80 20} box THIN_UP_BOX
  268.         code0 {if (env->Pfreemode==0) o->hide();}
  269.       }
  270.       Fl_Light_Button freemodebutton {
  271.         label FreeMode
  272.         callback {reinit();
  273.  
  274. freeedit->lastpoint=-1;
  275. freeedit->redraw();}
  276.         tooltip {Enable or disable the freemode} xywh {10 155 95 25} box PLASTIC_UP_BOX
  277.       }
  278.       Fl_Check_Button forcedreleasecheck {
  279.         label frcR
  280.         callback {env->Pforcedrelease=(int)o->value();}
  281.         tooltip {Forced Relase} xywh {410 165 40 15} down_box DOWN_BOX labelsize 11
  282.         code0 {o->value(env->Pforcedrelease);}
  283.         code1 {if (env->Pfreemode==0) o->hide();}
  284.       }
  285.       Fl_Dial envstretchdial {
  286.         label {Str.}
  287.         callback {env->Penvstretch=(int)o->value();}
  288.         tooltip {Envelope stretch (on lower notes make the envelope longer)} xywh {380 155 25 25} box ROUND_UP_BOX labelsize 11 align 4 maximum 127 step 1
  289.         code0 {o->value(env->Penvstretch);}
  290.         code1 {if (env->Pfreemode==0) o->hide();}
  291.         class WidgetPDial
  292.       }
  293.       Fl_Button {} {
  294.         label Close
  295.         callback {freemodeeditwindow->hide();}
  296.         xywh {510 155 60 25} box THIN_UP_BOX
  297.       }
  298.       Fl_Check_Button linearenvelopecheck {
  299.         label L
  300.         callback {env->Plinearenvelope=(int)o->value();}
  301.         tooltip {Linear Envelope} xywh {410 151 30 15} down_box DOWN_BOX labelsize 11
  302.         code0 {o->value(env->Plinearenvelope);}
  303.         code1 {if ((env->Pfreemode==0)||(env->Envmode>2)) o->hide();}
  304.       }
  305.       Fl_Counter sustaincounter {
  306.         label Sust
  307.         callback {env->Penvsustain=(int) o->value();
  308. freeedit->redraw();
  309. envfree->redraw();}
  310.         tooltip {Sustain (0 is disabled)} xywh {315 155 40 15} type Simple labelsize 12 align 4 minimum 0 maximum 127 step 1
  311.         code0 {o->value(env->Penvsustain);}
  312.         code1 {if (env->Pfreemode==0) o->hide();}
  313.         code2 {o->maximum(env->Penvpoints-2);}
  314.       }
  315.       Fl_Button {} {
  316.         label C
  317.         callback {presetsui->copy(env);}
  318.         xywh {465 160 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 7
  319.       }
  320.       Fl_Button {} {
  321.         label P
  322.         callback {presetsui->paste(env,this);}
  323.         xywh {482 160 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 7
  324.       }
  325.     }
  326.   }
  327.   Function {make_ADSR_window()} {} {
  328.     Fl_Window envADSR {
  329.       xywh {108 336 205 70} type Double color 50 labelfont 1 hide
  330.       class Fl_Group
  331.     } {
  332.       Fl_Group {} {
  333.         label {Amplitude Envelope}
  334.         xywh {0 0 205 70} box PLASTIC_UP_BOX color 223 labeltype ENGRAVED_LABEL labelsize 11 align 17
  335.       } {
  336.         Fl_Dial e1adt {
  337.           label {A.dt}
  338.           callback {env->PA_dt=(int)o->value();
  339. freeedit->redraw();}
  340.           tooltip {Attack time} xywh {5 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  341.           code0 {o->value(env->PA_dt);}
  342.           class WidgetPDial
  343.         }
  344.         Fl_Dial e1ddt {
  345.           label {D.dt}
  346.           callback {env->PD_dt=(int)o->value();
  347. freeedit->redraw();}
  348.           tooltip {Decay time} xywh {40 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  349.           code0 {o->value(env->PD_dt);}
  350.           class WidgetPDial
  351.         }
  352.         Fl_Dial e1rdt {
  353.           label {R.dt}
  354.           callback {env->PR_dt=(int)o->value();
  355. freeedit->redraw();}
  356.           tooltip {Release time} xywh {110 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  357.           code0 {o->value(env->PR_dt);}
  358.           class WidgetPDial
  359.         }
  360.         Fl_Dial e1sval {
  361.           label {S.val}
  362.           callback {env->PS_val=(int)o->value();
  363. freeedit->redraw();}
  364.           tooltip {Sustain value} xywh {75 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  365.           code0 {o->value(env->PS_val);}
  366.           class WidgetPDial
  367.         }
  368.         Fl_Check_Button e1forcedrelease {
  369.           label frcR
  370.           callback {env->Pforcedrelease=(int)o->value();}
  371.           tooltip {Forced Relase} xywh {180 35 20 15} down_box DOWN_BOX labelsize 11 align 6
  372.           code0 {o->value(env->Pforcedrelease);}
  373.         }
  374.         Fl_Dial e1envstretch {
  375.           label Stretch
  376.           callback {env->Penvstretch=(int)o->value();}
  377.           tooltip {Envelope stretch (on lower notes makes the envelope longer)} xywh {145 25 25 25} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  378.           code0 {o->value(env->Penvstretch);}
  379.           class WidgetPDial
  380.         }
  381.         Fl_Button {} {
  382.           label E
  383.           callback {freemodeeditwindow->show();}
  384.           tooltip {Envelope window} xywh {185 5 15 15} box PLASTIC_UP_BOX labelfont 1 labelsize 10
  385.         }
  386.         Fl_Check_Button e1linearenvelope {
  387.           label L
  388.           callback {env->Plinearenvelope=(int)o->value();}
  389.           tooltip {The evelope is linear} xywh {180 20 15 15} down_box DOWN_BOX labelsize 11 align 4
  390.           code0 {o->value(env->Plinearenvelope);}
  391.         }
  392.         Fl_Button {} {
  393.           label C
  394.           callback {presetsui->copy(env);}
  395.           xywh {150 5 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 7
  396.         }
  397.         Fl_Button {} {
  398.           label P
  399.           callback {presetsui->paste(env,this);}
  400.           xywh {167 5 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 7
  401.         }
  402.       }
  403.     }
  404.   }
  405.   Function {make_ASR_window()} {} {
  406.     Fl_Window envASR {
  407.       xywh {71 320 210 70} type Double hide
  408.       class Fl_Group
  409.     } {
  410.       Fl_Group {} {
  411.         label {Frequency Envelope}
  412.         xywh {0 0 210 70} box PLASTIC_UP_BOX color 223 labeltype ENGRAVED_LABEL labelsize 11 align 17
  413.       } {
  414.         Fl_Dial e2aval {
  415.           label {A.val}
  416.           callback {env->PA_val=(int)o->value();
  417. freeedit->redraw();}
  418.           tooltip {Starting value} xywh {5 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  419.           code0 {o->value(env->PA_val);}
  420.           class WidgetPDial
  421.         }
  422.         Fl_Dial e2adt {
  423.           label {A.dt}
  424.           callback {env->PA_dt=(int)o->value();
  425. freeedit->redraw();}
  426.           tooltip {Attack time} xywh {40 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  427.           code0 {o->value(env->PA_dt);}
  428.           class WidgetPDial
  429.         }
  430.         Fl_Dial e2rval {
  431.           label {R.val}
  432.           callback {env->PR_val=(int)o->value();
  433. freeedit->redraw();}
  434.           tooltip {Release value} xywh {110 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  435.           code0 {o->value(env->PR_val);}
  436.           class WidgetPDial
  437.         }
  438.         Fl_Dial e2rdt {
  439.           label {R.dt}
  440.           callback {env->PR_dt=(int)o->value();
  441. freeedit->redraw();}
  442.           tooltip {Release time} xywh {75 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  443.           code0 {o->value(env->PR_dt);}
  444.           class WidgetPDial
  445.         }
  446.         Fl_Dial e2envstretch {
  447.           label Stretch
  448.           callback {env->Penvstretch=(int)o->value();}
  449.           tooltip {Envelope stretch (on lower notes makes the envelope longer)} xywh {145 25 25 25} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  450.           code0 {o->value(env->Penvstretch);}
  451.           class WidgetPDial
  452.         }
  453.         Fl_Check_Button e2forcedrelease {
  454.           label frcR
  455.           callback {env->Pforcedrelease=(int)o->value();}
  456.           tooltip {Forced release} xywh {180 25 15 25} down_box DOWN_BOX labelsize 11 align 6
  457.           code0 {o->value(env->Pforcedrelease);}
  458.         }
  459.         Fl_Button {} {
  460.           label C
  461.           callback {presetsui->copy(env);}
  462.           xywh {155 5 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 7
  463.         }
  464.         Fl_Button {} {
  465.           label P
  466.           callback {presetsui->paste(env,this);}
  467.           xywh {172 5 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 7
  468.         }
  469.       }
  470.       Fl_Button {} {
  471.         label E
  472.         callback {freemodeeditwindow->show();}
  473.         tooltip {Envelope window} xywh {190 5 15 15} box PLASTIC_UP_BOX labelfont 1 labelsize 10
  474.       }
  475.     }
  476.   }
  477.   Function {make_ADSRfilter_window()} {} {
  478.     Fl_Window envADSRfilter {
  479.       xywh {87 143 275 70} type Double color 50 labelfont 1 hide
  480.       class Fl_Group
  481.     } {
  482.       Fl_Group {} {
  483.         label {Filter Envelope}
  484.         xywh {0 0 275 70} box PLASTIC_UP_BOX color 223 labeltype ENGRAVED_LABEL labelsize 11 align 17
  485.       } {
  486.         Fl_Dial e3aval {
  487.           label {A.val}
  488.           callback {env->PA_val=(int)o->value();
  489. freeedit->redraw();}
  490.           tooltip {Starting value} xywh {5 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  491.           code0 {o->value(env->PA_val);}
  492.           class WidgetPDial
  493.         }
  494.         Fl_Dial e3adt {
  495.           label {A.dt}
  496.           callback {env->PA_dt=(int)o->value();
  497. freeedit->redraw();}
  498.           tooltip {Attack time} xywh {40 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  499.           code0 {o->value(env->PA_dt);}
  500.           class WidgetPDial
  501.         }
  502.         Fl_Dial e3dval {
  503.           label {D.val}
  504.           callback {env->PD_val=(int)o->value();
  505. freeedit->redraw();}
  506.           tooltip {decay value} xywh {75 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  507.           code0 {o->value(env->PD_val);}
  508.           class WidgetPDial
  509.         }
  510.         Fl_Dial e3ddt {
  511.           label {D.dt}
  512.           callback {env->PD_dt=(int)o->value();
  513. freeedit->redraw();}
  514.           tooltip {decay time} xywh {110 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  515.           code0 {o->value(env->PD_dt);}
  516.           class WidgetPDial
  517.         }
  518.         Fl_Dial e3rdt {
  519.           label {R.dt}
  520.           callback {env->PR_dt=(int)o->value();
  521. freeedit->redraw();}
  522.           tooltip {Release time} xywh {145 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  523.           code0 {o->value(env->PR_dt);}
  524.           class WidgetPDial
  525.         }
  526.         Fl_Dial e3rval {
  527.           label {R.val}
  528.           callback {env->PR_val=(int)o->value();
  529. freeedit->redraw();}
  530.           tooltip {Release value} xywh {180 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  531.           code0 {o->value(env->PR_val);}
  532.           class WidgetPDial
  533.         }
  534.         Fl_Dial e3envstretch {
  535.           label Stretch
  536.           callback {env->Penvstretch=(int)o->value();}
  537.           tooltip {Envelope stretch (on lower notes makes the envelope longer)} xywh {215 25 25 25} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  538.           code0 {o->value(env->Penvstretch);}
  539.           class WidgetPDial
  540.         }
  541.         Fl_Check_Button e3forcedrelease {
  542.           label frcR
  543.           callback {env->Pforcedrelease=(int)o->value();}
  544.           tooltip {Forced Relase} xywh {250 30 15 20} down_box DOWN_BOX labelsize 11 align 6
  545.           code0 {o->value(env->Pforcedrelease);}
  546.         }
  547.         Fl_Button {} {
  548.           label E
  549.           callback {freemodeeditwindow->show();}
  550.           xywh {255 5 15 15} box PLASTIC_UP_BOX labelfont 1 labelsize 10
  551.         }
  552.         Fl_Button {} {
  553.           label C
  554.           callback {presetsui->copy(env);}
  555.           xywh {220 5 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 7
  556.         }
  557.         Fl_Button {} {
  558.           label P
  559.           callback {presetsui->paste(env,this);}
  560.           xywh {237 5 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 7
  561.         }
  562.       }
  563.     }
  564.   }
  565.   Function {make_ASRbw_window()} {} {
  566.     Fl_Window envASRbw {
  567.       xywh {224 539 210 70} type Double hide
  568.       class Fl_Group
  569.     } {
  570.       Fl_Group {} {
  571.         label {BandWidth Envelope}
  572.         xywh {0 0 210 70} box PLASTIC_UP_BOX color 223 labeltype ENGRAVED_LABEL labelsize 11 align 17
  573.       } {
  574.         Fl_Dial e4aval {
  575.           label {A.val}
  576.           callback {env->PA_val=(int)o->value();
  577. freeedit->redraw();}
  578.           tooltip {Starting value} xywh {5 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  579.           code0 {o->value(env->PA_val);}
  580.           class WidgetPDial
  581.         }
  582.         Fl_Dial e4adt {
  583.           label {A.dt}
  584.           callback {env->PA_dt=(int)o->value();
  585. freeedit->redraw();}
  586.           tooltip {Attack time} xywh {40 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  587.           code0 {o->value(env->PA_dt);}
  588.           class WidgetPDial
  589.         }
  590.         Fl_Dial e4rval {
  591.           label {R.val}
  592.           callback {env->PR_val=(int)o->value();
  593. freeedit->redraw();}
  594.           tooltip {Release value} xywh {110 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  595.           code0 {o->value(env->PR_val);}
  596.           class WidgetPDial
  597.         }
  598.         Fl_Dial e4rdt {
  599.           label {R.dt}
  600.           callback {env->PR_dt=(int)o->value();
  601. freeedit->redraw();}
  602.           tooltip {Release time} xywh {75 20 30 30} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  603.           code0 {o->value(env->PR_dt);}
  604.           class WidgetPDial
  605.         }
  606.         Fl_Dial e4envstretch {
  607.           label Stretch
  608.           callback {env->Penvstretch=(int)o->value();}
  609.           tooltip {Envelope stretch (on lower notes makes the envelope longer)} xywh {145 25 25 25} box ROUND_UP_BOX labelsize 11 maximum 127 step 1
  610.           code0 {o->value(env->Penvstretch);}
  611.           class WidgetPDial
  612.         }
  613.         Fl_Check_Button e4forcedrelease {
  614.           label frcR
  615.           callback {env->Pforcedrelease=(int)o->value();}
  616.           tooltip {Forced release} xywh {180 25 15 25} down_box DOWN_BOX labelsize 11 align 6
  617.           code0 {o->value(env->Pforcedrelease);}
  618.         }
  619.         Fl_Button {} {
  620.           label C
  621.           callback {presetsui->copy(env);}
  622.           xywh {155 5 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 7
  623.         }
  624.         Fl_Button {} {
  625.           label P
  626.           callback {presetsui->paste(env,this);}
  627.           xywh {172 5 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 7
  628.         }
  629.       }
  630.       Fl_Button {} {
  631.         label E
  632.         callback {freemodeeditwindow->show();}
  633.         xywh {190 5 15 15} box PLASTIC_UP_BOX labelfont 1 labelsize 10
  634.       }
  635.     }
  636.   }
  637.   Function {make_free_window()} {} {
  638.     Fl_Window envfree {
  639.       xywh {373 413 205 70} type Double color 50 labelfont 1 hide resizable
  640.       class Fl_Group
  641.     } {
  642.       Fl_Group envfreegroup {
  643.         label {Amplitude Envelope}
  644.         xywh {0 0 205 70} box PLASTIC_UP_BOX color 223 labeltype ENGRAVED_LABEL labelsize 11 align 17 resizable
  645.       } {
  646.         Fl_Box freeeditsmall {
  647.           label Envelope
  648.           callback {envfree->redraw();}
  649.           xywh {5 20 195 45} box FLAT_BOX color 0 resizable
  650.           code0 {o->init(env);}
  651.           class EnvelopeFreeEdit
  652.         }
  653.         Fl_Button {} {
  654.           label E
  655.           callback {freemodeeditwindow->show();}
  656.           xywh {185 5 15 15} box PLASTIC_UP_BOX labelfont 1 labelsize 10
  657.         }
  658.         Fl_Button {} {
  659.           label C
  660.           callback {presetsui->copy(env);}
  661.           xywh {150 5 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 7
  662.         }
  663.         Fl_Button {} {
  664.           label P
  665.           callback {presetsui->paste(env,this);}
  666.           xywh {167 5 15 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 10 labelcolor 7
  667.         }
  668.       }
  669.     }
  670.   }
  671.   Function {init(EnvelopeParams *env_)} {} {
  672.     code {env=env_;
  673. make_ADSR_window();
  674. make_ASR_window();
  675. make_ADSRfilter_window();
  676. make_ASRbw_window();
  677. make_free_window();
  678.  
  679. make_freemode_edit_window();
  680.  
  681. envwindow=NULL;
  682. if (env->Envmode==3) envfreegroup->label("Frequency Envelope");
  683. if (env->Envmode==4) envfreegroup->label("Filter Envelope");
  684. if (env->Envmode==5) envfreegroup->label("Bandwidth Envelope");
  685.  
  686. freemodeeditwindow->label(this->label());
  687.  
  688.  
  689. freeeditsmall->setpair(freeedit);
  690. freeedit->setpair(freeeditsmall);
  691.  
  692.  
  693. refresh();} {}
  694.   }
  695.   Function {reinit()} {} {
  696.     code {if (env->Pfreemode!=0){
  697.   int answer=fl_ask("Disable the free mode of the Envelope?");
  698.   if (env->Pfreemode!=0) freemodebutton->value(1);
  699.           else freemodebutton->value(0);
  700.   if (answer==0) return;
  701. };
  702.  
  703. if (env->Pfreemode==0) env->Pfreemode=1;
  704.      else env->Pfreemode=0;
  705.  
  706. hide();
  707. int winx=freemodeeditwindow->x();
  708. int winy=freemodeeditwindow->y();
  709.  
  710. freemodeeditwindow->hide();
  711.  
  712. envwindow->hide();
  713. Fl_Group *par=envwindow->parent();
  714. par->hide();
  715. //par->remove(envwindow);
  716. //delete (envwindow);
  717.  
  718.  
  719. refresh();
  720. //par->add(envwindow);
  721. //par->end();
  722. envwindow->show();
  723. par->redraw();
  724.  
  725. par->show();
  726. show();
  727. freemodeeditwindow->position(winx,winy);
  728. freemodeeditwindow->show();
  729.  
  730. if (env->Pfreemode!=0) freemodebutton->value(1);
  731.         else freemodebutton->value(0);} {}
  732.   }
  733.   Function {refresh()} {} {
  734.     code {freemodebutton->value(env->Pfreemode);
  735.  
  736. sustaincounter->value(env->Penvsustain);
  737. if (env->Pfreemode==0) sustaincounter->hide();
  738.     else sustaincounter->show();
  739. sustaincounter->maximum(env->Penvpoints-2);
  740.  
  741. envstretchdial->value(env->Penvstretch);
  742. if (env->Pfreemode==0) envstretchdial->hide();
  743.     else envstretchdial->show();
  744.  
  745. linearenvelopecheck->value(env->Plinearenvelope);
  746. if ((env->Pfreemode==0)||(env->Envmode>2)) linearenvelopecheck->hide();
  747.     else linearenvelopecheck->show();
  748.  
  749. forcedreleasecheck->value(env->Pforcedrelease);
  750. if (env->Pfreemode==0) forcedreleasecheck->hide();
  751.  
  752. freeedit->redraw();
  753.  
  754.  
  755. if (env->Pfreemode==0){
  756.    switch(env->Envmode){
  757.          case(1):
  758.          case(2):
  759.         e1adt->value(env->PA_dt);
  760.         e1ddt->value(env->PD_dt);
  761.         e1sval->value(env->PS_val);
  762.         e1rdt->value(env->PR_dt);
  763.         e1envstretch->value(env->Penvstretch);
  764.         e1linearenvelope->value(env->Plinearenvelope);
  765.         e1forcedrelease->value(env->Pforcedrelease);
  766.          break;
  767.          case(3):
  768.         e2aval->value(env->PA_val);
  769.         e2adt->value(env->PA_dt);
  770.         e2rdt->value(env->PR_dt);
  771.         e2rval->value(env->PR_val);
  772.         e2envstretch->value(env->Penvstretch);
  773.         e2forcedrelease->value(env->Pforcedrelease);
  774.          break; 
  775.          case(4):
  776.         e3aval->value(env->PA_val);
  777.         e3adt->value(env->PA_dt);
  778.         e3dval->value(env->PD_val);
  779.         e3ddt->value(env->PD_dt);
  780.         e3rdt->value(env->PR_dt);
  781.         e3rval->value(env->PR_val);
  782.         e3envstretch->value(env->Penvstretch);
  783.         e3forcedrelease->value(env->Pforcedrelease);
  784.          break; 
  785.          case(5):
  786.         e4aval->value(env->PA_val);
  787.         e4adt->value(env->PA_dt);
  788.         e4rdt->value(env->PR_dt);
  789.         e4rval->value(env->PR_val);
  790.         e4envstretch->value(env->Penvstretch);
  791.         e4forcedrelease->value(env->Pforcedrelease);
  792.          break;
  793.          default:
  794.          break; 
  795.    };
  796. }else{
  797.        envfree->redraw();
  798. };
  799.  
  800.  
  801. envADSR->hide();
  802. envASR->hide();
  803. envADSRfilter->hide();
  804. envASRbw->hide();
  805. envfree->hide();
  806.  
  807. if (env->Pfreemode==0){
  808.    switch(env->Envmode){
  809.          case(1):
  810.          case(2):
  811.            envwindow=envADSR;
  812.          break;
  813.          case(3):
  814.            envwindow=envASR;
  815.          break; 
  816.          case(4):
  817.            envwindow=envADSRfilter;
  818.          break; 
  819.          case(5):
  820.           envwindow=envASRbw;
  821.          break;
  822.          default:
  823.          break; 
  824.    };
  825. }else{
  826.    envwindow=envfree;
  827. };
  828.  
  829. envwindow->resize(this->x(),this->y(),this->w(),this->h());
  830.  
  831. envwindow->show();} {}
  832.   }
  833.   decl {EnvelopeParams *env;} {}
  834.   decl {Fl_Group *envwindow;} {}
  835.