* ChannelHandler bulk transfer bug fix * PoshSampler fixes Sample display fixes Zoom back in (on buttons) * Delay mix bugfix * Pwm on oscillator fix * autogen.sh added * Added initial files for the (incomplete) sequencermaster
| @@ -93,27 +93,30 @@ void ChannelHandler::UpdateDataNow() | |||
| // one off request type | |||
| case OUTPUT_REQUEST : | |||
| { | |||
| if (m_BulkPos!=-1 && m_BulkID==i->first) | |||
| if (m_BulkID==i->first) | |||
| { | |||
| // doing a bulk transfer | |||
| if (m_BulkPos+ch->size>m_BulkSize) | |||
| if (m_BulkPos!=-1) | |||
| { | |||
| // last transfer | |||
| #ifdef CHANNEL_DEBUG | |||
| cerr<<"memcpy (last) bulk output channel: ["<<i->first<<"]"<<endl; | |||
| #endif | |||
| memcpy(ch->data_buf,((char*)m_BulkSrc)+m_BulkPos,m_BulkSize-m_BulkPos); | |||
| m_BulkPos=-1; | |||
| } | |||
| else | |||
| { | |||
| #ifdef CHANNEL_DEBUG | |||
| cerr<<"memcpy bulk output channel: ["<<i->first<<"]"<<endl; | |||
| #endif | |||
| memcpy(ch->data_buf,((char*)m_BulkSrc)+m_BulkPos,ch->size); | |||
| m_BulkPos+=ch->size; | |||
| } | |||
| ch->updated=true; | |||
| // doing a bulk transfer | |||
| if (m_BulkPos+ch->size>m_BulkSize) | |||
| { | |||
| // last transfer | |||
| #ifdef CHANNEL_DEBUG | |||
| cerr<<"memcpy (last) bulk output channel: ["<<i->first<<"]"<<endl; | |||
| #endif | |||
| memcpy(ch->data_buf,((char*)m_BulkSrc)+m_BulkPos,m_BulkSize-m_BulkPos); | |||
| m_BulkPos=-1; | |||
| } | |||
| else | |||
| { | |||
| #ifdef CHANNEL_DEBUG | |||
| cerr<<"memcpy bulk output channel: ["<<i->first<<"]"<<endl; | |||
| #endif | |||
| memcpy(ch->data_buf,((char*)m_BulkSrc)+m_BulkPos,ch->size); | |||
| m_BulkPos+=ch->size; | |||
| } | |||
| ch->updated=true; | |||
| } | |||
| } | |||
| else | |||
| { | |||
| @@ -321,8 +324,7 @@ void ChannelHandler::BulkTransfer(const string &ID, void *dest, int size) | |||
| else | |||
| { | |||
| GetData(ID,((char*)dest)+pos); | |||
| } | |||
| } | |||
| pos+=buffersize; | |||
| } | |||
| } | |||
| @@ -67,6 +67,6 @@ void DelayPluginGUI::cb_Delay(Fl_Slider* o, void* v) | |||
| { ((DelayPluginGUI*)(o->parent()))->cb_Delay_i(o,v); } | |||
| inline void DelayPluginGUI::cb_Mix_i(Fl_Knob* o, void* v) | |||
| { m_GUICH->Set("Mix",o->value()); } | |||
| { m_GUICH->Set("Mix",(float)o->value()); } | |||
| void DelayPluginGUI::cb_Mix(Fl_Knob* o, void* v) | |||
| { ((DelayPluginGUI*)(o->parent()))->cb_Mix_i(o,v); } | |||
| @@ -55,7 +55,7 @@ m_Triggered(false), | |||
| m_ClockHigh(false), | |||
| m_CopyPattern(0) | |||
| { | |||
| m_Version=2; | |||
| m_Version=3; | |||
| m_PluginInfo.Name="Matrix"; | |||
| m_PluginInfo.Width=555; | |||
| @@ -97,12 +97,14 @@ m_CopyPattern(0) | |||
| for (int y=0; y<MATY; y++) | |||
| { | |||
| m_Matrix[n].Matrix[x][y]=false; | |||
| m_Matrix[n].Volume[x][y]=1; | |||
| } | |||
| m_TriggerLevel[n]=0; | |||
| } | |||
| m_AudioCH->Register("NoteCut",&m_NoteCut,ChannelHandler::INPUT); | |||
| m_AudioCH->Register("Volume",&m_GUIArgs.Volume,ChannelHandler::INPUT); | |||
| m_AudioCH->Register("Current",&m_Current,ChannelHandler::INPUT); | |||
| m_AudioCH->Register("StepTime",&m_StepTime,ChannelHandler::INPUT); | |||
| m_AudioCH->Register("Num",&m_GUIArgs.Num,ChannelHandler::INPUT); | |||
| @@ -245,8 +247,8 @@ void MatrixPlugin::Execute() | |||
| { | |||
| m_CurrentNoteCV=NoteTable[i+m_Matrix[m_Current].Octave*12]; | |||
| m_CurrentTriggerCV=1; | |||
| m_TriggerLevel[i]=1; | |||
| m_CurrentTriggerCV=m_Matrix[m_Current].Volume[m_Step][i]; | |||
| m_TriggerLevel[i]=m_Matrix[m_Current].Volume[m_Step][i]; | |||
| } | |||
| } | |||
| @@ -297,6 +299,9 @@ void MatrixPlugin::ExecuteCommands() | |||
| case TDOWN : | |||
| if (CanTransposeDown()) TransposeDown(); | |||
| break; | |||
| case MAT_VOLUME : | |||
| m_Matrix[m_Current].Volume[m_GUIArgs.X][m_GUIArgs.Y]=m_GUIArgs.Volume; | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| @@ -373,7 +378,7 @@ void MatrixPlugin::StreamOut(ostream &s) | |||
| { | |||
| for (int x=0; x<MATX; x++) | |||
| { | |||
| if (m_Matrix[n].Matrix[x][y]) s<<x<<" "<<y<<" "; | |||
| if (m_Matrix[n].Matrix[x][y]) s<<x<<" "<<y<<" "<<m_Matrix[n].Volume[x][y]<<" "; | |||
| } | |||
| } | |||
| s<<"-1 "; | |||
| @@ -423,5 +428,31 @@ void MatrixPlugin::StreamIn(istream &s) | |||
| } | |||
| } | |||
| } break; | |||
| case 3: | |||
| { | |||
| s>>m_Current>>m_Time>>m_Step>>m_Loop>>m_NoteCut; | |||
| for (int n=0; n<NUM_PATTERNS; n++) | |||
| { | |||
| s>>m_Matrix[n].Length>>m_Matrix[n].Speed>>m_Matrix[n].Octave; | |||
| int x=0,y=0; | |||
| float v; | |||
| while(x!=-1) | |||
| { | |||
| s>>x; | |||
| if (x!=-1) | |||
| { | |||
| s>>y>>v; | |||
| if (y!=-1) | |||
| { | |||
| m_Matrix[n].Matrix[x][y]=true; | |||
| m_Matrix[n].Volume[x][y]=v; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } break; | |||
| } | |||
| } | |||
| @@ -31,6 +31,7 @@ struct Pattern | |||
| int Length; | |||
| float Speed; | |||
| int Octave; | |||
| float Volume[MATX][MATY]; | |||
| bool Matrix[MATX][MATY]; | |||
| }; | |||
| @@ -53,7 +54,7 @@ public: | |||
| Pattern* GetPattern() { return &m_Matrix[m_Current]; } | |||
| enum GUICommands{NONE,MAT_LENGTH,MAT_SPEED,MAT_ACTIVATE,MAT_DEACTIVATE, | |||
| MAT_OCTAVE,COPY,PASTE,CLEAR,TUP,TDOWN}; | |||
| MAT_OCTAVE,COPY,PASTE,CLEAR,TUP,TDOWN,MAT_VOLUME}; | |||
| struct GUIArgs | |||
| { | |||
| @@ -62,6 +63,7 @@ public: | |||
| float Speed; | |||
| int X,Y; | |||
| int Octave; | |||
| float Volume; | |||
| }; | |||
| private: | |||
| @@ -25,6 +25,65 @@ static const int GUI_COLOUR = 179; | |||
| static const int GUIBG_COLOUR = 144; | |||
| static const int GUIBG2_COLOUR = 145; | |||
| //////////////////////////////////////////// | |||
| Fl_MatrixButton::Fl_MatrixButton(int x, int y, int w, int h, char* n) : | |||
| Fl_Button(x,y,w,h,n), | |||
| m_Volume(NULL), | |||
| cb_VolChange(NULL), | |||
| cb_context(NULL) | |||
| { | |||
| m_SliderHidden=true; | |||
| m_VolVal=255; | |||
| } | |||
| void Fl_MatrixButton::draw() | |||
| { | |||
| if (m_Volume) | |||
| { | |||
| m_VolVal=255-m_Volume->value(); | |||
| fl_color((char)m_VolVal,(char)m_VolVal,255); | |||
| selection_color(fl_color()); | |||
| if (cb_VolChange) cb_VolChange(this,cb_context); | |||
| } | |||
| Fl_Button::draw(); | |||
| } | |||
| int Fl_MatrixButton::handle(int event) | |||
| { | |||
| if (value()==true && event==FL_PUSH && Fl::event_button()==3) | |||
| { | |||
| if (m_SliderHidden) | |||
| { | |||
| m_Volume = new Fl_Slider(x(),y()+h(),w(),50,""); | |||
| m_Volume->type(4); | |||
| m_Volume->selection_color(GUI_COLOUR); | |||
| m_Volume->maximum(255); | |||
| m_Volume->step(1); | |||
| m_Volume->value(255-m_VolVal); | |||
| m_Volume->show(); | |||
| parent()->add(m_Volume); | |||
| parent()->redraw(); | |||
| m_SliderHidden=false; | |||
| } | |||
| else | |||
| { | |||
| m_Volume->hide(); | |||
| m_VolVal=m_Volume->value(); | |||
| parent()->remove(m_Volume); | |||
| parent()->redraw(); | |||
| m_Volume=NULL; | |||
| m_SliderHidden=true; | |||
| } | |||
| return 1; | |||
| } | |||
| if (Fl::event_button()!=3) return Fl_Button::handle(event); | |||
| return 1; | |||
| } | |||
| //////////////////////////////////////////// | |||
| MatrixPluginGUI::MatrixPluginGUI(int w, int h,MatrixPlugin *o,ChannelHandler *ch,const HostInfo *Info) : | |||
| @@ -115,17 +174,22 @@ SpiralPluginGUI(w,h,o,ch) | |||
| int butsize=7; | |||
| int n=0; | |||
| fl_color(150,150,150); | |||
| int markercol=fl_color(); | |||
| for(int x=0; x<MATX; x++) | |||
| for(int y=0; y<MATY; y++) | |||
| { | |||
| Numbers[n]=n; | |||
| m_Matrix[x][y] = new Fl_Button(xoff+x*butsize,yoff+y*butsize,butsize+1,butsize+1,""); | |||
| m_Matrix[x][y] = new Fl_MatrixButton(xoff+x*butsize,yoff+y*butsize,butsize+1,butsize+1,""); | |||
| m_Matrix[x][y]->type(1); | |||
| m_Matrix[x][y]->box(FL_BORDER_BOX); | |||
| if ((x%8)==0) m_Matrix[x][y]->color(FL_WHITE); | |||
| if ((x%8)==0) m_Matrix[x][y]->color(markercol); | |||
| else m_Matrix[x][y]->color(FL_GRAY); | |||
| m_Matrix[x][y]->selection_color(FL_BLACK); | |||
| m_Matrix[x][y]->selection_color(FL_WHITE); | |||
| m_Matrix[x][y]->callback((Fl_Callback*)cb_Matrix,(void*)&Numbers[n]); | |||
| m_Matrix[x][y]->SetVolCallback((Fl_Callback*)cb_MatVol,(void*)&Numbers[n]); | |||
| add(m_Matrix[x][y]); | |||
| n++; | |||
| } | |||
| @@ -167,6 +231,7 @@ void MatrixPluginGUI::UpdateValues(SpiralPlugin *o) | |||
| for(int y=0; y<MATY; y++) | |||
| { | |||
| m_Matrix[x][y]->value(Plugin->GetPattern()->Matrix[x][y]); | |||
| m_Matrix[x][y]->SetVolume(Plugin->GetPattern()->Volume[x][y]); | |||
| } | |||
| //if (Plugin->CanTransposeUp()) m_TransUpBtn->activate(); else m_TransUpBtn->deactivate(); | |||
| @@ -192,6 +257,7 @@ void MatrixPluginGUI::UpdateMatrix() | |||
| for(int y=0; y<MATY; y++) | |||
| { | |||
| m_Matrix[x][y]->value(m_GUIMatrix[(int)m_Pattern->value()].Matrix[x][y]); | |||
| m_Matrix[x][y]->SetVolume(m_GUIMatrix[(int)m_Pattern->value()].Volume[x][y]); | |||
| } | |||
| } | |||
| @@ -210,10 +276,22 @@ inline void MatrixPluginGUI::cb_Matrix_i(Fl_Button* o, void* v) | |||
| if (o->value()) m_GUICH->SetCommand(MatrixPlugin::MAT_ACTIVATE); | |||
| else m_GUICH->SetCommand(MatrixPlugin::MAT_DEACTIVATE); | |||
| m_GUICH->Wait(); | |||
| } | |||
| void MatrixPluginGUI::cb_Matrix(Fl_Button* o, void* v) | |||
| { ((MatrixPluginGUI*)(o->parent()))->cb_Matrix_i(o,v);} | |||
| inline void MatrixPluginGUI::cb_MatVol_i(Fl_Button* o, void* v) | |||
| { | |||
| m_GUICH->Set("X",*(int*)v/MATY); | |||
| m_GUICH->Set("Y",*(int*)v%MATY); | |||
| m_GUICH->Set("Volume",((Fl_MatrixButton*)o)->GetVolume()); | |||
| m_GUICH->SetCommand(MatrixPlugin::MAT_VOLUME); | |||
| } | |||
| void MatrixPluginGUI::cb_MatVol(Fl_Button* o, void* v) | |||
| { ((MatrixPluginGUI*)(o->parent()))->cb_MatVol_i(o,v);} | |||
| inline void MatrixPluginGUI::cb_Pattern_i(Fl_Counter* o, void* v) | |||
| { | |||
| if (o->value()<0) o->value(0); | |||
| @@ -276,6 +354,7 @@ inline void MatrixPluginGUI::cb_CopyBtn_i (Fl_Button* o, void* v) | |||
| { | |||
| m_PasteBtn->activate(); | |||
| m_GUICH->SetCommand(MatrixPlugin::COPY); | |||
| UpdateMatrix(); | |||
| } | |||
| void MatrixPluginGUI::cb_CopyBtn (Fl_Button* o, void* v) | |||
| @@ -33,6 +33,33 @@ | |||
| #ifndef MatrixGUI | |||
| #define MatrixGUI | |||
| class Fl_MatrixButton : public Fl_Button | |||
| { | |||
| public: | |||
| Fl_MatrixButton(int x, int y, int w, int h, char* n); | |||
| ~Fl_MatrixButton() {} | |||
| virtual void draw(); | |||
| virtual int handle(int event); | |||
| float GetVolume() { return m_VolVal/255.0f; } | |||
| void SetVolume(float s) | |||
| { | |||
| m_VolVal=s*255; | |||
| fl_color((char)m_VolVal,(char)m_VolVal,255); | |||
| selection_color(fl_color()); | |||
| } | |||
| void SetVolCallback(Fl_Callback* s, void *c) { cb_VolChange=s; cb_context=c; } | |||
| private: | |||
| bool m_SliderHidden; | |||
| Fl_Slider *m_Volume; | |||
| float m_VolVal; | |||
| void (*cb_VolChange)(Fl_Widget*, void*); | |||
| void *cb_context; | |||
| }; | |||
| class MatrixPluginGUI : public SpiralPluginGUI | |||
| { | |||
| public: | |||
| @@ -52,7 +79,7 @@ private: | |||
| Fl_Counter* m_Pattern; | |||
| Fl_Counter* m_Length; | |||
| Fl_Knob* m_Speed; | |||
| Fl_Button* m_Matrix[MATX][MATY]; | |||
| Fl_MatrixButton* m_Matrix[MATX][MATY]; | |||
| Fl_Counter* m_Octave; | |||
| Fl_Counter* m_SpeedVal; | |||
| Fl_LED_Button* m_Flash[MATX]; | |||
| @@ -66,6 +93,8 @@ private: | |||
| //// Callbacks //// | |||
| inline void cb_Matrix_i(Fl_Button* o, void* v); | |||
| static void cb_Matrix(Fl_Button* o, void* v); | |||
| inline void cb_MatVol_i(Fl_Button* o, void* v); | |||
| static void cb_MatVol(Fl_Button* o, void* v); | |||
| inline void cb_Pattern_i(Fl_Counter* o, void* v); | |||
| static void cb_Pattern(Fl_Counter* o, void* v); | |||
| inline void cb_Length_i(Fl_Counter* o, void* v); | |||
| @@ -302,8 +302,8 @@ void OscillatorPluginGUI::cb_FineTune(Fl_Knob* o, void* v) | |||
| inline void OscillatorPluginGUI::cb_PulseWidth_i(Fl_Slider* o, void* v) | |||
| { | |||
| char str[10]; | |||
| m_GUICH->Set("PulseWidth",o->value()); | |||
| sprintf(str,"%4.0f %%", 100*o->value()); | |||
| m_GUICH->Set("PulseWidth",(float)o->value()); | |||
| sprintf(str,"%4.0f %%",(float)(100*o->value())); | |||
| m_out_pulseW->value(str); | |||
| } | |||
| @@ -114,14 +114,15 @@ void Fl_WaveDisplay::draw() | |||
| Value = NextValue; | |||
| // get average | |||
| NextValue=0; | |||
| // get max | |||
| NextValue=(*m_Sample)[n]; | |||
| for (int m=n; m<n+Jump; m++) | |||
| { | |||
| NextValue+=(*m_Sample)[m]; | |||
| if (NextValue<(*m_Sample)[m]) NextValue=(*m_Sample)[m]; | |||
| } | |||
| NextValue=(NextValue*ho)/Jump; | |||
| NextValue*=ho; | |||
| fl_line(x()+pos-2, y()+ho-(int)Value, | |||
| x()+pos-1, y()+ho-(int)NextValue); | |||
| pos++; | |||
| @@ -233,38 +234,36 @@ int Fl_WaveDisplay::handle(int event) | |||
| redraw(); | |||
| } | |||
| if (event==FL_KEYBOARD || event==FL_SHORTCUT) | |||
| { | |||
| if (Fl::event_key('+')) | |||
| { | |||
| int Zoom=(int)((m_ViewEnd-m_ViewStart)*0.03f); | |||
| if ((m_ViewEnd-m_ViewStart)/w()>1) | |||
| { | |||
| m_ViewStart+=Zoom; | |||
| m_ViewEnd-=Zoom; | |||
| } | |||
| redraw(); | |||
| } | |||
| if (Fl::event_key('-')) | |||
| { | |||
| int Zoom=(int)((m_ViewEnd-m_ViewStart)*0.03f); | |||
| m_ViewStart-=Zoom; | |||
| m_ViewEnd+=Zoom; | |||
| redraw(); | |||
| } | |||
| } | |||
| if (m_EndPos>=m_Sample->GetLength()) m_EndPos=m_Sample->GetLength()-1; | |||
| return 1; | |||
| } | |||
| void Fl_WaveDisplay::ZoomIn() | |||
| { | |||
| int Zoom=(int)((m_ViewEnd-m_ViewStart)*0.03f); | |||
| if ((m_ViewEnd-m_ViewStart)/w()>1) | |||
| { | |||
| m_ViewStart+=Zoom; | |||
| m_ViewEnd-=Zoom; | |||
| } | |||
| redraw(); | |||
| } | |||
| void Fl_WaveDisplay::ZoomOut() | |||
| { | |||
| int Zoom=(int)((m_ViewEnd-m_ViewStart)*0.03f); | |||
| m_ViewStart-=Zoom; | |||
| m_ViewEnd+=Zoom; | |||
| redraw(); | |||
| } | |||
| //////////////////////////////////////////// | |||
| PoshSamplerPluginGUI::PoshSamplerPluginGUI(int w, int h,PoshSamplerPlugin *o,ChannelHandler *ch,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o,ch) | |||
| SpiralPluginGUI(w,h,o,ch), | |||
| m_UpdateMe(false) | |||
| { | |||
| int n=0; | |||
| @@ -354,7 +353,7 @@ SpiralPluginGUI(w,h,o,ch) | |||
| m_Display = new Fl_WaveDisplay(5,85,w-10,100,""); | |||
| m_Display->callback((Fl_Callback*)cb_WaveDisplay); | |||
| int bx=5,by=190,bw=w/7-2,bh=20,bs=w/7-2; | |||
| int bx=5,by=190,bw=w/9-2,bh=20,bs=w/9-2; | |||
| n=0; | |||
| m_Cut = new Fl_Button(bx+(n++*bs),by,bw,bh,"Cut"); | |||
| @@ -385,6 +384,14 @@ SpiralPluginGUI(w,h,o,ch) | |||
| m_Amp->labelsize(10); | |||
| m_Amp->callback((Fl_Callback*)cb_Amp); | |||
| m_ZoomIn = new Fl_Button(bx+(n++*bs),by,bw,bh,"Zoom +"); | |||
| m_ZoomIn->labelsize(10); | |||
| m_ZoomIn->callback((Fl_Callback*)cb_ZoomIn); | |||
| m_ZoomOut = new Fl_Button(bx+(n++*bs),by,bw,bh,"Zoom -"); | |||
| m_ZoomOut->labelsize(10); | |||
| m_ZoomOut->callback((Fl_Callback*)cb_ZoomOut); | |||
| end(); | |||
| redraw(); | |||
| @@ -396,11 +403,11 @@ void PoshSamplerPluginGUI::UpdateSampleDisplay(int num) | |||
| m_GUICH->Wait(); | |||
| m_GUICH->RequestChannelAndWait("SampleSize"); | |||
| long SampleSize=m_GUICH->GetLong("SampleSize"); | |||
| if (SampleSize) | |||
| { | |||
| char *TempBuf = new char[SampleSize]; | |||
| m_GUICH->BulkTransfer("SampleBuffer",(void*)TempBuf,SampleSize); | |||
| m_GUICH->BulkTransfer("SampleBuffer",(void*)TempBuf,SampleSize); | |||
| m_Display->SetSample((float*)TempBuf,SampleSize/sizeof(float)); | |||
| delete[] TempBuf; | |||
| } | |||
| @@ -409,6 +416,13 @@ void PoshSamplerPluginGUI::UpdateSampleDisplay(int num) | |||
| void PoshSamplerPluginGUI::Update() | |||
| { | |||
| SetPlayPos(m_GUICH->GetLong("PlayPos")); | |||
| if (m_UpdateMe) | |||
| { | |||
| UpdateSampleDisplay((int)m_SampleNum->value()); | |||
| m_Display->redraw(); | |||
| m_UpdateMe=false; | |||
| } | |||
| redraw(); | |||
| } | |||
| @@ -420,11 +434,7 @@ void PoshSamplerPluginGUI::UpdateValues(SpiralPlugin *o) | |||
| m_Pitch->value(Plugin->GetPitch((int)m_SampleNum->value())); | |||
| m_Note->value(Plugin->GetNote((int)m_SampleNum->value())); | |||
| m_Loop->value(Plugin->GetLoop((int)m_SampleNum->value())); | |||
| Sample *sample = Plugin->GetSample((int)m_SampleNum->value()); | |||
| if (sample->GetLength()) | |||
| { | |||
| m_Display->SetSample(sample->GetBuffer(),sample->GetLength()); | |||
| } | |||
| m_UpdateMe=true; | |||
| m_Display->SetPlayStart(Plugin->GetPlayStart((int)m_SampleNum->value())); | |||
| m_Display->SetLoopStart(Plugin->GetLoopStart((int)m_SampleNum->value())); | |||
| m_Display->SetLoopEnd(Plugin->GetLoopEnd((int)m_SampleNum->value())); | |||
| @@ -646,3 +656,17 @@ inline void PoshSamplerPluginGUI::cb_WaveDisplay_i(Fl_WaveDisplay* o, void* v) | |||
| } | |||
| void PoshSamplerPluginGUI::cb_WaveDisplay(Fl_WaveDisplay* o, void* v) | |||
| { ((PoshSamplerPluginGUI*)(o->parent()))->cb_WaveDisplay_i(o,v);} | |||
| inline void PoshSamplerPluginGUI::cb_ZoomIn_i(Fl_Button* o, void* v) | |||
| { | |||
| m_Display->ZoomIn(); | |||
| } | |||
| void PoshSamplerPluginGUI::cb_ZoomIn(Fl_Button* o, void* v) | |||
| { ((PoshSamplerPluginGUI*)(o->parent()))->cb_ZoomIn_i(o,v);} | |||
| inline void PoshSamplerPluginGUI::cb_ZoomOut_i(Fl_Button* o, void* v) | |||
| { | |||
| m_Display->ZoomOut(); | |||
| } | |||
| void PoshSamplerPluginGUI::cb_ZoomOut(Fl_Button* o, void* v) | |||
| { ((PoshSamplerPluginGUI*)(o->parent()))->cb_ZoomOut_i(o,v);} | |||
| @@ -50,6 +50,8 @@ class Fl_WaveDisplay : public Fl_Widget | |||
| void SetLoopEnd(long s) { m_LoopEnd=s; } | |||
| long GetLoopEnd() { return m_LoopEnd; } | |||
| void SetPosMarker(bool s) { m_PosMarker=s; } | |||
| void ZoomIn(); | |||
| void ZoomOut(); | |||
| private: | |||
| @@ -85,6 +87,7 @@ private: | |||
| char m_TextBuf[256]; | |||
| int Numbers[NUM_SAMPLES]; | |||
| bool m_UpdateMe; | |||
| Fl_Button* m_Load; | |||
| Fl_Button* m_Save; | |||
| @@ -98,6 +101,8 @@ private: | |||
| Fl_Counter* m_Note; | |||
| Fl_WaveDisplay* m_Display; | |||
| Fl_Counter* m_SampleNum; | |||
| Fl_Button* m_ZoomIn; | |||
| Fl_Button* m_ZoomOut; | |||
| Fl_Button* m_Cut; | |||
| Fl_Button* m_Copy; | |||
| @@ -145,6 +150,10 @@ private: | |||
| static void cb_Reverse(Fl_Button* o, void* v); | |||
| inline void cb_Amp_i(Fl_Button* o, void* v); | |||
| static void cb_Amp(Fl_Button* o, void* v); | |||
| inline void cb_ZoomIn_i(Fl_Button* o, void* v); | |||
| static void cb_ZoomIn(Fl_Button* o, void* v); | |||
| inline void cb_ZoomOut_i(Fl_Button* o, void* v); | |||
| static void cb_ZoomOut(Fl_Button* o, void* v); | |||
| inline void cb_WaveDisplay_i(Fl_WaveDisplay* o, void* v); | |||
| static void cb_WaveDisplay(Fl_WaveDisplay* o, void* v); | |||
| }; | |||
| @@ -0,0 +1,199 @@ | |||
| ############################################################################# | |||
| # Makefile for building SequencerPlugin.so | |||
| # Generated by tmake at 22:13, 2001/09/17 | |||
| # Project: SequencerPlugin | |||
| # Template: app | |||
| ############################################################################# | |||
| ####### Compiler, tools and options | |||
| CC = gcc | |||
| CXX = g++ | |||
| CFLAGS = @CFLAGS@ | |||
| CXXFLAGS= @CXXFLAGS@ | |||
| INCPATH = -I/usr/X11R6/include | |||
| LINK = g++ -shared | |||
| LFLAGS = | |||
| LIBS = -L/usr/X11R6/lib -lfltk -lGL -lXext -lX11 -lm -ldl | |||
| MOC = moc | |||
| UIC = | |||
| TAR = tar -cf | |||
| GZIP = gzip -9f | |||
| INSTALL = @INSTALL@ | |||
| ###### Autoconf variables | |||
| prefix = @prefix@ | |||
| exec_prefix = @exec_prefix@ | |||
| bindir = @bindir@ | |||
| sbindir = @sbindir@ | |||
| libexecdir = @libexecdir@ | |||
| datadir = @datadir@ | |||
| sysconfdir = @sysconfdir@ | |||
| sharedstatedir = @sharedstatedir@ | |||
| localstatedir = @localstatedir@ | |||
| libdir = @libdir@ | |||
| infodir = @infodir@ | |||
| mandir = @mandir@ | |||
| ####### Files | |||
| HEADERS = ../SpiralPlugin.h \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../../ChannelHandler.h \ | |||
| ../Widgets/Fl_Knob.H \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../Widgets/Fl_EventMap.h \ | |||
| ../Widgets/Fl_SEvent.h \ | |||
| ../../Sample.h \ | |||
| ../../RiffWav.h \ | |||
| SequencerPlugin.h \ | |||
| SequencerPluginGUI.h | |||
| SOURCES = ../SpiralPlugin.C \ | |||
| ../SpiralPluginGUI.C \ | |||
| ../../ChannelHandler.C \ | |||
| ../Widgets/Fl_Knob.cxx \ | |||
| ../Widgets/Fl_DragBar.cxx \ | |||
| ../Widgets/Fl_EventMap.C \ | |||
| ../Widgets/Fl_SEvent.C \ | |||
| ../../Sample.C \ | |||
| ../../RiffWav.C \ | |||
| SequencerPlugin.C \ | |||
| SequencerPluginGUI.C | |||
| OBJECTS = ../SpiralPlugin.o \ | |||
| ../SpiralPluginGUI.o \ | |||
| ../../ChannelHandler.o \ | |||
| ../Widgets/Fl_Knob.o \ | |||
| ../Widgets/Fl_DragBar.o \ | |||
| ../Widgets/Fl_EventMap.o \ | |||
| ../Widgets/Fl_SEvent.o \ | |||
| ../../Sample.o \ | |||
| ../../RiffWav.o \ | |||
| SequencerPlugin.o \ | |||
| SequencerPluginGUI.o | |||
| INTERFACES = | |||
| UICDECLS = | |||
| UICIMPLS = | |||
| SRCMOC = | |||
| OBJMOC = | |||
| DIST = | |||
| TARGET = SequencerPlugin.so | |||
| ####### Implicit rules | |||
| .SUFFIXES: .cpp .cxx .cc .C .c | |||
| .cpp.o: | |||
| $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< | |||
| .cxx.o: | |||
| $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< | |||
| .cc.o: | |||
| $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< | |||
| .C.o: | |||
| $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< | |||
| .c.o: | |||
| $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $< | |||
| ####### Build rules | |||
| all: $(TARGET) | |||
| $(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC) | |||
| $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS) | |||
| moc: $(SRCMOC) | |||
| tmake: | |||
| tmake SequencerPlugin.pro | |||
| dist: | |||
| $(TAR) SequencerPlugin.tar SequencerPlugin.pro $(SOURCES) $(HEADERS) $(INTERFACES) $(DIST) | |||
| $(GZIP) SequencerPlugin.tar | |||
| clean: | |||
| -rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(UICIMPLS) $(UICDECLS) $(TARGET) | |||
| -rm -f *~ core | |||
| install: | |||
| $(INSTALL) $(TARGET) $(libdir)/SpiralPlugins | |||
| ####### Sub-libraries | |||
| ###### Combined headers | |||
| ####### Compile | |||
| ../SpiralPlugin.o: ../SpiralPlugin.C \ | |||
| ../SpiralPlugin.h \ | |||
| ../../Sample.h | |||
| ../SpiralPluginGUI.o: ../SpiralPluginGUI.C \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../SpiralPlugin.h \ | |||
| ../../Sample.h | |||
| ../Widgets/Fl_Knob.o: ../Widgets/Fl_Knob.cxx \ | |||
| ../Widgets/Fl_Knob.H | |||
| ../Widgets/Fl_DragBar.o: ../Widgets/Fl_DragBar.cxx \ | |||
| ../Widgets/Fl_DragBar.H | |||
| ../Widgets/Fl_EventMap.o: ../Widgets/Fl_EventMap.C \ | |||
| ../Widgets/Fl_EventMap.h \ | |||
| ../Widgets/Fl_SEvent.h | |||
| ../Widgets/Fl_SEvent.o: ../Widgets/Fl_SEvent.C \ | |||
| ../Widgets/Fl_SEvent.h \ | |||
| ../Widgets/Fl_EventMap.h | |||
| ../../Sample.o: ../../Sample.C \ | |||
| ../../Sample.h \ | |||
| ../../SpiralInfo.h | |||
| ../../RiffWav.o: ../../RiffWav.C \ | |||
| ../../RiffWav.h \ | |||
| ../../Sample.h \ | |||
| ../../SpiralInfo.h | |||
| SequencerPlugin.o: SequencerPlugin.C \ | |||
| SequencerPlugin.h \ | |||
| ../SpiralPlugin.h \ | |||
| ../../Sample.h \ | |||
| ../../SpiralInfo.h \ | |||
| ../../Sample.h \ | |||
| ../Widgets/Fl_EventMap.h \ | |||
| ../Widgets/Fl_SEvent.h \ | |||
| SequencerPluginGUI.h \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../Widgets/Fl_Knob.H \ | |||
| SpiralIcon.xpm \ | |||
| ../../RiffWav.h \ | |||
| ../../NoteTable.h | |||
| SequencerPluginGUI.o: SequencerPluginGUI.C \ | |||
| SequencerPluginGUI.h \ | |||
| SequencerPluginss.h \ | |||
| ../SpiralPlugin.h \ | |||
| ../../Sample.h \ | |||
| ../../SpiralInfo.h \ | |||
| ../../Sample.h \ | |||
| ../Widgets/Fl_EventMap.h \ | |||
| ../Widgets/Fl_SEvent.h \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../Widgets/Fl_Knob.H | |||
| ../../ChannelHandler.o: ../../ChannelHandler.C \ | |||
| ../../ChannelHandler.h | |||
| @@ -0,0 +1,269 @@ | |||
| /* SpiralSound | |||
| * Copyleft (C) 2001 David Griffiths <dave@pawfal.org> | |||
| * | |||
| * This program is free software; you can redistribute it and/or modify | |||
| * it under the terms of the GNU General Public License as published by | |||
| * the Free Software Foundation; either version 2 of the License, or | |||
| * (at your option) any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * You should have received a copy of the GNU General Public License | |||
| * along with this program; if not, write to the Free Software | |||
| * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
| */ | |||
| #include "SequencerPlugin.h" | |||
| #include "SequencerPluginGUI.h" | |||
| #include <FL/Fl_Button.h> | |||
| #include "SpiralIcon.xpm" | |||
| #include "../../RiffWav.h" | |||
| #include "../../NoteTable.h" | |||
| // for note on's | |||
| static const float TRIGGER_LEV=0.1; | |||
| extern "C" { | |||
| SpiralPlugin* CreateInstance() | |||
| { | |||
| return new SequencerPlugin; | |||
| } | |||
| char** GetIcon() | |||
| { | |||
| return SpiralIcon_xpm; | |||
| } | |||
| int GetID() | |||
| { | |||
| return 0x0011; | |||
| } | |||
| } | |||
| /////////////////////////////////////////////////////// | |||
| SequencerPlugin::SequencerPlugin() : | |||
| m_Time(0.0f), | |||
| m_Length(10.0f), | |||
| m_SpeedMod(1.0f), | |||
| m_CurrentNoteCV(0), | |||
| m_CurrentTriggerCV(0), | |||
| m_InNoteDown(false), | |||
| m_InNoteID(0), | |||
| m_CurrentPattern(0), | |||
| m_Triggered(false) | |||
| { | |||
| m_Version=2; | |||
| m_PluginInfo.Name="Sequencer"; | |||
| m_PluginInfo.Width=540; | |||
| m_PluginInfo.Height=290; | |||
| m_PluginInfo.NumInputs=4; | |||
| m_PluginInfo.NumOutputs=2; | |||
| m_PluginInfo.PortTips.push_back("Play Trigger"); | |||
| m_PluginInfo.PortTips.push_back("Speed CV"); | |||
| m_PluginInfo.PortTips.push_back("Input Pitch CV"); | |||
| m_PluginInfo.PortTips.push_back("Input Trigger CV"); | |||
| m_PluginInfo.PortTips.push_back("Output Pitch"); | |||
| m_PluginInfo.PortTips.push_back("Output Trigger"); | |||
| } | |||
| SequencerPlugin::~SequencerPlugin() | |||
| { | |||
| } | |||
| PluginInfo &SequencerPlugin::Initialise(const HostInfo *Host) | |||
| { | |||
| return SpiralPlugin::Initialise(Host); | |||
| } | |||
| SpiralGUIType *SequencerPlugin::CreateGUI() | |||
| { | |||
| return new SequencerPluginGUI(m_PluginInfo.Width, | |||
| m_PluginInfo.Height, | |||
| this,m_AudioCH,m_HostInfo); | |||
| } | |||
| void SequencerPlugin::SetPattern(int s) | |||
| { | |||
| //m_Eventmap[m_CurrentPattern]->hide(); | |||
| m_CurrentPattern=s; | |||
| //m_Eventmap[m_CurrentPattern]->show(); | |||
| } | |||
| void SequencerPlugin::Execute() | |||
| { | |||
| float Speed; | |||
| for (int n=0; n<m_HostInfo->BUFSIZE; n++) | |||
| { | |||
| if (GetInputPitch(0,n)>0) | |||
| { | |||
| if (!m_Triggered) | |||
| { | |||
| float Freq=GetInputPitch(0,n); | |||
| // Notes 0 to 16 trigger patterns 0 to 16 | |||
| // No other notes catered for | |||
| for (int i=0; i<NUM_PATTERNS; i++) | |||
| { | |||
| if (feq(Freq,NoteTable[i],0.01f)) | |||
| { | |||
| SetPattern(i); | |||
| break; | |||
| } | |||
| } | |||
| m_Time=0; | |||
| m_Triggered=true; | |||
| } | |||
| } | |||
| else | |||
| { | |||
| m_Triggered=false; | |||
| } | |||
| if (InputExists(1)) | |||
| Speed =(1.1025f/m_HostInfo->SAMPLERATE) * (GetInput(1,n)+1.0f); | |||
| else | |||
| Speed =1.1025f/m_HostInfo->SAMPLERATE; | |||
| if (!m_InNoteDown) | |||
| { | |||
| // Check trigger | |||
| if (GetInput(3,n)>TRIGGER_LEV) | |||
| { | |||
| m_InNoteDown=true; | |||
| float Freq=GetInputPitch(2,n); | |||
| int NoteNum=0; | |||
| for (int i=0; i<131; i++) | |||
| { | |||
| if (feq(Freq,NoteTable[i],0.01f)) | |||
| { | |||
| NoteNum=i; | |||
| break; | |||
| } | |||
| } | |||
| /*cerr<<"note recieved ="<<NoteNum<<" f="<<Freq | |||
| <<" t-1="<<NoteTable[NoteNum-1] | |||
| <<" t="<<NoteTable[NoteNum] | |||
| <<" t+1="<<NoteTable[NoteNum+1]<<endl; | |||
| */ | |||
| //m_InNoteID=m_Eventmap[m_CurrentPattern]->AddEventTime(m_Time, NoteNum, 0.5, Fl_SEvent::MELODY, false); | |||
| m_InNoteTime=m_Time; | |||
| } | |||
| } | |||
| else | |||
| { | |||
| // Check trigger | |||
| if (GetInput(3,n)<TRIGGER_LEV) | |||
| { | |||
| //m_Eventmap[m_CurrentPattern]->SetEventLength(m_InNoteID, m_Time-m_InNoteTime); | |||
| m_InNoteDown=false; | |||
| } | |||
| } | |||
| // Get the notes from the map | |||
| /*vector<EventInfo> NoteVec=m_Eventmap[m_CurrentPattern]->GetEvents(m_Time); | |||
| // play all the notes found | |||
| for (vector<EventInfo>::iterator i=NoteVec.begin(); | |||
| i!=NoteVec.end(); i++) | |||
| { | |||
| if (i->m_Type==EventInfo::START) | |||
| { | |||
| m_CurrentNoteCV=NoteTable[i->m_Group]; | |||
| m_CurrentTriggerCV=1; | |||
| } | |||
| if (i->m_Type==EventInfo::END) | |||
| { | |||
| m_CurrentTriggerCV=0; | |||
| if (m_NoteCut) m_CurrentNoteCV=0; | |||
| } | |||
| } | |||
| */ | |||
| SetOutputPitch(0,n,m_CurrentNoteCV); | |||
| SetOutput(1,n,m_CurrentTriggerCV); | |||
| m_Time+=Speed*m_SpeedMod; | |||
| if (m_Time>m_Length) | |||
| { | |||
| m_Time=0; | |||
| } | |||
| if (m_Time<0) | |||
| { | |||
| m_Time=m_Length; | |||
| } | |||
| } | |||
| } | |||
| void SequencerPlugin::ExecuteCommands() | |||
| { | |||
| } | |||
| void SequencerPlugin::StreamOut(ostream &s) | |||
| { | |||
| s<<m_Version<<" "; | |||
| switch (m_Version) | |||
| { | |||
| case 2: | |||
| { | |||
| s<<m_Time<<" "; | |||
| s<<m_Length<<" "; | |||
| s<<m_SpeedMod<<" "; | |||
| s<<m_Loop<<" "; | |||
| s<<m_NoteCut<<" "; | |||
| s<<m_CurrentPattern<<" "; | |||
| } | |||
| // fallthrough | |||
| case 1: | |||
| { | |||
| for(int n=0; n<NUM_PATTERNS; n++) | |||
| { | |||
| //s<<*m_Eventmap[n]<<" "; | |||
| } | |||
| } break; | |||
| } | |||
| } | |||
| void SequencerPlugin::StreamIn(istream &s) | |||
| { | |||
| int version; | |||
| s>>version; | |||
| switch (version) | |||
| { | |||
| case 2: | |||
| { | |||
| s>>m_Time; | |||
| s>>m_Length; | |||
| s>>m_SpeedMod; | |||
| s>>m_Loop; | |||
| s>>m_NoteCut; | |||
| s>>m_CurrentPattern; | |||
| } | |||
| // fallthrough | |||
| case 1: | |||
| { | |||
| for(int n=0; n<NUM_PATTERNS; n++) | |||
| { | |||
| //s>>*m_Eventmap[n]; | |||
| } | |||
| } break; | |||
| } | |||
| } | |||
| @@ -0,0 +1,100 @@ | |||
| /* SpiralSound | |||
| * Copyleft (C) 2001 David Griffiths <dave@pawfal.org> | |||
| * | |||
| * This program is free software; you can redistribute it and/or modify | |||
| * it under the terms of the GNU General Public License as published by | |||
| * the Free Software Foundation; either version 2 of the License, or | |||
| * (at your option) any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * You should have received a copy of the GNU General Public License | |||
| * along with this program; if not, write to the Free Software | |||
| * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
| */ | |||
| #include "../SpiralPlugin.h" | |||
| #include <FL/Fl_Pixmap.H> | |||
| #include "../Widgets/Fl_EventMap.h" | |||
| #include <list> | |||
| #ifndef SequencerPLUGIN | |||
| #define SequencerPLUGIN | |||
| const int NUM_PATTERNS = 16; | |||
| class Track | |||
| { | |||
| public: | |||
| class Sequence | |||
| { | |||
| public: | |||
| class Pattern | |||
| { | |||
| public: | |||
| class Note | |||
| { | |||
| public: | |||
| float time; | |||
| int note; | |||
| float vol; | |||
| }; | |||
| map<int,Note> m_NoteMap; | |||
| }; | |||
| float m_StartTime; | |||
| int m_Pattern; | |||
| }; | |||
| map<int,Sequence::Pattern> m_PatternMap; | |||
| list<Sequence> m_SequenceList; | |||
| }; | |||
| class SequencerPlugin : public SpiralPlugin | |||
| { | |||
| public: | |||
| SequencerPlugin(); | |||
| virtual ~SequencerPlugin(); | |||
| virtual PluginInfo &Initialise(const HostInfo *Host); | |||
| virtual SpiralGUIType *CreateGUI(); | |||
| virtual void Execute(); | |||
| virtual void ExecuteCommands(); | |||
| virtual void StreamOut(ostream &s); | |||
| virtual void StreamIn(istream &s); | |||
| bool GetNoteCut() { return m_NoteCut; } | |||
| void ClearAll() { /*m_Eventmap[m_CurrentPattern]->RemoveAllEvents();*/ } | |||
| int GetCurrentPattern() { return m_CurrentPattern; } | |||
| private: | |||
| Track m_Track; | |||
| void SetEventMap(int n, Fl_EventMap* s) { /*m_Eventmap[n]=s;*/ } | |||
| void SetUpdate(bool s) { /*m_Eventmap[m_CurrentPattern]->SetUpdate(s);*/ } | |||
| void SetZoom(float s) { /*m_Eventmap[m_CurrentPattern]->SetZoomLevel(s);*/ } | |||
| void SetNoteCut(bool s) { m_NoteCut=s; } | |||
| void SetEndTime(float s) { /*m_Eventmap[m_CurrentPattern]->SetEndTime(s);*/ m_Length=s; } | |||
| void SetSpeed(float s) { m_SpeedMod=s; } | |||
| void SetPattern(int s); | |||
| float m_Time; | |||
| float m_Length; | |||
| bool m_Loop; | |||
| bool m_NoteCut; | |||
| float m_SpeedMod; | |||
| float m_CurrentNoteCV; | |||
| float m_CurrentTriggerCV; | |||
| bool m_InNoteDown; | |||
| int m_InNoteID; | |||
| float m_InNoteTime; | |||
| int m_CurrentPattern; | |||
| bool m_Triggered; | |||
| }; | |||
| #endif | |||
| @@ -0,0 +1,191 @@ | |||
| /* SpiralPlugin | |||
| * Copyleft (C) 2000 David Griffiths <dave@pawfal.org> | |||
| * | |||
| * This program is free software; you can redistribute it and/or modify | |||
| * it under the terms of the GNU General Public License as published by | |||
| * the Free Software Foundation; either version 2 of the License, or | |||
| * (at your option) any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * You should have received a copy of the GNU General Public License | |||
| * along with this program; if not, write to the Free Software | |||
| * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
| */ | |||
| #include <stdio.h> | |||
| #include "SequencerPluginGUI.h" | |||
| #include <FL/fl_draw.h> | |||
| #include <FL/fl_draw.H> | |||
| #include <FL/fl_file_chooser.h> | |||
| static const int GUI_COLOUR = 179; | |||
| static const int GUIBG_COLOUR = 144; | |||
| static const int GUIBG2_COLOUR = 145; | |||
| //////////////////////////////////////////// | |||
| SequencerPluginGUI::PatternWin::PatternWin(int w,int h,const char* n) : | |||
| Fl_Double_Window(w,h,n) | |||
| { | |||
| m_Scroll = new Fl_Scroll(0, 0, w, h, ""); | |||
| resizable(m_Scroll); | |||
| add(m_Scroll); | |||
| m_Melody = new Fl_EventMap(0, 0, 1000, 1000, ""); | |||
| m_Melody->SetType(Fl_EventMap::MELODY_MAP); | |||
| m_Scroll->add(m_Melody); | |||
| m_Melody->CreateWindow(); | |||
| m_Melody->SetUpdateLineClip(0, 18, w, h-38); | |||
| m_Melody->show(); | |||
| end(); | |||
| } | |||
| //////////////////////////////////////////// | |||
| SequencerPluginGUI::SequencerPluginGUI(int w, int h,SequencerPlugin *o,ChannelHandler *ch,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o,ch) | |||
| { | |||
| m_Scroll = new Fl_Scroll(50, 20, w-57, h-26, ""); | |||
| add(m_Scroll); | |||
| m_ArrangementMap = new Fl_EventMap(0, 0, 1000, 1000, ""); | |||
| m_ArrangementMap->user_data((void*)this); | |||
| m_ArrangementMap->SetType(Fl_EventMap::ARRANGE_MAP); | |||
| m_Scroll->add(m_ArrangementMap); | |||
| m_ArrangementMap->CreateWindow(); | |||
| m_ArrangementMap->SetUpdateLineClip(0, 18, w, h-38); | |||
| m_ArrangementMap->show(); | |||
| m_Length = new Fl_Knob(5, 60, 40, 40, "Length"); | |||
| m_Length->color(GUI_COLOUR); | |||
| m_Length->type(Fl_Knob::DOTLIN); | |||
| m_Length->labelsize(10); | |||
| m_Length->maximum(30); | |||
| m_Length->step(0.01); | |||
| m_Length->value(1.0); | |||
| m_Length->callback((Fl_Callback*)cb_Length); | |||
| add(m_Length); | |||
| m_Speed = new Fl_Knob(5, 115, 40, 40, "Speed"); | |||
| m_Speed->color(GUI_COLOUR); | |||
| m_Speed->type(Fl_Knob::DOTLIN); | |||
| m_Speed->labelsize(10); | |||
| m_Speed->maximum(4); | |||
| m_Speed->step(0.01); | |||
| m_Speed->value(2.0); | |||
| m_Speed->callback((Fl_Callback*)cb_Speed); | |||
| add(m_Speed); | |||
| m_Zoom = new Fl_Knob(5,170,40,40,"Zoom"); | |||
| m_Zoom->color(GUI_COLOUR); | |||
| m_Zoom->type(Fl_Knob::DOTLIN); | |||
| m_Zoom->labelsize(10); | |||
| m_Zoom->maximum(2); | |||
| m_Zoom->step(0.01); | |||
| m_Zoom->value(1.0); | |||
| m_Zoom->callback((Fl_Callback*)cb_Zoom); | |||
| add(m_Zoom); | |||
| m_NewPattern = new Fl_Button(2,225,45,20,"New Pat"); | |||
| m_NewPattern->type(0); | |||
| m_NewPattern->labelsize(10); | |||
| m_NewPattern->callback((Fl_Callback*)cb_NewPattern,NULL); | |||
| add(m_NewPattern); | |||
| m_NoteCut = new Fl_Button(2,245,45,20,"NoteCut"); | |||
| m_NoteCut->type(1); | |||
| m_NoteCut->labelsize(10); | |||
| m_NoteCut->value(0); | |||
| m_NoteCut->callback((Fl_Callback*)cb_NoteCut); | |||
| add(m_NoteCut); | |||
| m_Clear = new Fl_Button(2,265,45,20,"Clear"); | |||
| m_Clear->type(0); | |||
| m_Clear->labelsize(10); | |||
| m_Clear->value(0); | |||
| m_Clear->callback((Fl_Callback*)cb_Clear); | |||
| add(m_Clear); | |||
| end(); | |||
| } | |||
| void SequencerPluginGUI::UpdateValues(SpiralPlugin *o) | |||
| { | |||
| } | |||
| inline void SequencerPluginGUI::cb_NoteCut_i(Fl_Button* o, void* v) | |||
| { | |||
| //m_Plugin->SetNoteCut(o->value()); | |||
| } | |||
| void SequencerPluginGUI::cb_NoteCut(Fl_Button* o, void* v) | |||
| { ((SequencerPluginGUI*)(o->parent()))->cb_NoteCut_i(o,v);} | |||
| inline void SequencerPluginGUI::cb_Zoom_i(Fl_Knob* o, void* v) | |||
| { | |||
| //m_Plugin->SetZoom(o->value()); | |||
| } | |||
| void SequencerPluginGUI::cb_Zoom(Fl_Knob* o, void* v) | |||
| { ((SequencerPluginGUI*)(o->parent()))->cb_Zoom_i(o,v);} | |||
| inline void SequencerPluginGUI::cb_Pattern_i(Fl_Counter* o, void* v) | |||
| { | |||
| if (o->value()<0) o->value(0); | |||
| if (o->value()>NUM_PATTERNS-1) o->value(NUM_PATTERNS-1); | |||
| //m_Plugin->SetPattern((int)o->value()); | |||
| //UpdateValues(); | |||
| } | |||
| void SequencerPluginGUI::cb_Pattern(Fl_Counter* o, void* v) | |||
| { ((SequencerPluginGUI*)(o->parent()))->cb_Pattern_i(o,v);} | |||
| inline void SequencerPluginGUI::cb_Length_i(Fl_Knob* o, void* v) | |||
| { | |||
| //m_Plugin->SetEndTime(o->value()); | |||
| } | |||
| void SequencerPluginGUI::cb_Length(Fl_Knob* o, void* v) | |||
| { ((SequencerPluginGUI*)(o->parent()))->cb_Length_i(o,v);} | |||
| inline void SequencerPluginGUI::cb_Speed_i(Fl_Knob* o, void* v) | |||
| { | |||
| //m_Plugin->SetSpeed(o->value()-2.0f); | |||
| } | |||
| void SequencerPluginGUI::cb_Speed(Fl_Knob* o, void* v) | |||
| { ((SequencerPluginGUI*)(o->parent()))->cb_Speed_i(o,v);} | |||
| inline void SequencerPluginGUI::cb_Clear_i(Fl_Button* o, void* v) | |||
| { | |||
| //m_Plugin->ClearAll(); | |||
| } | |||
| void SequencerPluginGUI::cb_Clear(Fl_Button* o, void* v) | |||
| { ((SequencerPluginGUI*)(o->parent()))->cb_Clear_i(o,v);} | |||
| inline void SequencerPluginGUI::cb_NewPattern_i(Fl_Button* o, void* v) | |||
| { | |||
| int eid = m_ArrangementMap->AddEvent(300,100,100,Fl_SEvent::NO_TYPE); | |||
| m_ArrangementMap->GetEvent(eid)->SetName("My Pattern"); | |||
| const char *name = fl_input("Name the new pattern:", "My Pattern"); | |||
| if (name) m_ArrangementMap->GetEvent(eid)->SetName(name); | |||
| m_PatternWinMap[eid] = new PatternWin(400,200,m_ArrangementMap->GetEvent(eid)->GetName().c_str()); | |||
| m_ArrangementMap->SetEventCallback((Fl_Callback*)cb_ArrangeRM); | |||
| redraw(); | |||
| } | |||
| void SequencerPluginGUI::cb_NewPattern(Fl_Button* o, void* v) | |||
| { ((SequencerPluginGUI*)(o->parent()))->cb_NewPattern_i(o,v);} | |||
| inline void SequencerPluginGUI::cb_ArrangeRM_i(Fl_Button* o, void* v) | |||
| { | |||
| int ID=((Fl_SEvent*)o)->GetID(); | |||
| if (m_PatternWinMap[ID]->shown()) m_PatternWinMap[ID]->hide(); | |||
| else m_PatternWinMap[ID]->show(); | |||
| } | |||
| void SequencerPluginGUI::cb_ArrangeRM(Fl_Button* o, void* v) | |||
| { ((SequencerPluginGUI*)(o->parent()->user_data()))->cb_ArrangeRM_i(o,v);} | |||
| @@ -0,0 +1,86 @@ | |||
| /* SpiralPlugin | |||
| * Copyleft (C) 2000 David Griffiths <dave@pawfal.org> | |||
| * | |||
| * This program is free software; you can redistribute it and/or modify | |||
| * it under the terms of the GNU General Public License as published by | |||
| * the Free Software Foundation; either version 2 of the License, or | |||
| * (at your option) any later version. | |||
| * | |||
| * This program is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| * GNU General Public License for more details. | |||
| * | |||
| * You should have received a copy of the GNU General Public License | |||
| * along with this program; if not, write to the Free Software | |||
| * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
| */ | |||
| #include <FL/Fl.H> | |||
| #include <FL/Fl_Window.H> | |||
| #include <FL/Fl_Group.H> | |||
| #include <FL/Fl_Scroll.H> | |||
| #include <FL/Fl_Slider.H> | |||
| #include <FL/Fl_Counter.H> | |||
| #include <FL/Fl_Output.H> | |||
| #include "SequencerPlugin.h" | |||
| #include "../SpiralPluginGUI.h" | |||
| #include "../Widgets/Fl_Knob.H" | |||
| #include "../Widgets/Fl_EventMap.h" | |||
| #ifndef MixerGUI | |||
| #define MixerGUI | |||
| class SequencerPluginGUI : public SpiralPluginGUI | |||
| { | |||
| public: | |||
| SequencerPluginGUI(int w, int h, SequencerPlugin *o, ChannelHandler *ch,const HostInfo *Info); | |||
| virtual void UpdateValues(SpiralPlugin *o); | |||
| private: | |||
| Fl_Scroll* m_Scroll; | |||
| Fl_Button* m_NewPattern; | |||
| Fl_Button* m_NoteCut; | |||
| Fl_Knob* m_Zoom; | |||
| Fl_Knob* m_Length; | |||
| Fl_Knob* m_Speed; | |||
| Fl_Button* m_Clear; | |||
| class PatternWin : public Fl_Double_Window | |||
| { | |||
| public: | |||
| PatternWin(int w,int h,const char* n); | |||
| private: | |||
| Fl_Scroll* m_Scroll; | |||
| Fl_EventMap* m_Melody; | |||
| }; | |||
| map<int,PatternWin*> m_PatternWinMap; | |||
| Fl_EventMap* m_ArrangementMap; | |||
| //// Callbacks //// | |||
| inline void cb_Zoom_i(Fl_Knob* o, void* v); | |||
| static void cb_Zoom(Fl_Knob* o, void* v); | |||
| inline void cb_NoteCut_i(Fl_Button* o, void* v); | |||
| static void cb_NoteCut(Fl_Button* o, void* v); | |||
| inline void cb_Pattern_i(Fl_Counter* o, void* v); | |||
| static void cb_Pattern(Fl_Counter* o, void* v); | |||
| inline void cb_Length_i(Fl_Knob* o, void* v); | |||
| static void cb_Length(Fl_Knob* o, void* v); | |||
| inline void cb_Speed_i(Fl_Knob* o, void* v); | |||
| static void cb_Speed(Fl_Knob* o, void* v); | |||
| inline void cb_Clear_i(Fl_Button* o, void* v); | |||
| static void cb_Clear(Fl_Button* o, void* v); | |||
| inline void cb_NewPattern_i(Fl_Button* o, void* v); | |||
| static void cb_NewPattern(Fl_Button* o, void* v); | |||
| inline void cb_ArrangeRM_i(Fl_Button* o, void* v); | |||
| static void cb_ArrangeRM(Fl_Button* o, void* v); | |||
| }; | |||
| #endif | |||
| @@ -0,0 +1,325 @@ | |||
| /* XPM */ | |||
| static char * SpiralIcon_xpm[] = { | |||
| "36 36 286 2", | |||
| " c None", | |||
| ". c #8B889B", | |||
| "+ c #9C99AA", | |||
| "@ c #ADAAB9", | |||
| "# c #837F94", | |||
| "$ c #7D7990", | |||
| "% c #9995A7", | |||
| "& c #67627C", | |||
| "* c #CDCBD4", | |||
| "= c #FCFCFC", | |||
| "- c #D1D0D8", | |||
| "; c #FFFFFF", | |||
| "> c #F1F1F3", | |||
| ", c #848095", | |||
| "' c #2A2248", | |||
| ") c #CFCED6", | |||
| "! c #68637D", | |||
| "~ c #ABA8B6", | |||
| "{ c #D5D3DB", | |||
| "] c #9490A2", | |||
| "^ c #C4C4C4", | |||
| "/ c #1D1C1D", | |||
| "( c #313134", | |||
| "_ c #EEEFEE", | |||
| ": c #FBFBFB", | |||
| "< c #EFEFEF", | |||
| "[ c #7B768D", | |||
| "} c #464060", | |||
| "| c #DEDEE1", | |||
| "1 c #CBCACC", | |||
| "2 c #EEEEF1", | |||
| "3 c #79758C", | |||
| "4 c #FBFBFC", | |||
| "5 c #A2A2A2", | |||
| "6 c #000000", | |||
| "7 c #F5F6F5", | |||
| "8 c #747474", | |||
| "9 c #2A2A2B", | |||
| "0 c #403958", | |||
| "a c #7D788F", | |||
| "b c #C0BEC8", | |||
| "c c #BCBAC6", | |||
| "d c #BCBAC5", | |||
| "e c #625C79", | |||
| "f c #2B2932", | |||
| "g c #191919", | |||
| "h c #CCCCCC", | |||
| "i c #807B91", | |||
| "j c #3B3556", | |||
| "k c #F2F2F4", | |||
| "l c #929292", | |||
| "m c #0E0E0E", | |||
| "n c #BFBFBF", | |||
| "o c #111111", | |||
| "p c #100E15", | |||
| "q c #868689", | |||
| "r c #FEFDFE", | |||
| "s c #D9D7DE", | |||
| "t c #9C98AA", | |||
| "u c #FDFCFD", | |||
| "v c #DDDDDD", | |||
| "w c #575755", | |||
| "x c #5E5E5E", | |||
| "y c #C4C2CD", | |||
| "z c #423C5C", | |||
| "A c #F0F0F2", | |||
| "B c #939393", | |||
| "C c #555555", | |||
| "D c #4A4A4A", | |||
| "E c #010101", | |||
| "F c #282828", | |||
| "G c #C2C2C2", | |||
| "H c #DBDAE0", | |||
| "I c #615C78", | |||
| "J c #F6F6F7", | |||
| "K c #DADADA", | |||
| "L c #545454", | |||
| "M c #0F0F0F", | |||
| "N c #B8B8B8", | |||
| "O c #48445C", | |||
| "P c #2B2B2C", | |||
| "Q c #181900", | |||
| "R c #D3D3D3", | |||
| "S c #C1BEC9", | |||
| "T c #474060", | |||
| "U c #31294D", | |||
| "V c #716C85", | |||
| "W c #65607A", | |||
| "X c #625D78", | |||
| "Y c #D5D4DB", | |||
| "Z c #F7F7F7", | |||
| "` c #8B8B8B", | |||
| " . c #161616", | |||
| ".. c #0A0A0A", | |||
| "+. c #151700", | |||
| "@. c #1A1B00", | |||
| "#. c #060600", | |||
| "$. c #191A00", | |||
| "%. c #393643", | |||
| "&. c #47415F", | |||
| "*. c #9692A4", | |||
| "=. c #D9D8DE", | |||
| "-. c #F7F7F8", | |||
| ";. c #918DA0", | |||
| ">. c #B8B5C1", | |||
| ",. c #D1D1D1", | |||
| "'. c #212121", | |||
| "). c #282900", | |||
| "!. c #030300", | |||
| "~. c #070700", | |||
| "{. c #020200", | |||
| "]. c #727175", | |||
| "^. c #FEFEFF", | |||
| "/. c #9D99AA", | |||
| "(. c #DBD9E0", | |||
| "_. c #E9E9E9", | |||
| ":. c #CBCBCB", | |||
| "<. c #E0E0E0", | |||
| "[. c #6C6C6C", | |||
| "}. c #FEF100", | |||
| "|. c #515151", | |||
| "1. c #A6A6A7", | |||
| "2. c #827E93", | |||
| "3. c #615C77", | |||
| "4. c #EAEAED", | |||
| "5. c #DFDFE1", | |||
| "6. c #0C0C0C", | |||
| "7. c #191700", | |||
| "8. c #1E1D24", | |||
| "9. c #9894A7", | |||
| "0. c #B1AEBB", | |||
| "a. c #69686F", | |||
| "b. c #000001", | |||
| "c. c #615C76", | |||
| "d. c #5F5A75", | |||
| "e. c #413E4D", | |||
| "f. c #020203", | |||
| "g. c #010100", | |||
| "h. c #1A1A1C", | |||
| "i. c #C3C1CB", | |||
| "j. c #9D9D9D", | |||
| "k. c #202020", | |||
| "l. c #383838", | |||
| "m. c #4C4C4C", | |||
| "n. c #1E1C00", | |||
| "o. c #111112", | |||
| "p. c #C9C7D0", | |||
| "q. c #F1F1F1", | |||
| "r. c #F8F8F8", | |||
| "s. c #232323", | |||
| "t. c #050408", | |||
| "u. c #AEACB9", | |||
| "v. c #FEFEFE", | |||
| "w. c #1D1D1D", | |||
| "x. c #B7B5C1", | |||
| "y. c #9390A2", | |||
| "z. c #BBBBBB", | |||
| "A. c #414141", | |||
| "B. c #030303", | |||
| "C. c #28272A", | |||
| "D. c #F4F4F6", | |||
| "E. c #605B76", | |||
| "F. c #736E86", | |||
| "G. c #D8D8D8", | |||
| "H. c #727272", | |||
| "I. c #101010", | |||
| "J. c #848486", | |||
| "K. c #CCCBD3", | |||
| "L. c #747087", | |||
| "M. c #6D6881", | |||
| "N. c #1C1C1C", | |||
| "O. c #242424", | |||
| "P. c #212205", | |||
| "Q. c #1B1D00", | |||
| "R. c #000100", | |||
| "S. c #656566", | |||
| "T. c #F6F6F6", | |||
| "U. c #E8E6EA", | |||
| "V. c #706B84", | |||
| "W. c #E3E1E6", | |||
| "X. c #474746", | |||
| "Y. c #151515", | |||
| "Z. c #C8C8C8", | |||
| "`. c #AEAEAE", | |||
| " + c #070707", | |||
| ".+ c #373639", | |||
| "++ c #FDFCFE", | |||
| "@+ c #ABA8B7", | |||
| "#+ c #F1F0F3", | |||
| "$+ c #6D6980", | |||
| "%+ c #0A090E", | |||
| "&+ c #95929E", | |||
| "*+ c #0A0810", | |||
| "=+ c #0D0D0D", | |||
| "-+ c #050505", | |||
| ";+ c #5B5A5C", | |||
| ">+ c #F7F6F7", | |||
| ",+ c #F4F3F5", | |||
| "'+ c #908C9F", | |||
| ")+ c #C8C6D0", | |||
| "!+ c #837E96", | |||
| "~+ c #86868A", | |||
| "{+ c #070608", | |||
| "]+ c #ECEBEE", | |||
| "^+ c #5B5571", | |||
| "/+ c #646078", | |||
| "(+ c #AFAFB0", | |||
| "_+ c #454545", | |||
| ":+ c #363636", | |||
| "<+ c #7A7A7A", | |||
| "[+ c #C8C8C9", | |||
| "}+ c #212025", | |||
| "|+ c #060607", | |||
| "1+ c #969699", | |||
| "2+ c #FAFAFA", | |||
| "3+ c #F8F8F9", | |||
| "4+ c #A29EAF", | |||
| "5+ c #F7F6F8", | |||
| "6+ c #F0F0F1", | |||
| "7+ c #B8B7B9", | |||
| "8+ c #E4E4E4", | |||
| "9+ c #FDFDFD", | |||
| "0+ c #A5A2B2", | |||
| "a+ c #3B3456", | |||
| "b+ c #A8A5B4", | |||
| "c+ c #525252", | |||
| "d+ c #848387", | |||
| "e+ c #CDCDCD", | |||
| "f+ c #8D899C", | |||
| "g+ c #494262", | |||
| "h+ c #68627C", | |||
| "i+ c #40395A", | |||
| "j+ c #ECECEC", | |||
| "k+ c #020202", | |||
| "l+ c #B4B5B5", | |||
| "m+ c #0B0B0B", | |||
| "n+ c #313232", | |||
| "o+ c #E3E3E3", | |||
| "p+ c #B1AEBC", | |||
| "q+ c #BDBBC6", | |||
| "r+ c #3C3556", | |||
| "s+ c #898599", | |||
| "t+ c #EDEDED", | |||
| "u+ c #39393A", | |||
| "v+ c #040404", | |||
| "w+ c #333333", | |||
| "x+ c #F5F5F5", | |||
| "y+ c #2B2B2B", | |||
| "z+ c #2D2A3D", | |||
| "A+ c #B6B4C1", | |||
| "B+ c #F5F5F6", | |||
| "C+ c #605A76", | |||
| "D+ c #DAD8DF", | |||
| "E+ c #F5F4F6", | |||
| "F+ c #615B76", | |||
| "G+ c #524D6A", | |||
| "H+ c #E4E3E8", | |||
| "I+ c #D5D5D5", | |||
| "J+ c #1B1B1B", | |||
| "K+ c #303030", | |||
| "L+ c #AAABAB", | |||
| "M+ c #585464", | |||
| "N+ c #B0AEBB", | |||
| "O+ c #A29FAF", | |||
| "P+ c #E9E8E9", | |||
| "Q+ c #787779", | |||
| "R+ c #0F0E15", | |||
| "S+ c #2D2D2E", | |||
| "T+ c #595959", | |||
| "U+ c #FAFAFB", | |||
| "V+ c #807B92", | |||
| "W+ c #B0ADBB", | |||
| "X+ c #E8E7EB", | |||
| "Y+ c #3A3258", | |||
| "Z+ c #E6E5EA", | |||
| "`+ c #DFDEE3", | |||
| " @ c #443E5E", | |||
| ".@ c #BAB8C4", | |||
| "+@ c #C1BFCA", | |||
| "@@ c #E0E0E5", | |||
| "#@ c #D0CED6", | |||
| "$@ c #362F52", | |||
| "%@ c #CECCD5", | |||
| "&@ c #413A5B", | |||
| "*@ c #6A657F", | |||
| "=@ c #9793A6", | |||
| " ", | |||
| " ", | |||
| " ", | |||
| " . + @ # $ % ", | |||
| " & * = * - ; > , ' ; ; ; ) ! ", | |||
| " ~ ; ; { ] ; ^ / ( _ ; : < [ ", | |||
| " } | 1 2 3 4 5 6 6 7 : 8 9 0 a b ", | |||
| " c : d e f g h i j k l 6 m ; n o 6 p q r s ", | |||
| " t u ; v w 6 6 x y z A B 6 C ; D E 6 F G ; H ", | |||
| " I J ; ; K L 6 6 M N O P E 6 6 6 Q Q M R S T U V W ", | |||
| " X Y ; ; ; ; Z ` .6 ..6 6 6 6 6 +.@.#.$.%.&.*.=.-.;. ", | |||
| " >.; ; ; ; ; ; = ,.'.).!.6 6 6 ~.{.6 6 6 E ].^.; ; /. ", | |||
| " (.; ; _.R h :.<.[.6 }.}.}.}.}.}.}.}.}.}.}.E |.1.4 2. ", | |||
| " 3.4.; 5.6.6 6 6 6 6 6 }.6 6 6 6 6 6 6 6 6 }.7.6 8.9. ", | |||
| " V @ 0.a.b.6 6 6 6 6 {.}.6 6 6 6 }.}.}.6 6 }.6 6 ", | |||
| " c.d.e.6 f.6 6 6 6 g.}.}.}.6 6 6 6 6 6 6 }.6 6 h. ", | |||
| " i.; ; j.k.k.l.m.k.6 6 }.6 6 6 6 6 n.6 6 6 }.6 6 o. ", | |||
| " p.; ; q.r.; ; ; s.6 6 }.6 6 }.}.}.6 6 }.}.}.6 6 t. ", | |||
| " u.; ; ; ; v.; ; w.6 6 }.6 6 6 6 6 6 6 6 6 }.6 6 6 x., ", | |||
| " y.; ; v.; : z.A.B.6 6 }.6 6 6 6 6 6 6 6 6 }.6 6 C.v.D.E. ", | |||
| " F.; ; ; G.H.I.6 6 6 6 }.}.}.}.}.}.}.}.}.}.}.6 6 J.; ; K.L. ", | |||
| " M.J ; : N.6 6 6 6 O.P.Q.6 R.6 6 6 6 6 6 6 6 6 6 S.T.; ; U.V. ", | |||
| " W.; ; X.6 E 6 Y.Z.`. +6 6 6 6 6 6 6 6 g.6 6 6 6 .+++; ; > V. ", | |||
| " @+; #+$+%+6 6 `.v.; &+*+6 6 6 6 6 6 6 6 =+-+6 6 6 ;+>+; ; ,+'+ ", | |||
| " V.)+! !+~+{+x ; ; ]+^+/+(+l _+6 6 6 :+<+[+}+6 6 6 |+1+2+; ; 3+@ ", | |||
| " 4+5+6+7+8+9+; 0+a+b+; T._+6 6 E c+; ; d+6 6 E 6 o e+; ; = f+ ", | |||
| " g+> ; ; ; ; ; ; h+i+; ; j+l.6 6 k+D ; ; l+m+6 6 6 n+o+; ; p+ ", | |||
| " > ; ; ; ; q+r+s+; ; t+u+6 6 v+w+; ; x+y+6 6 z+A+; B+3 ", | |||
| " C+D+= ; E+F+G+H+; ; I+J+6 6 k+K+; ; ; L+c+M+ ", | |||
| " N+4 O+ X ; ; ; P+Q+K+R+S+T+; ; ; v.U+V+ ", | |||
| " W+; ; ; ; ; X+Y+Z+; ; ; ; = `+ @ ", | |||
| " .@+@@@4 ; ; #@$@%@; ; ; s s+T ", | |||
| " &@ *@=@s+ ", | |||
| " ", | |||
| " ", | |||
| " "}; | |||
| @@ -27,12 +27,12 @@ static const int MELODY_WIDGET_COL = 142; | |||
| static const int PERCUSSION_WIDGET_COL = 140; | |||
| Fl_SEvent::Fl_SEvent(int x, int y, int w, int h, const char* label) : | |||
| Fl_Button(x,y,w,h,label), | |||
| Fl_Group(x,y,w,h,""), | |||
| m_Type(NO_TYPE), | |||
| m_LastState(false), | |||
| m_FirstUpdate(false), | |||
| m_LastUpdate(false), | |||
| m_Name("No Name"), | |||
| m_Name(""), | |||
| m_ID(-1), | |||
| m_GridX(0), | |||
| m_GridY(0), | |||
| @@ -47,11 +47,21 @@ m_SnapGap(0.0f), | |||
| m_CurrentDragMode(NONE), | |||
| m_DelMe(false) | |||
| { | |||
| Fl_Button::label(m_Name.c_str()); | |||
| Fl_Group::label(m_Name.c_str()); | |||
| labelsize(8); | |||
| m_Menu = new Fl_Menu_Button(x,y,w,h,""); | |||
| m_Menu->type(Fl_Menu_Button::POPUP2); | |||
| m_Menu->textsize(8); | |||
| m_Menu->add("copy", 0, NULL); | |||
| m_Menu->add("instance", 0, NULL); | |||
| m_Menu->add("edit", 0, NULL); | |||
| m_Menu->add("delete", 0, NULL); | |||
| add(m_Menu); | |||
| } | |||
| Fl_SEvent::Fl_SEvent(const Fl_SEvent &Other) : | |||
| Fl_Button(Other.x(),Other.y(),Other.w(),Other.h(),Other.label()), | |||
| Fl_Group(Other.x(),Other.y(),Other.w(),Other.h(),Other.label()), | |||
| m_Type(Other.m_Type), | |||
| m_LastState(Other.m_LastState), | |||
| m_FirstUpdate(Other.m_FirstUpdate), | |||
| @@ -95,6 +105,7 @@ bool Fl_SEvent::UpdateState(float Time) | |||
| void Fl_SEvent::draw() | |||
| { | |||
| Fl_Group::draw(); | |||
| // check if clipped | |||
| //if (fl_clip()) return; | |||
| @@ -128,7 +139,7 @@ void Fl_SEvent::draw() | |||
| fl_line(x()+w(),y()+h(),x()+1,y()+h()); | |||
| fl_push_clip(x()+1,y()+1,w()-1,h()-1); | |||
| fl_font(fl_font(), 10); | |||
| fl_font(fl_font(), 8); | |||
| fl_draw(m_Name.c_str(),x()+2,y()+h()-2); | |||
| fl_pop_clip(); | |||
| } | |||
| @@ -144,8 +155,17 @@ int Fl_SEvent::handle(int event) | |||
| static int offsx,offsy; | |||
| switch (event) | |||
| if (Fl::event_button()==1 && event==FL_PUSH && Fl::event_clicks()==1) | |||
| { | |||
| // a bit crap I suppose | |||
| if (((Fl_EventMap*)parent())->cb_EventDoubleClicked!=NULL) | |||
| { | |||
| ((Fl_EventMap*)parent())->cb_EventDoubleClicked(this,NULL); | |||
| } | |||
| } | |||
| switch (event) | |||
| { | |||
| case FL_PUSH: | |||
| LastButtonPushed=Fl::event_button(); | |||
| @@ -165,23 +185,17 @@ int Fl_SEvent::handle(int event) | |||
| { | |||
| // if the last EVENT_RESIZE_GRAB pixels | |||
| // have been grabbed, resize. | |||
| /*if(!m_LockResize && mx>x()+w()-m_ResizeGrab && mx<x()+w()) | |||
| { | |||
| m_CurrentDragMode=RESIZING; | |||
| } | |||
| else | |||
| {*/ | |||
| m_CurrentDragMode=MOVING; | |||
| //} | |||
| } | |||
| if (LastButtonPushed==2) | |||
| /*if (LastButtonPushed==2) | |||
| { | |||
| // copy to end | |||
| Fl_EventMap *p = (Fl_EventMap*)parent(); | |||
| if (p) p->CopyEvent(x()+w(),y(),w(),m_ID,m_LengthTime); | |||
| } | |||
| }*/ | |||
| if (LastButtonPushed==3) | |||
| { | |||
| @@ -196,6 +210,8 @@ int Fl_SEvent::handle(int event) | |||
| if(m_CurrentDragMode==RESIZING) | |||
| { | |||
| w(mx-x()+(m_ResizeGrab/2)); | |||
| //m_Menu->size(w(),h()); | |||
| m_LengthTime=w()/(float)m_PixelsPerSec; | |||
| } | |||
| @@ -203,7 +219,8 @@ int Fl_SEvent::handle(int event) | |||
| { | |||
| x(mx-offsx); | |||
| y(my-offsy); | |||
| m_Menu->position(x(),y()); | |||
| m_StartTime=(x()-GetParentX())/(float)m_PixelsPerSec; | |||
| } | |||
| @@ -221,8 +238,10 @@ int Fl_SEvent::handle(int event) | |||
| } | |||
| break; | |||
| } | |||
| return event; | |||
| Fl_Group::handle(event); | |||
| return 1; | |||
| } | |||
| void Fl_SEvent::SetPixelsPerSec(int s, bool FirstTime) | |||
| @@ -18,8 +18,11 @@ | |||
| #include <FL/Fl.H> | |||
| #include <FL/Fl_Group.H> | |||
| #include <FL/Fl_Button.H> | |||
| #include <FL/Fl_Group.H> | |||
| #include <FL/Fl_Window.H> | |||
| #include <FL/Fl_Menu_Button.H> | |||
| #include <FL/Fl_Menu_Item.H> | |||
| #include <iostream> | |||
| #include <map> | |||
| #include <string> | |||
| @@ -32,7 +35,7 @@ using namespace std; | |||
| class Fl_EventMap; | |||
| class Fl_SEvent : public Fl_Button | |||
| class Fl_SEvent : public Fl_Group | |||
| { | |||
| public: | |||
| enum Type{NO_TYPE,MELODY,PERCUSSION}; | |||
| @@ -81,6 +84,8 @@ public: | |||
| private: | |||
| Fl_Menu_Button *m_Menu; | |||
| Type m_Type; | |||
| // whether we were active or not last tick | |||
| bool m_LastState; | |||
| @@ -0,0 +1,123 @@ | |||
| #!/bin/sh | |||
| # | |||
| # autogen.sh - Generates the initial makefiles from a pristine CVS tree | |||
| # | |||
| # $Id: autogen.sh,v 1.1 2002-10-30 22:38:35 nebogeo Exp $ | |||
| # | |||
| # USAGE: autogen.sh [configure options] | |||
| # | |||
| # If environment variable DRYRUN is set, no configuring will be done - | |||
| # (e.g. in bash) DRYRUN=1 ./autogen.sh | |||
| # will not do any configuring but will emit the programs that would be run. | |||
| # | |||
| # This script is based on similar scripts used in various tools | |||
| # commonly made available via CVS and used with GNU automake. | |||
| # Try 'locate autogen.sh' on your system and see what you get. | |||
| # | |||
| PACKAGE=spiralsynthmodular | |||
| DIE= | |||
| if test "X$DRYRUN" != X; then | |||
| DRYRUN=echo | |||
| fi | |||
| autoconf_vers=2.13 | |||
| automake_vers=1.4 | |||
| aclocal_vers=1.4 | |||
| program=`basename $0` | |||
| if (autoconf --version) < /dev/null > /dev/null 2>&1 ; then | |||
| if (autoconf --version | awk 'NR==1 { if( $3 >= '$autoconf_vers') \ | |||
| exit 1; exit 0; }'); | |||
| then | |||
| echo "$program: ERROR: \`autoconf' is too old." | |||
| echo " (version $autoconf_vers or newer is required)" | |||
| DIE="yes" | |||
| fi | |||
| else | |||
| echo | |||
| echo "$program: ERROR: You must have \`autoconf' installed to compile $PACKAGE." | |||
| echo " (version $autoconf_vers or newer is required)" | |||
| DIE="yes" | |||
| fi | |||
| # Ensure that these are created by the versions on this system | |||
| # (indirectly via automake) | |||
| rm -f libtool ltmain.sh | |||
| if (automake --version) < /dev/null > /dev/null 2>&1 ; then | |||
| if (automake --version | awk 'NR==1 { if( $4 >= '$automake_vers') \ | |||
| exit 1; exit 0; }'); | |||
| then | |||
| echo "$program: ERROR: \`automake' is too old." | |||
| echo " (version $automake_vers or newer is required)" | |||
| DIE="yes" | |||
| fi | |||
| if (aclocal --version) < /dev/null > /dev/null 2>&1; then | |||
| if (aclocal --version | awk 'NR==1 { if( $4 >= '$aclocal_vers' ) \ | |||
| exit 1; exit 0; }' ); | |||
| then | |||
| echo "$program: ERROR: \`aclocal' is too old." | |||
| echo " (version $aclocal_vers or newer is required)" | |||
| DIE="yes" | |||
| fi | |||
| else | |||
| echo | |||
| echo "$program: ERROR: Missing \`aclocal'" | |||
| echo " The version of automake installed doesn't appear recent enough." | |||
| DIE="yes" | |||
| fi | |||
| else | |||
| echo | |||
| echo "$program: ERROR: You must have \`automake' installed to compile $PACKAGE." | |||
| echo " (version $automake_vers or newer is required)" | |||
| DIE="yes" | |||
| fi | |||
| if test "X$DIE" != X; then | |||
| exit 1 | |||
| fi | |||
| if test -z "$*"; then | |||
| echo "$program: WARNING: Running \`configure' with no arguments." | |||
| echo "If you wish to pass any to it, please specify them on the" | |||
| echo "\`$0' command line." | |||
| fi | |||
| am_opt= | |||
| for coin in `find $srcdir -name configure.in -print` | |||
| do | |||
| dir=`dirname $coin` | |||
| if test -f $dir/NO-AUTO-GEN; then | |||
| echo $program: Skipping $dir -- flagged as no auto-gen | |||
| else | |||
| echo $program: Processing directory $dir | |||
| ( cd $dir | |||
| aclocalinclude="$ACLOCAL_FLAGS" | |||
| echo "$program: Running aclocal $aclocalinclude" | |||
| $DRYRUN aclocal $aclocalinclude | |||
| if grep "^AM_CONFIG_HEADER" configure.in >/dev/null; then | |||
| echo "$program: Running autoheader" | |||
| $DRYRUN autoheader | |||
| fi | |||
| echo "$program: Running automake $am_opt" | |||
| $DRYRUN automake --add-missing $am_opt | |||
| echo "$program: Running autoconf" | |||
| $DRYRUN autoconf | |||
| ) | |||
| fi | |||
| done | |||
| conf_flags= | |||
| echo "$program: Running ./configure $conf_flags $@" | |||
| if test "X$DRYRUN" = X; then | |||
| $DRYRUN ./configure $conf_flags "$@" \ | |||
| && echo "$program: Now type \`make' to compile $PACKAGE" || exit 1 | |||
| else | |||
| $DRYRUN ./configure $conf_flags "$@" | |||
| fi | |||