* 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 | // one off request type | ||||
case OUTPUT_REQUEST : | 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 | else | ||||
{ | { | ||||
@@ -321,8 +324,7 @@ void ChannelHandler::BulkTransfer(const string &ID, void *dest, int size) | |||||
else | else | ||||
{ | { | ||||
GetData(ID,((char*)dest)+pos); | GetData(ID,((char*)dest)+pos); | ||||
} | |||||
} | |||||
pos+=buffersize; | pos+=buffersize; | ||||
} | } | ||||
} | } | ||||
@@ -67,6 +67,6 @@ void DelayPluginGUI::cb_Delay(Fl_Slider* o, void* v) | |||||
{ ((DelayPluginGUI*)(o->parent()))->cb_Delay_i(o,v); } | { ((DelayPluginGUI*)(o->parent()))->cb_Delay_i(o,v); } | ||||
inline void DelayPluginGUI::cb_Mix_i(Fl_Knob* o, void* 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) | void DelayPluginGUI::cb_Mix(Fl_Knob* o, void* v) | ||||
{ ((DelayPluginGUI*)(o->parent()))->cb_Mix_i(o,v); } | { ((DelayPluginGUI*)(o->parent()))->cb_Mix_i(o,v); } |
@@ -55,7 +55,7 @@ m_Triggered(false), | |||||
m_ClockHigh(false), | m_ClockHigh(false), | ||||
m_CopyPattern(0) | m_CopyPattern(0) | ||||
{ | { | ||||
m_Version=2; | |||||
m_Version=3; | |||||
m_PluginInfo.Name="Matrix"; | m_PluginInfo.Name="Matrix"; | ||||
m_PluginInfo.Width=555; | m_PluginInfo.Width=555; | ||||
@@ -97,12 +97,14 @@ m_CopyPattern(0) | |||||
for (int y=0; y<MATY; y++) | for (int y=0; y<MATY; y++) | ||||
{ | { | ||||
m_Matrix[n].Matrix[x][y]=false; | m_Matrix[n].Matrix[x][y]=false; | ||||
m_Matrix[n].Volume[x][y]=1; | |||||
} | } | ||||
m_TriggerLevel[n]=0; | m_TriggerLevel[n]=0; | ||||
} | } | ||||
m_AudioCH->Register("NoteCut",&m_NoteCut,ChannelHandler::INPUT); | 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("Current",&m_Current,ChannelHandler::INPUT); | ||||
m_AudioCH->Register("StepTime",&m_StepTime,ChannelHandler::INPUT); | m_AudioCH->Register("StepTime",&m_StepTime,ChannelHandler::INPUT); | ||||
m_AudioCH->Register("Num",&m_GUIArgs.Num,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_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 : | case TDOWN : | ||||
if (CanTransposeDown()) TransposeDown(); | if (CanTransposeDown()) TransposeDown(); | ||||
break; | 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++) | 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 "; | s<<"-1 "; | ||||
@@ -423,5 +428,31 @@ void MatrixPlugin::StreamIn(istream &s) | |||||
} | } | ||||
} | } | ||||
} break; | } 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; | int Length; | ||||
float Speed; | float Speed; | ||||
int Octave; | int Octave; | ||||
float Volume[MATX][MATY]; | |||||
bool Matrix[MATX][MATY]; | bool Matrix[MATX][MATY]; | ||||
}; | }; | ||||
@@ -53,7 +54,7 @@ public: | |||||
Pattern* GetPattern() { return &m_Matrix[m_Current]; } | Pattern* GetPattern() { return &m_Matrix[m_Current]; } | ||||
enum GUICommands{NONE,MAT_LENGTH,MAT_SPEED,MAT_ACTIVATE,MAT_DEACTIVATE, | 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 | struct GUIArgs | ||||
{ | { | ||||
@@ -62,6 +63,7 @@ public: | |||||
float Speed; | float Speed; | ||||
int X,Y; | int X,Y; | ||||
int Octave; | int Octave; | ||||
float Volume; | |||||
}; | }; | ||||
private: | private: | ||||
@@ -25,6 +25,65 @@ static const int GUI_COLOUR = 179; | |||||
static const int GUIBG_COLOUR = 144; | static const int GUIBG_COLOUR = 144; | ||||
static const int GUIBG2_COLOUR = 145; | 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) : | 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 butsize=7; | ||||
int n=0; | int n=0; | ||||
fl_color(150,150,150); | |||||
int markercol=fl_color(); | |||||
for(int x=0; x<MATX; x++) | for(int x=0; x<MATX; x++) | ||||
for(int y=0; y<MATY; y++) | for(int y=0; y<MATY; y++) | ||||
{ | { | ||||
Numbers[n]=n; | 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]->type(1); | ||||
m_Matrix[x][y]->box(FL_BORDER_BOX); | 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); | 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]->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]); | add(m_Matrix[x][y]); | ||||
n++; | n++; | ||||
} | } | ||||
@@ -167,6 +231,7 @@ void MatrixPluginGUI::UpdateValues(SpiralPlugin *o) | |||||
for(int y=0; y<MATY; y++) | for(int y=0; y<MATY; y++) | ||||
{ | { | ||||
m_Matrix[x][y]->value(Plugin->GetPattern()->Matrix[x][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(); | //if (Plugin->CanTransposeUp()) m_TransUpBtn->activate(); else m_TransUpBtn->deactivate(); | ||||
@@ -192,6 +257,7 @@ void MatrixPluginGUI::UpdateMatrix() | |||||
for(int y=0; y<MATY; y++) | 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]->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); | if (o->value()) m_GUICH->SetCommand(MatrixPlugin::MAT_ACTIVATE); | ||||
else m_GUICH->SetCommand(MatrixPlugin::MAT_DEACTIVATE); | else m_GUICH->SetCommand(MatrixPlugin::MAT_DEACTIVATE); | ||||
m_GUICH->Wait(); | |||||
} | } | ||||
void MatrixPluginGUI::cb_Matrix(Fl_Button* o, void* v) | void MatrixPluginGUI::cb_Matrix(Fl_Button* o, void* v) | ||||
{ ((MatrixPluginGUI*)(o->parent()))->cb_Matrix_i(o,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) | inline void MatrixPluginGUI::cb_Pattern_i(Fl_Counter* o, void* v) | ||||
{ | { | ||||
if (o->value()<0) o->value(0); | 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_PasteBtn->activate(); | ||||
m_GUICH->SetCommand(MatrixPlugin::COPY); | m_GUICH->SetCommand(MatrixPlugin::COPY); | ||||
UpdateMatrix(); | |||||
} | } | ||||
void MatrixPluginGUI::cb_CopyBtn (Fl_Button* o, void* v) | void MatrixPluginGUI::cb_CopyBtn (Fl_Button* o, void* v) | ||||
@@ -33,6 +33,33 @@ | |||||
#ifndef MatrixGUI | #ifndef MatrixGUI | ||||
#define 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 | class MatrixPluginGUI : public SpiralPluginGUI | ||||
{ | { | ||||
public: | public: | ||||
@@ -52,7 +79,7 @@ private: | |||||
Fl_Counter* m_Pattern; | Fl_Counter* m_Pattern; | ||||
Fl_Counter* m_Length; | Fl_Counter* m_Length; | ||||
Fl_Knob* m_Speed; | Fl_Knob* m_Speed; | ||||
Fl_Button* m_Matrix[MATX][MATY]; | |||||
Fl_MatrixButton* m_Matrix[MATX][MATY]; | |||||
Fl_Counter* m_Octave; | Fl_Counter* m_Octave; | ||||
Fl_Counter* m_SpeedVal; | Fl_Counter* m_SpeedVal; | ||||
Fl_LED_Button* m_Flash[MATX]; | Fl_LED_Button* m_Flash[MATX]; | ||||
@@ -66,6 +93,8 @@ private: | |||||
//// Callbacks //// | //// Callbacks //// | ||||
inline void cb_Matrix_i(Fl_Button* o, void* v); | inline void cb_Matrix_i(Fl_Button* o, void* v); | ||||
static void cb_Matrix(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); | inline void cb_Pattern_i(Fl_Counter* o, void* v); | ||||
static void cb_Pattern(Fl_Counter* o, void* v); | static void cb_Pattern(Fl_Counter* o, void* v); | ||||
inline void cb_Length_i(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) | inline void OscillatorPluginGUI::cb_PulseWidth_i(Fl_Slider* o, void* v) | ||||
{ | { | ||||
char str[10]; | 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); | m_out_pulseW->value(str); | ||||
} | } | ||||
@@ -114,14 +114,15 @@ void Fl_WaveDisplay::draw() | |||||
Value = NextValue; | Value = NextValue; | ||||
// get average | |||||
NextValue=0; | |||||
// get max | |||||
NextValue=(*m_Sample)[n]; | |||||
for (int m=n; m<n+Jump; m++) | 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, | fl_line(x()+pos-2, y()+ho-(int)Value, | ||||
x()+pos-1, y()+ho-(int)NextValue); | x()+pos-1, y()+ho-(int)NextValue); | ||||
pos++; | pos++; | ||||
@@ -233,38 +234,36 @@ int Fl_WaveDisplay::handle(int event) | |||||
redraw(); | 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; | if (m_EndPos>=m_Sample->GetLength()) m_EndPos=m_Sample->GetLength()-1; | ||||
return 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) : | 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; | int n=0; | ||||
@@ -354,7 +353,7 @@ SpiralPluginGUI(w,h,o,ch) | |||||
m_Display = new Fl_WaveDisplay(5,85,w-10,100,""); | m_Display = new Fl_WaveDisplay(5,85,w-10,100,""); | ||||
m_Display->callback((Fl_Callback*)cb_WaveDisplay); | 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; | n=0; | ||||
m_Cut = new Fl_Button(bx+(n++*bs),by,bw,bh,"Cut"); | 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->labelsize(10); | ||||
m_Amp->callback((Fl_Callback*)cb_Amp); | 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(); | end(); | ||||
redraw(); | redraw(); | ||||
@@ -396,11 +403,11 @@ void PoshSamplerPluginGUI::UpdateSampleDisplay(int num) | |||||
m_GUICH->Wait(); | m_GUICH->Wait(); | ||||
m_GUICH->RequestChannelAndWait("SampleSize"); | m_GUICH->RequestChannelAndWait("SampleSize"); | ||||
long SampleSize=m_GUICH->GetLong("SampleSize"); | long SampleSize=m_GUICH->GetLong("SampleSize"); | ||||
if (SampleSize) | if (SampleSize) | ||||
{ | { | ||||
char *TempBuf = new char[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)); | m_Display->SetSample((float*)TempBuf,SampleSize/sizeof(float)); | ||||
delete[] TempBuf; | delete[] TempBuf; | ||||
} | } | ||||
@@ -409,6 +416,13 @@ void PoshSamplerPluginGUI::UpdateSampleDisplay(int num) | |||||
void PoshSamplerPluginGUI::Update() | void PoshSamplerPluginGUI::Update() | ||||
{ | { | ||||
SetPlayPos(m_GUICH->GetLong("PlayPos")); | SetPlayPos(m_GUICH->GetLong("PlayPos")); | ||||
if (m_UpdateMe) | |||||
{ | |||||
UpdateSampleDisplay((int)m_SampleNum->value()); | |||||
m_Display->redraw(); | |||||
m_UpdateMe=false; | |||||
} | |||||
redraw(); | redraw(); | ||||
} | } | ||||
@@ -420,11 +434,7 @@ void PoshSamplerPluginGUI::UpdateValues(SpiralPlugin *o) | |||||
m_Pitch->value(Plugin->GetPitch((int)m_SampleNum->value())); | m_Pitch->value(Plugin->GetPitch((int)m_SampleNum->value())); | ||||
m_Note->value(Plugin->GetNote((int)m_SampleNum->value())); | m_Note->value(Plugin->GetNote((int)m_SampleNum->value())); | ||||
m_Loop->value(Plugin->GetLoop((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->SetPlayStart(Plugin->GetPlayStart((int)m_SampleNum->value())); | ||||
m_Display->SetLoopStart(Plugin->GetLoopStart((int)m_SampleNum->value())); | m_Display->SetLoopStart(Plugin->GetLoopStart((int)m_SampleNum->value())); | ||||
m_Display->SetLoopEnd(Plugin->GetLoopEnd((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) | void PoshSamplerPluginGUI::cb_WaveDisplay(Fl_WaveDisplay* o, void* v) | ||||
{ ((PoshSamplerPluginGUI*)(o->parent()))->cb_WaveDisplay_i(o,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; } | void SetLoopEnd(long s) { m_LoopEnd=s; } | ||||
long GetLoopEnd() { return m_LoopEnd; } | long GetLoopEnd() { return m_LoopEnd; } | ||||
void SetPosMarker(bool s) { m_PosMarker=s; } | void SetPosMarker(bool s) { m_PosMarker=s; } | ||||
void ZoomIn(); | |||||
void ZoomOut(); | |||||
private: | private: | ||||
@@ -85,6 +87,7 @@ private: | |||||
char m_TextBuf[256]; | char m_TextBuf[256]; | ||||
int Numbers[NUM_SAMPLES]; | int Numbers[NUM_SAMPLES]; | ||||
bool m_UpdateMe; | |||||
Fl_Button* m_Load; | Fl_Button* m_Load; | ||||
Fl_Button* m_Save; | Fl_Button* m_Save; | ||||
@@ -98,6 +101,8 @@ private: | |||||
Fl_Counter* m_Note; | Fl_Counter* m_Note; | ||||
Fl_WaveDisplay* m_Display; | Fl_WaveDisplay* m_Display; | ||||
Fl_Counter* m_SampleNum; | Fl_Counter* m_SampleNum; | ||||
Fl_Button* m_ZoomIn; | |||||
Fl_Button* m_ZoomOut; | |||||
Fl_Button* m_Cut; | Fl_Button* m_Cut; | ||||
Fl_Button* m_Copy; | Fl_Button* m_Copy; | ||||
@@ -145,6 +150,10 @@ private: | |||||
static void cb_Reverse(Fl_Button* o, void* v); | static void cb_Reverse(Fl_Button* o, void* v); | ||||
inline void cb_Amp_i(Fl_Button* o, void* v); | inline void cb_Amp_i(Fl_Button* o, void* v); | ||||
static void cb_Amp(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); | inline void cb_WaveDisplay_i(Fl_WaveDisplay* o, void* v); | ||||
static void cb_WaveDisplay(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; | static const int PERCUSSION_WIDGET_COL = 140; | ||||
Fl_SEvent::Fl_SEvent(int x, int y, int w, int h, const char* label) : | 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_Type(NO_TYPE), | ||||
m_LastState(false), | m_LastState(false), | ||||
m_FirstUpdate(false), | m_FirstUpdate(false), | ||||
m_LastUpdate(false), | m_LastUpdate(false), | ||||
m_Name("No Name"), | |||||
m_Name(""), | |||||
m_ID(-1), | m_ID(-1), | ||||
m_GridX(0), | m_GridX(0), | ||||
m_GridY(0), | m_GridY(0), | ||||
@@ -47,11 +47,21 @@ m_SnapGap(0.0f), | |||||
m_CurrentDragMode(NONE), | m_CurrentDragMode(NONE), | ||||
m_DelMe(false) | 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_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_Type(Other.m_Type), | ||||
m_LastState(Other.m_LastState), | m_LastState(Other.m_LastState), | ||||
m_FirstUpdate(Other.m_FirstUpdate), | m_FirstUpdate(Other.m_FirstUpdate), | ||||
@@ -95,6 +105,7 @@ bool Fl_SEvent::UpdateState(float Time) | |||||
void Fl_SEvent::draw() | void Fl_SEvent::draw() | ||||
{ | { | ||||
Fl_Group::draw(); | |||||
// check if clipped | // check if clipped | ||||
//if (fl_clip()) return; | //if (fl_clip()) return; | ||||
@@ -128,7 +139,7 @@ void Fl_SEvent::draw() | |||||
fl_line(x()+w(),y()+h(),x()+1,y()+h()); | fl_line(x()+w(),y()+h(),x()+1,y()+h()); | ||||
fl_push_clip(x()+1,y()+1,w()-1,h()-1); | 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_draw(m_Name.c_str(),x()+2,y()+h()-2); | ||||
fl_pop_clip(); | fl_pop_clip(); | ||||
} | } | ||||
@@ -144,8 +155,17 @@ int Fl_SEvent::handle(int event) | |||||
static int offsx,offsy; | 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: | case FL_PUSH: | ||||
LastButtonPushed=Fl::event_button(); | LastButtonPushed=Fl::event_button(); | ||||
@@ -165,23 +185,17 @@ int Fl_SEvent::handle(int event) | |||||
{ | { | ||||
// if the last EVENT_RESIZE_GRAB pixels | // if the last EVENT_RESIZE_GRAB pixels | ||||
// have been grabbed, resize. | // have been grabbed, resize. | ||||
/*if(!m_LockResize && mx>x()+w()-m_ResizeGrab && mx<x()+w()) | |||||
{ | |||||
m_CurrentDragMode=RESIZING; | |||||
} | |||||
else | |||||
{*/ | |||||
m_CurrentDragMode=MOVING; | m_CurrentDragMode=MOVING; | ||||
//} | //} | ||||
} | } | ||||
if (LastButtonPushed==2) | |||||
/*if (LastButtonPushed==2) | |||||
{ | { | ||||
// copy to end | // copy to end | ||||
Fl_EventMap *p = (Fl_EventMap*)parent(); | Fl_EventMap *p = (Fl_EventMap*)parent(); | ||||
if (p) p->CopyEvent(x()+w(),y(),w(),m_ID,m_LengthTime); | if (p) p->CopyEvent(x()+w(),y(),w(),m_ID,m_LengthTime); | ||||
} | |||||
}*/ | |||||
if (LastButtonPushed==3) | if (LastButtonPushed==3) | ||||
{ | { | ||||
@@ -196,6 +210,8 @@ int Fl_SEvent::handle(int event) | |||||
if(m_CurrentDragMode==RESIZING) | if(m_CurrentDragMode==RESIZING) | ||||
{ | { | ||||
w(mx-x()+(m_ResizeGrab/2)); | w(mx-x()+(m_ResizeGrab/2)); | ||||
//m_Menu->size(w(),h()); | |||||
m_LengthTime=w()/(float)m_PixelsPerSec; | m_LengthTime=w()/(float)m_PixelsPerSec; | ||||
} | } | ||||
@@ -203,7 +219,8 @@ int Fl_SEvent::handle(int event) | |||||
{ | { | ||||
x(mx-offsx); | x(mx-offsx); | ||||
y(my-offsy); | y(my-offsy); | ||||
m_Menu->position(x(),y()); | |||||
m_StartTime=(x()-GetParentX())/(float)m_PixelsPerSec; | m_StartTime=(x()-GetParentX())/(float)m_PixelsPerSec; | ||||
} | } | ||||
@@ -221,8 +238,10 @@ int Fl_SEvent::handle(int event) | |||||
} | } | ||||
break; | break; | ||||
} | } | ||||
return event; | |||||
Fl_Group::handle(event); | |||||
return 1; | |||||
} | } | ||||
void Fl_SEvent::SetPixelsPerSec(int s, bool FirstTime) | void Fl_SEvent::SetPixelsPerSec(int s, bool FirstTime) | ||||
@@ -18,8 +18,11 @@ | |||||
#include <FL/Fl.H> | #include <FL/Fl.H> | ||||
#include <FL/Fl_Group.H> | #include <FL/Fl_Group.H> | ||||
#include <FL/Fl_Button.H> | |||||
#include <FL/Fl_Group.H> | |||||
#include <FL/Fl_Window.H> | #include <FL/Fl_Window.H> | ||||
#include <FL/Fl_Menu_Button.H> | |||||
#include <FL/Fl_Menu_Item.H> | |||||
#include <iostream> | #include <iostream> | ||||
#include <map> | #include <map> | ||||
#include <string> | #include <string> | ||||
@@ -32,7 +35,7 @@ using namespace std; | |||||
class Fl_EventMap; | class Fl_EventMap; | ||||
class Fl_SEvent : public Fl_Button | |||||
class Fl_SEvent : public Fl_Group | |||||
{ | { | ||||
public: | public: | ||||
enum Type{NO_TYPE,MELODY,PERCUSSION}; | enum Type{NO_TYPE,MELODY,PERCUSSION}; | ||||
@@ -81,6 +84,8 @@ public: | |||||
private: | private: | ||||
Fl_Menu_Button *m_Menu; | |||||
Type m_Type; | Type m_Type; | ||||
// whether we were active or not last tick | // whether we were active or not last tick | ||||
bool m_LastState; | 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 | |||||