commandline options, new modules appear at consistent point, comment redraw fix, help added, new dialogues.master
| @@ -185,6 +185,15 @@ void Fl_Canvas::draw() | |||
| } | |||
| } | |||
| void Fl_Canvas::Poll() | |||
| { | |||
| // bit of a workaround... | |||
| if(m_IncompleteWire.InputChild!=-1 || m_IncompleteWire.OutputChild!=-1) | |||
| { | |||
| redraw(); | |||
| } | |||
| } | |||
| void Fl_Canvas::DrawWires() | |||
| { | |||
| for(vector<CanvasWire>::iterator i=m_WireVec.begin(); | |||
| @@ -206,38 +215,106 @@ void Fl_Canvas::DrawWires() | |||
| SpiralInfo::Alert("Cant find source or dest device while drawing wires"); | |||
| return; | |||
| } | |||
| //============================= | |||
| // wire colour stuff - dan b. | |||
| //============================= | |||
| Fl_Color col = (Fl_Color) WIRE_COL0; | |||
| switch (SourceDevice->GetPortType(i->OutputPort+SourceDevice->GetInfo()->NumInputs)) { | |||
| case 0: col = (Fl_Color) WIRE_COL0; | |||
| break; | |||
| case 1: col = (Fl_Color) WIRE_COL1; | |||
| break; | |||
| case 2: col = (Fl_Color) WIRE_COL2; | |||
| break; | |||
| case 3: col = (Fl_Color) WIRE_COL3; | |||
| break; | |||
| case 4: col = (Fl_Color) WIRE_COL4; | |||
| break; | |||
| case 0: col = (Fl_Color) WIRE_COL0; break; | |||
| case 1: col = (Fl_Color) WIRE_COL1; break; | |||
| case 2: col = (Fl_Color) WIRE_COL2; break; | |||
| case 3: col = (Fl_Color) WIRE_COL3; break; | |||
| case 4: col = (Fl_Color) WIRE_COL4; break; | |||
| default: col = (Fl_Color) WIRE_COL0; | |||
| } | |||
| fl_color(col); | |||
| //============================= | |||
| fl_line(SourceDevice->GetPortX(i->OutputPort+SourceDevice->GetInfo()->NumInputs), | |||
| SourceDevice->GetPortY(i->OutputPort+SourceDevice->GetInfo()->NumInputs), | |||
| DestDevice->GetPortX(i->InputPort), | |||
| DestDevice->GetPortY(i->InputPort)); | |||
| } | |||
| } | |||
| // draw the wire we are currently connecting | |||
| if(m_IncompleteWire.InputChild!=-1) | |||
| { | |||
| Fl_DeviceGUI* Device = (Fl_DeviceGUI*)(child(m_IncompleteWire.InputChild)); | |||
| if (!Device) | |||
| { | |||
| SpiralInfo::Alert("Cant find source or dest device while drawing wires"); | |||
| return; | |||
| } | |||
| Fl_Color col = (Fl_Color) WIRE_COL0; | |||
| switch (Device->GetPortType(m_IncompleteWire.InputPort)) { | |||
| case 0: col = (Fl_Color) WIRE_COL0; break; | |||
| case 1: col = (Fl_Color) WIRE_COL1; break; | |||
| case 2: col = (Fl_Color) WIRE_COL2; break; | |||
| case 3: col = (Fl_Color) WIRE_COL3; break; | |||
| case 4: col = (Fl_Color) WIRE_COL4; break; | |||
| default: col = (Fl_Color) WIRE_COL0; | |||
| } | |||
| fl_color(col); | |||
| fl_line(Device->GetPortX(m_IncompleteWire.InputPort), | |||
| Device->GetPortY(m_IncompleteWire.InputPort), | |||
| Fl::event_x(), | |||
| Fl::event_y()); | |||
| } | |||
| if(m_IncompleteWire.OutputChild!=-1) | |||
| { | |||
| Fl_DeviceGUI* Device = (Fl_DeviceGUI*)(child(m_IncompleteWire.OutputChild)); | |||
| if (!Device) | |||
| { | |||
| SpiralInfo::Alert("Cant find source or dest device while drawing wires"); | |||
| return; | |||
| } | |||
| Fl_Color col = (Fl_Color) WIRE_COL0; | |||
| switch (Device->GetPortType(m_IncompleteWire.OutputPort+Device->GetInfo()->NumInputs)) { | |||
| case 0: col = (Fl_Color) WIRE_COL0; break; | |||
| case 1: col = (Fl_Color) WIRE_COL1; break; | |||
| case 2: col = (Fl_Color) WIRE_COL2; break; | |||
| case 3: col = (Fl_Color) WIRE_COL3; break; | |||
| case 4: col = (Fl_Color) WIRE_COL4; break; | |||
| default: col = (Fl_Color) WIRE_COL0; | |||
| } | |||
| fl_color(col); | |||
| fl_line(Device->GetPortX(m_IncompleteWire.OutputPort+Device->GetInfo()->NumInputs), | |||
| Device->GetPortY(m_IncompleteWire.OutputPort+Device->GetInfo()->NumInputs), | |||
| Fl::event_x(), | |||
| Fl::event_y()); | |||
| } | |||
| } | |||
| void Fl_Canvas::ClearIncompleteWire() | |||
| { | |||
| // Turn off both ports | |||
| if (m_IncompleteWire.OutputChild!=-1) | |||
| { | |||
| ((Fl_DeviceGUI*)(child(m_IncompleteWire.OutputChild)))->RemoveConnection(m_IncompleteWire.OutputPort+ | |||
| ((Fl_DeviceGUI*)(child(m_IncompleteWire.OutputChild)))->GetInfo()->NumInputs); | |||
| } | |||
| if (m_IncompleteWire.InputChild!=-1) | |||
| { | |||
| ((Fl_DeviceGUI*)(child(m_IncompleteWire.InputChild)))->RemoveConnection(m_IncompleteWire.InputPort); | |||
| } | |||
| m_IncompleteWire.Clear(); | |||
| } | |||
| int Fl_Canvas::handle(int event) | |||
| { | |||
| if (Fl_Group::handle(event)) return 1; | |||
| if (event==FL_PUSH) | |||
| { | |||
| ClearIncompleteWire(); | |||
| } | |||
| if (Fl::event_button()==3) | |||
| { | |||
| if (event==FL_PUSH) | |||
| @@ -264,7 +341,7 @@ int Fl_Canvas::handle(int event) | |||
| redraw(); | |||
| } | |||
| } | |||
| return 1; | |||
| } | |||
| @@ -301,7 +378,7 @@ void Fl_Canvas::PortClicked(Fl_DeviceGUI* Device, int Type, int Port, bool Value | |||
| } | |||
| else | |||
| { | |||
| m_IncompleteWire.Clear(); | |||
| ClearIncompleteWire(); | |||
| } | |||
| } | |||
| else | |||
| @@ -315,7 +392,7 @@ void Fl_Canvas::PortClicked(Fl_DeviceGUI* Device, int Type, int Port, bool Value | |||
| } | |||
| else | |||
| { | |||
| m_IncompleteWire.Clear(); | |||
| ClearIncompleteWire(); | |||
| } | |||
| } | |||
| @@ -328,6 +405,14 @@ void Fl_Canvas::PortClicked(Fl_DeviceGUI* Device, int Type, int Port, bool Value | |||
| cb_Connection(this,(void*)&m_IncompleteWire); | |||
| m_Graph.AddConnection(m_IncompleteWire.OutputID,m_IncompleteWire.InputID); | |||
| // Turn on both ports | |||
| Fl_DeviceGUI* ODGUI = (Fl_DeviceGUI*)(child(m_IncompleteWire.OutputChild)); | |||
| ODGUI->AddConnection(m_IncompleteWire.OutputPort+ODGUI->GetInfo()->NumInputs); | |||
| Fl_DeviceGUI* IDGUI = (Fl_DeviceGUI*)(child(m_IncompleteWire.InputChild)); | |||
| IDGUI->AddConnection(m_IncompleteWire.InputPort); | |||
| m_IncompleteWire.Clear(); | |||
| redraw(); | |||
| @@ -336,30 +421,41 @@ void Fl_Canvas::PortClicked(Fl_DeviceGUI* Device, int Type, int Port, bool Value | |||
| } | |||
| else // Turned off the port | |||
| { | |||
| // Find the connection | |||
| for(vector<CanvasWire>::iterator i=m_WireVec.begin(); | |||
| i!=m_WireVec.end(); i++) | |||
| // Find connections using this port | |||
| bool Found=true; | |||
| while (Found) | |||
| { | |||
| if ((Type==Fl_DeviceGUI::OUTPUT && i->OutputChild==ChildNum && i->OutputPort==Port) || | |||
| (Type==Fl_DeviceGUI::INPUT && i->InputChild==ChildNum && i->InputPort==Port)) | |||
| Found=false; | |||
| for(vector<CanvasWire>::iterator i=m_WireVec.begin(); | |||
| i!=m_WireVec.end(); i++) | |||
| { | |||
| // Turn off both ports | |||
| ((Fl_DeviceGUI*)(child(i->OutputChild)))->ForcePortValue(i->OutputPort+ | |||
| ((Fl_DeviceGUI*)(child(i->OutputChild)))->GetInfo()->NumInputs,false); | |||
| ((Fl_DeviceGUI*)(child(i->InputChild)))->ForcePortValue(i->InputPort,false); | |||
| // send the unconnect callback | |||
| cb_Unconnect(this,(void*)&(*i)); | |||
| m_Graph.RemoveConnection(i->OutputID,i->InputID); | |||
| if ((Type==Fl_DeviceGUI::OUTPUT && i->OutputChild==ChildNum && i->OutputPort==Port) || | |||
| (Type==Fl_DeviceGUI::INPUT && i->InputChild==ChildNum && i->InputPort==Port)) | |||
| { | |||
| // Turn off both ports | |||
| Fl_DeviceGUI* ODGUI = (Fl_DeviceGUI*)(child(i->OutputChild)); | |||
| ODGUI->RemoveConnection(i->OutputPort+ODGUI->GetInfo()->NumInputs); | |||
| Fl_DeviceGUI* IDGUI = (Fl_DeviceGUI*)(child(i->InputChild)); | |||
| IDGUI->RemoveConnection(i->InputPort); | |||
| // send the unconnect callback | |||
| cb_Unconnect(this,(void*)&(*i)); | |||
| m_Graph.RemoveConnection(i->OutputID,i->InputID); | |||
| // Remove the wire | |||
| m_WireVec.erase(i); | |||
| redraw(); | |||
| break; | |||
| // Remove the wire | |||
| m_WireVec.erase(i); | |||
| Found=true; | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| redraw(); | |||
| // Clear the current selection | |||
| m_IncompleteWire.Clear(); | |||
| } | |||
| @@ -396,9 +492,9 @@ void Fl_Canvas::ClearConnections(Fl_DeviceGUI* Device) | |||
| i->InputChild==ChildNum) | |||
| { | |||
| // Turn off both ports | |||
| ((Fl_DeviceGUI*)(child(i->OutputChild)))->ForcePortValue(i->OutputPort+ | |||
| ((Fl_DeviceGUI*)(child(i->OutputChild)))->GetInfo()->NumInputs,false); | |||
| ((Fl_DeviceGUI*)(child(i->InputChild)))->ForcePortValue(i->InputPort,false); | |||
| ((Fl_DeviceGUI*)(child(i->OutputChild)))->RemoveConnection(i->OutputPort+ | |||
| ((Fl_DeviceGUI*)(child(i->OutputChild)))->GetInfo()->NumInputs); | |||
| ((Fl_DeviceGUI*)(child(i->InputChild)))->RemoveConnection(i->InputPort); | |||
| // send the unconnect callback | |||
| cb_Unconnect(this,(void*)&(*i)); | |||
| @@ -483,9 +579,9 @@ istream &operator>>(istream &s, Fl_Canvas &o) | |||
| o.m_Graph.AddConnection(NewWire.OutputID,NewWire.InputID); | |||
| // Turn on both ports | |||
| ((Fl_DeviceGUI*)(o.child(NewWire.OutputChild)))->ForcePortValue(NewWire.OutputPort+ | |||
| ((Fl_DeviceGUI*)(o.child(NewWire.OutputChild)))->GetInfo()->NumInputs,true); | |||
| ((Fl_DeviceGUI*)(o.child(NewWire.InputChild)))->ForcePortValue(NewWire.InputPort,true); | |||
| ((Fl_DeviceGUI*)(o.child(NewWire.OutputChild)))->AddConnection(NewWire.OutputPort+ | |||
| ((Fl_DeviceGUI*)(o.child(NewWire.OutputChild)))->GetInfo()->NumInputs); | |||
| ((Fl_DeviceGUI*)(o.child(NewWire.InputChild)))->AddConnection(NewWire.InputPort); | |||
| } | |||
| return s; | |||
| @@ -43,6 +43,7 @@ public: | |||
| InputChild=-1; | |||
| InputPort=-1; | |||
| InputID=-1; | |||
| DelMe=false; | |||
| } | |||
| int OutputID; | |||
| @@ -51,6 +52,7 @@ public: | |||
| int InputID; | |||
| int InputChild; | |||
| int InputPort; | |||
| bool DelMe; | |||
| }; | |||
| class Fl_Canvas : public Fl_Group | |||
| @@ -73,10 +75,13 @@ public: | |||
| void AddPluginName(const string &s, int ID) | |||
| { m_PluginNameList.push_back(pair<string,int>(s,ID)); } | |||
| GraphSort* GetGraph() { return &m_Graph; } | |||
| void Poll(); | |||
| private: | |||
| void DrawWires(); | |||
| void ClearIncompleteWire(); | |||
| Fl_Image *m_BG; | |||
| char *m_BGData; | |||
| @@ -17,9 +17,9 @@ | |||
| */ | |||
| #include "Fl_CommentGUI.h" | |||
| #include <FL/fl_ask.H> | |||
| #include <FL/fl_draw.H> | |||
| #include "../../SpiralSynthModularInfo.h" | |||
| #include "../../GUI/Widgets/PawfalInput.h" | |||
| Fl_CommentGUI::Fl_CommentGUI(const DeviceGUIInfo& Info, Fl_Window *PW, Fl_Pixmap *Icon) : | |||
| Fl_DeviceGUI(Info,PW,Icon), | |||
| @@ -36,8 +36,8 @@ int Fl_CommentGUI::handle(int event) | |||
| { | |||
| if (Fl::event_button()==1 && event==FL_PUSH && Fl::event_clicks()==1) | |||
| { | |||
| const char *t=fl_input("and your comment is:", m_Comment.c_str()); | |||
| if (t) | |||
| char t[1024]; | |||
| if (Pawfal_Input("and your comment is:", m_Comment.c_str(), t)) | |||
| { | |||
| string temp(t); | |||
| if (temp!="") | |||
| @@ -45,6 +45,7 @@ int Fl_CommentGUI::handle(int event) | |||
| m_Comment=temp; | |||
| m_DragBar->label(m_Comment.c_str()); | |||
| redraw(); | |||
| parent()->redraw(); | |||
| //int x,y; | |||
| //fl_measure(m_Comment.c_str(),x,y); | |||
| //m_DragBar->size(x,y); | |||
| @@ -21,6 +21,35 @@ | |||
| #include "../../SpiralSynthModularInfo.h" | |||
| int Fl_DeviceGUI::Numbers[512]; | |||
| Fl_PortButton::Fl_PortButton(int x, int y, int w, int h, char *n) : | |||
| Fl_Button(x,y,w,h,n) | |||
| { | |||
| m_ConnectionCount=0; | |||
| } | |||
| int Fl_PortButton::handle(int event) | |||
| { | |||
| if (event==FL_PUSH) | |||
| { | |||
| m_LastButton=Fl::event_button(); | |||
| if (m_LastButton == 1) | |||
| { | |||
| if (m_Type==INPUT && value()) return 1; | |||
| do_callback(); | |||
| return 1; | |||
| } | |||
| if (m_LastButton == 3) | |||
| { | |||
| do_callback(); | |||
| return 1; | |||
| } | |||
| } | |||
| return 1; | |||
| } | |||
| Fl_DeviceGUI::Fl_DeviceGUI(const DeviceGUIInfo& Info, Fl_Group *PW, Fl_Pixmap *Icon) : | |||
| Fl_Group(Info.XPos, Info.YPos, Info.Width+(PortGroupWidth*2), Info.Height+TitleBarHeight, ""), | |||
| @@ -107,7 +136,7 @@ void Fl_DeviceGUI::Setup(const DeviceGUIInfo& Info, bool FirstTime) | |||
| } | |||
| // delete the current ports | |||
| for(vector<Fl_Button*>::iterator i=m_PortVec.begin(); | |||
| for(vector<Fl_PortButton*>::iterator i=m_PortVec.begin(); | |||
| i!=m_PortVec.end(); i++) | |||
| { | |||
| remove(*i); | |||
| @@ -126,8 +155,9 @@ void Fl_DeviceGUI::Setup(const DeviceGUIInfo& Info, bool FirstTime) | |||
| for (int n=0; n<Info.NumInputs; n++) | |||
| { | |||
| Fl_Button* NewInput = new Fl_Button(InputX,StartY+PortDist*n,PortSize,PortSize,""); | |||
| Fl_PortButton* NewInput = new Fl_PortButton(InputX,StartY+PortDist*n,PortSize,PortSize,""); | |||
| NewInput->type(1); | |||
| NewInput->SetType(Fl_PortButton::INPUT); | |||
| NewInput->value(false); | |||
| NewInput->box(FL_ROUNDED_BOX); | |||
| @@ -157,8 +187,9 @@ void Fl_DeviceGUI::Setup(const DeviceGUIInfo& Info, bool FirstTime) | |||
| for (int n=0; n<Info.NumOutputs; n++) | |||
| { | |||
| Fl_Button* NewOutput = new Fl_Button(OutputX,StartY+PortDist*n,PortSize,PortSize,""); | |||
| Fl_PortButton* NewOutput = new Fl_PortButton(OutputX,StartY+PortDist*n,PortSize,PortSize,""); | |||
| NewOutput->type(1); | |||
| NewOutput->SetType(Fl_PortButton::OUTPUT); | |||
| NewOutput->value(false); | |||
| NewOutput->box(FL_ROUNDED_BOX); | |||
| @@ -188,9 +219,27 @@ void Fl_DeviceGUI::Setup(const DeviceGUIInfo& Info, bool FirstTime) | |||
| } | |||
| } | |||
| void Fl_DeviceGUI::AddConnection(int n) | |||
| { | |||
| m_PortVec[n]->Add(); | |||
| m_PortVec[n]->value(1); | |||
| redraw(); | |||
| } | |||
| void Fl_DeviceGUI::RemoveConnection(int n) | |||
| { | |||
| m_PortVec[n]->Remove(); | |||
| if (!m_PortVec[n]->GetCount()) | |||
| { | |||
| m_PortVec[n]->value(0); | |||
| redraw(); | |||
| } | |||
| } | |||
| inline void Fl_DeviceGUI::cb_Port_i(Fl_Button* o, void* v) | |||
| { | |||
| int Port=*(int*)(v); | |||
| Fl_PortButton *PortButton = (Fl_PortButton *)o; | |||
| PortType Pt; | |||
| if (m_DelMe) return; | |||
| @@ -205,9 +254,15 @@ inline void Fl_DeviceGUI::cb_Port_i(Fl_Button* o, void* v) | |||
| Pt=OUTPUT; | |||
| Port-=m_Info.NumInputs; | |||
| } | |||
| ((Fl_Canvas*)(parent()))->PortClicked(this,Pt,Port,o->value()); | |||
| if (PortButton->GetLastButton()==1) | |||
| { | |||
| ((Fl_Canvas*)(parent()))->PortClicked(this,Pt,Port,1); | |||
| } | |||
| else | |||
| { | |||
| ((Fl_Canvas*)(parent()))->PortClicked(this,Pt,Port,0); | |||
| } | |||
| } | |||
| void Fl_DeviceGUI::cb_Port(Fl_Button* o, void* v) | |||
| @@ -41,6 +41,28 @@ static const int TitleBarHeight = 12; | |||
| static const int PortGroupWidth = 12; | |||
| static const int PortSize=6; | |||
| class Fl_PortButton : public Fl_Button | |||
| { | |||
| public: | |||
| enum Type {INPUT,OUTPUT}; | |||
| Fl_PortButton(int x, int y, int w, int h, char *n); | |||
| virtual ~Fl_PortButton() {}; | |||
| void SetType(Type s) { m_Type=s; } | |||
| virtual int handle(int event); | |||
| void Add() { m_ConnectionCount++; } | |||
| void Remove() { m_ConnectionCount--; } | |||
| int GetCount() { return m_ConnectionCount; } | |||
| int GetLastButton() { return m_LastButton; } | |||
| private: | |||
| Type m_Type; | |||
| int m_ConnectionCount; | |||
| int m_LastButton; | |||
| }; | |||
| struct DeviceGUIInfo | |||
| { | |||
| int XPos; | |||
| @@ -67,13 +89,16 @@ public: | |||
| int GetID() { return m_ID; } | |||
| void SetID(int s) { m_ID=s; /*DisplayID(s);*/ } | |||
| /*char did[8]; | |||
| void DisplayID(int s) { sprintf(did,"%d",s); label(did); }*/ | |||
| bool Killed() { return m_DelMe; } | |||
| int GetPortX(int n) { return m_PortVec[n]->x()+PortSize/2; } | |||
| int GetPortY(int n) { return m_PortVec[n]->y()+PortSize/2; } | |||
| void ForcePortValue(int n, bool v) { m_PortVec[n]->value(v); } | |||
| // aesthitic, to keep track of number of connections to know whether to | |||
| // draw the port as occupied or not. | |||
| void AddConnection(int n); | |||
| void RemoveConnection(int n); | |||
| bool GetPortValue(int n) { return m_PortVec[n]->value(); } | |||
| const DeviceGUIInfo* GetInfo() { return &m_Info; } | |||
| Fl_Group* GetPluginWindow() { return m_PluginWindow; } | |||
| @@ -95,7 +120,7 @@ private: | |||
| inline void cb_Port_i(Fl_Button* o, void* v); | |||
| static void cb_Port(Fl_Button* o, void* v); | |||
| vector<Fl_Button*> m_PortVec; | |||
| vector<Fl_PortButton*> m_PortVec; | |||
| static int Numbers[512]; | |||
| @@ -0,0 +1,157 @@ | |||
| /* PawfalInput Fltk Dialog | |||
| * Copyleft (C) 2001 Dan Bethell <dan@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 "PawfalInput.h" | |||
| #include <string.h> | |||
| bool Pawfal_Input(const char *a, const char *b, char *out) | |||
| { | |||
| PawfalInput pi(300, 100,a,b); | |||
| if (pi.go()) | |||
| { | |||
| strcpy(out,pi.getText()); | |||
| return true; | |||
| } | |||
| return true; | |||
| } | |||
| PawfalInput::PawfalInput(int x, int y, int w, int h, const char *label, const char *dflt): | |||
| Fl_Window(x,y,w, h), | |||
| lbl(new Fl_Box(50, ((h-30)/2)-20, w-60,20, label)), | |||
| input(new Fl_Input(50,((h-30)/2)+0,w-60,20)), | |||
| ok(new Fl_Button(w-100, h-25, 30, 20, "ok")), | |||
| cancel(new Fl_Button(w-60, h-25, 50, 20, "cancel")), | |||
| keyhit(false) | |||
| { | |||
| lbl->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); | |||
| lbl->labelfont(FL_SCREEN_BOLD); | |||
| lbl->labelsize(12); | |||
| ok->labelfont(FL_SCREEN_BOLD); | |||
| ok->labelsize(12); | |||
| cancel->labelfont(FL_SCREEN_BOLD); | |||
| cancel->labelsize(12); | |||
| input->value(dflt); | |||
| input->textfont(FL_SCREEN_BOLD); | |||
| input->textsize(12); | |||
| logo = new Fl_Pixmap(tv_xpm); | |||
| end(); | |||
| set_modal(); | |||
| //clear_border(); | |||
| } | |||
| PawfalInput::PawfalInput(int w, int h, const char *label, const char *dflt): | |||
| Fl_Window(w, h, "Enter text"), | |||
| lbl(new Fl_Box(50, ((h-30)/2)-20, w-60,20, label)), | |||
| input(new Fl_Input(50,((h-30)/2)+0,w-60,20)), | |||
| ok(new Fl_Button(w-100, h-25, 30, 20, "ok")), | |||
| cancel(new Fl_Button(w-60, h-25, 50, 20, "cancel")), | |||
| keyhit(false) | |||
| { | |||
| lbl->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); | |||
| lbl->labelfont(FL_SCREEN_BOLD); | |||
| lbl->labelsize(12); | |||
| ok->labelfont(FL_SCREEN_BOLD); | |||
| ok->labelsize(12); | |||
| cancel->labelfont(FL_SCREEN_BOLD); | |||
| cancel->labelsize(12); | |||
| input->value(dflt); | |||
| input->textfont(FL_SCREEN_BOLD); | |||
| input->textsize(12); | |||
| logo = new Fl_Pixmap(tv_xpm); | |||
| end(); | |||
| set_modal(); | |||
| //clear_border(); | |||
| } | |||
| PawfalInput::~PawfalInput() | |||
| { | |||
| delete logo; | |||
| } | |||
| int PawfalInput::handle(int e) | |||
| { | |||
| int result = Fl_Window::handle(e); | |||
| if (e==FL_KEYBOARD) | |||
| { | |||
| if (Fl::event_key()==FL_Escape||Fl::event_key()==FL_Enter) | |||
| keyhit=true; | |||
| } | |||
| return result; | |||
| } | |||
| void PawfalInput::draw() | |||
| { | |||
| Fl_Window::draw(); | |||
| logo->draw(10, 10); | |||
| } | |||
| void PawfalInput::ok_cb(Fl_Button *b, void *d) | |||
| { | |||
| assert(b!=NULL); | |||
| PawfalInput *ptr = (PawfalInput *)d; | |||
| assert(ptr!=NULL); | |||
| } | |||
| void PawfalInput::cancel_cb(Fl_Button *b, void *d) | |||
| { | |||
| assert(b!=NULL); | |||
| PawfalInput *ptr = (PawfalInput *)d; | |||
| assert(ptr!=NULL); | |||
| } | |||
| bool PawfalInput::go() | |||
| { | |||
| bool result = false; | |||
| show(); | |||
| for (;;) | |||
| { | |||
| Fl_Widget *o = Fl::readqueue(); | |||
| if (!o&&!keyhit) Fl::wait(); | |||
| else if (keyhit) | |||
| { | |||
| int key = Fl::event_key(); | |||
| if (key==FL_Escape) | |||
| { | |||
| result = false; | |||
| break; | |||
| } | |||
| if (key==FL_Enter) | |||
| { | |||
| result=true; | |||
| break; | |||
| } | |||
| } | |||
| else if (o == ok) {result = true; break;} | |||
| else if (o == cancel) {result = false; break;} | |||
| } | |||
| hide(); | |||
| return result; | |||
| } | |||
| @@ -0,0 +1,95 @@ | |||
| /* PawfalInput Fltk Dialog | |||
| * Copyleft (C) 2001 Dan Bethell <dan@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. | |||
| */ | |||
| #ifndef PAWFALINPUT_H | |||
| #define PAWFALINPUT_H | |||
| #include <iostream> | |||
| #include <cstdlib> | |||
| #include <ctime> | |||
| #include <cassert> | |||
| #include <FL/Fl.H> | |||
| #include <FL/Fl_Window.H> | |||
| #include <FL/Fl_Button.H> | |||
| #include <FL/Fl_Input.H> | |||
| #include <FL/Fl_Box.H> | |||
| #include <FL/Fl_Pixmap.H> | |||
| static char * tv_xpm[] = { | |||
| "30 30 4 1", | |||
| " c None", | |||
| ". c #000000", | |||
| "+ c #6E6E6E", | |||
| "@ c #FFFFFF", | |||
| "..............................", | |||
| "..............................", | |||
| "..............................", | |||
| "..............................", | |||
| "..............................", | |||
| ".....++++++++++++++++++++.....", | |||
| ".....++++++@@@@@@@@++++++.....", | |||
| ".....++++++@@@+++@@++++++.....", | |||
| ".....++++++++++++@@++++++.....", | |||
| ".....++++++++++++@@++++++.....", | |||
| ".....+++++++++@@@@@++++++.....", | |||
| ".....+++++++++@@+++++++++.....", | |||
| ".....++++++++++++++++++++.....", | |||
| ".....+++++++++@@+++++++++.....", | |||
| ".....++++++++++++++++++++.....", | |||
| "..............................", | |||
| "..............................", | |||
| "..............................", | |||
| "..............................", | |||
| "..............................", | |||
| " .......... ", | |||
| " .......... ", | |||
| " .......... ", | |||
| " .......... ", | |||
| " .......... ", | |||
| "..............................", | |||
| "..............................", | |||
| "..............................", | |||
| "..............................", | |||
| ".............................."}; | |||
| class PawfalInput : public Fl_Window | |||
| { | |||
| int handle(int); | |||
| void draw(); | |||
| static void ok_cb(Fl_Button *, void *); | |||
| static void cancel_cb(Fl_Button *, void *); | |||
| public: | |||
| PawfalInput(int, int, int, int, const char *, const char *); | |||
| PawfalInput(int, int, const char *, const char *); | |||
| ~PawfalInput(); | |||
| bool go(); | |||
| const char *getText(){return input->value();} | |||
| private: | |||
| Fl_Pixmap *logo; | |||
| Fl_Box *lbl; | |||
| Fl_Input *input; | |||
| Fl_Button *ok, *cancel; | |||
| bool keyhit; | |||
| }; | |||
| bool Pawfal_Input(const char *a, const char *b, char *out); | |||
| #endif | |||
| @@ -0,0 +1,143 @@ | |||
| /* PawfalYesNo Fltk Dialog | |||
| * Copyleft (C) 2001 Dan Bethell <dan@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 "PawfalYesNo.h" | |||
| #include <FL/fl_draw.H> | |||
| #include <stdio.h> | |||
| #include <string.h> | |||
| #include <stdlib.h> | |||
| bool Pawfal_YesNo(const char *a,...) | |||
| { | |||
| va_list ap; | |||
| va_start(ap, a); | |||
| char buffer[1024]; | |||
| if (!strcmp(a,"%s")) { | |||
| strcpy(buffer,va_arg(ap, const char*)); | |||
| } else { | |||
| //: matt: MacOS provides two equally named vsnprintf's... | |||
| ::vsnprintf(buffer, 1024, a, ap); | |||
| } | |||
| va_end(ap); | |||
| PawfalYesNo pi(300, 100,buffer); | |||
| if (pi.go()) return true; | |||
| return false; | |||
| } | |||
| PawfalYesNo::PawfalYesNo(int w, int h, const char *label): | |||
| Fl_Window(w,h,"Question"), | |||
| lbl(new Fl_Box(50, 15, w-60,20, label)), | |||
| keyhit(false), | |||
| result(false) | |||
| { | |||
| lbl->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); | |||
| lbl->labelfont(FL_SCREEN_BOLD); | |||
| lbl->labelsize(12); | |||
| int message_w, message_h; | |||
| fl_font(FL_SCREEN_BOLD, 12); | |||
| message_w = message_h = 0; | |||
| fl_measure(label, message_w, message_h); | |||
| resize(x(),y(),message_w+60,h); | |||
| w=message_w+60; | |||
| yes = new Fl_Button(w-120, h-25, 50, 20, "yes"); | |||
| no = new Fl_Button(w-60, h-25, 50, 20, "no"); | |||
| yes->labelfont(FL_SCREEN_BOLD); | |||
| yes->labelsize(12); | |||
| no->labelfont(FL_SCREEN_BOLD); | |||
| no->labelsize(12); | |||
| logo = new Fl_Pixmap(tv_xpm); | |||
| end(); | |||
| set_modal(); | |||
| //clear_border(); | |||
| } | |||
| PawfalYesNo::~PawfalYesNo() | |||
| { | |||
| delete logo; | |||
| } | |||
| int PawfalYesNo::handle(int e) | |||
| { | |||
| int result = Fl_Window::handle(e); | |||
| if (e==FL_KEYBOARD) | |||
| { | |||
| if (Fl::event_key()==FL_Escape||Fl::event_key()==FL_Enter) | |||
| keyhit=true; | |||
| } | |||
| return result; | |||
| } | |||
| void PawfalYesNo::draw() | |||
| { | |||
| Fl_Window::draw(); | |||
| logo->draw(10, 10); | |||
| } | |||
| void PawfalYesNo::ok_cb(Fl_Button *b, void *d) | |||
| { | |||
| assert(b!=NULL); | |||
| PawfalYesNo *ptr = (PawfalYesNo *)d; | |||
| assert(ptr!=NULL); | |||
| } | |||
| void PawfalYesNo::cancel_cb(Fl_Button *b, void *d) | |||
| { | |||
| assert(b!=NULL); | |||
| PawfalYesNo *ptr = (PawfalYesNo *)d; | |||
| assert(ptr!=NULL); | |||
| } | |||
| bool PawfalYesNo::go() | |||
| { | |||
| result = false; | |||
| show(); | |||
| for (;;) | |||
| { | |||
| Fl_Widget *o = Fl::readqueue(); | |||
| if (!o&&!keyhit) Fl::wait(); | |||
| else if (keyhit) | |||
| { | |||
| int key = Fl::event_key(); | |||
| if (key==FL_Escape) | |||
| { | |||
| result = false; | |||
| break; | |||
| } | |||
| if (key==FL_Enter) | |||
| { | |||
| result=true; | |||
| break; | |||
| } | |||
| } | |||
| else if (o == yes) {result = true; break;} | |||
| else if (o == no) {result = false; break;} | |||
| } | |||
| hide(); | |||
| return result; | |||
| } | |||
| @@ -0,0 +1,94 @@ | |||
| /* PawfalYesNo Fltk Dialog | |||
| * Copyleft (C) 2001 Dan Bethell <dan@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. | |||
| */ | |||
| #ifndef PAWFALYESNO_H | |||
| #define PAWFALYESNO_H | |||
| #include <iostream> | |||
| #include <cstdlib> | |||
| #include <ctime> | |||
| #include <cassert> | |||
| #include <FL/Fl.H> | |||
| #include <FL/Fl_Window.H> | |||
| #include <FL/Fl_Button.H> | |||
| #include <FL/Fl_Input.H> | |||
| #include <FL/Fl_Box.H> | |||
| #include <FL/Fl_Pixmap.H> | |||
| static char * tv_xpm[] = { | |||
| "30 30 4 1", | |||
| " c None", | |||
| ". c #000000", | |||
| "+ c #6E6E6E", | |||
| "@ c #FFFFFF", | |||
| "..............................", | |||
| "..............................", | |||
| "..............................", | |||
| "..............................", | |||
| "..............................", | |||
| ".....++++++++++++++++++++.....", | |||
| ".....+++++++++@@+++++++++.....", | |||
| ".....+++++++++@@+++++++++.....", | |||
| ".....+++++++++@@+++++++++.....", | |||
| ".....+++++++++@@+++++++++.....", | |||
| ".....+++++++++@@+++++++++.....", | |||
| ".....+++++++++@@+++++++++.....", | |||
| ".....++++++++++++++++++++.....", | |||
| ".....+++++++++@@+++++++++.....", | |||
| ".....++++++++++++++++++++.....", | |||
| "..............................", | |||
| "..............................", | |||
| "..............................", | |||
| "..............................", | |||
| "..............................", | |||
| " .......... ", | |||
| " .......... ", | |||
| " .......... ", | |||
| " .......... ", | |||
| " .......... ", | |||
| "..............................", | |||
| "..............................", | |||
| "..............................", | |||
| "..............................", | |||
| ".............................."}; | |||
| class PawfalYesNo : public Fl_Window | |||
| { | |||
| int handle(int); | |||
| void draw(); | |||
| static void ok_cb(Fl_Button *, void *); | |||
| static void cancel_cb(Fl_Button *, void *); | |||
| public: | |||
| PawfalYesNo(int, int, const char *); | |||
| ~PawfalYesNo(); | |||
| bool go(); | |||
| bool getResult() { return result; } | |||
| private: | |||
| Fl_Pixmap *logo; | |||
| Fl_Box *lbl; | |||
| Fl_Button *yes, *no; | |||
| bool keyhit; | |||
| bool result; | |||
| }; | |||
| bool Pawfal_YesNo(const char *a,...); | |||
| #endif | |||
| @@ -52,6 +52,8 @@ HEADERS = SpiralSynthModular.h \ | |||
| GUI/Widgets/Fl_CommentGUI.h \ | |||
| GUI/Widgets/Fl_DragBar.H \ | |||
| GUI/Widgets/Fl_Canvas.h \ | |||
| GUI/Widgets/PawfalYesNo.h \ | |||
| GUI/Widgets/PawfalInput.h \ | |||
| SpiralSound/SpiralInfo.h \ | |||
| SpiralSound/Sample.h \ | |||
| SpiralSound/Plugins/SpiralPlugin.h \ | |||
| @@ -68,6 +70,8 @@ SOURCES = main.cpp \ | |||
| GUI/Widgets/Fl_CommentGUI.C \ | |||
| GUI/Widgets/Fl_DragBar.cxx \ | |||
| GUI/Widgets/Fl_Canvas.C \ | |||
| GUI/Widgets/PawfalYesNo.C \ | |||
| GUI/Widgets/PawfalInput.C \ | |||
| SpiralSound/SpiralInfo.C \ | |||
| SpiralSound/Sample.C \ | |||
| SpiralSound/Plugins/SpiralPlugin.C \ | |||
| @@ -83,6 +87,8 @@ OBJECTS = main.o \ | |||
| GUI/Widgets/Fl_CommentGUI.o \ | |||
| GUI/Widgets/Fl_DragBar.o \ | |||
| GUI/Widgets/Fl_Canvas.o \ | |||
| GUI/Widgets/PawfalYesNo.o \ | |||
| GUI/Widgets/PawfalInput.o \ | |||
| SpiralSound/SpiralInfo.o \ | |||
| SpiralSound/Sample.o \ | |||
| SpiralSound/Plugins/SpiralPlugin.o \ | |||
| @@ -180,6 +186,8 @@ SpiralSynthModular.o: SpiralSynthModular.C \ | |||
| GUI/Widgets/Fl_DeviceGUI.h \ | |||
| GUI/Widgets/Fl_CommentGUI.h \ | |||
| GUI/Widgets/Fl_Canvas.h \ | |||
| GUI/Widgets/PawfalYesNo.h \ | |||
| GUI/Widgets/PawfalInput.h \ | |||
| SpiralSound/Plugins/SpiralPlugin.h \ | |||
| SettingsWindow.h \ | |||
| SpiralSound/PluginManager.h \ | |||
| @@ -228,6 +236,12 @@ GUI/Widgets/Fl_Canvas.o: GUI/Widgets/Fl_Canvas.C \ | |||
| GUI/Widgets/../../SpiralSynthModularInfo.h \ | |||
| SpiralSound/SpiralInfo.h | |||
| GUI/Widgets/PawfalInput.o: GUI/Widgets/PawfalInput.C \ | |||
| GUI/Widgets/PawfalInput.h | |||
| GUI/Widgets/PawfalYesNo.o: GUI/Widgets/PawfalYesNo.C \ | |||
| GUI/Widgets/PawfalYesNo.h | |||
| SpiralSound/SpiralInfo.o: SpiralSound/SpiralInfo.C \ | |||
| SpiralSound/SpiralInfo.h \ | |||
| SpiralSound/Sample.h | |||
| @@ -330,31 +330,23 @@ void ChannelHandler::BulkTransfer(const string &ID, void *dest, int size) | |||
| } | |||
| void ChannelHandler::Wait() | |||
| { | |||
| pthread_mutex_lock(m_Mutex); | |||
| bool current=m_UpdateIndicator; | |||
| bool last=m_UpdateIndicator; | |||
| pthread_mutex_unlock(m_Mutex); | |||
| { | |||
| bool current; | |||
| bool last; | |||
| while (current==last) | |||
| for (int n=0; n<2; n++) | |||
| { | |||
| usleep(10); | |||
| pthread_mutex_lock(m_Mutex); | |||
| current=m_UpdateIndicator; | |||
| last=m_UpdateIndicator; | |||
| pthread_mutex_unlock(m_Mutex); | |||
| } | |||
| // do this twice (messages have to get there and back?) | |||
| pthread_mutex_lock(m_Mutex); | |||
| current=m_UpdateIndicator; | |||
| last=m_UpdateIndicator; | |||
| pthread_mutex_unlock(m_Mutex); | |||
| while (current==last) | |||
| { | |||
| usleep(10); | |||
| pthread_mutex_lock(m_Mutex); | |||
| current=m_UpdateIndicator; | |||
| pthread_mutex_unlock(m_Mutex); | |||
| while (current==last) | |||
| { | |||
| usleep(10); | |||
| pthread_mutex_lock(m_Mutex); | |||
| current=m_UpdateIndicator; | |||
| pthread_mutex_unlock(m_Mutex); | |||
| } | |||
| } | |||
| } | |||
| @@ -164,8 +164,6 @@ inline void ControllerPluginGUI::cb_Chan_i(Fl_Slider* o, void* v) | |||
| char temp[256]; | |||
| sprintf(temp,"%s",m_GuiVec[num]->m_Title->value()); | |||
| cerr<<"sending "<<temp<<endl; | |||
| m_GUICH->SetData("Name",(void*)temp); | |||
| m_GUICH->SetCommand(ControllerPlugin::SETCHANNEL); | |||
| } | |||
| @@ -0,0 +1,106 @@ | |||
| /* 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 "KeyboardPlugin.h" | |||
| #include "KeyboardPluginGUI.h" | |||
| #include "../../NoteTable.h" | |||
| #include "SpiralIcon.xpm" | |||
| extern "C" { | |||
| SpiralPlugin* CreateInstance() | |||
| { | |||
| return new KeyboardPlugin; | |||
| } | |||
| char** GetIcon() | |||
| { | |||
| return SpiralIcon_xpm; | |||
| } | |||
| int GetID() | |||
| { | |||
| return 40; | |||
| } | |||
| } | |||
| /////////////////////////////////////////////////////// | |||
| KeyboardPlugin::KeyboardPlugin() : | |||
| m_NoteLevel(0), | |||
| m_TriggerLevel(0) | |||
| { | |||
| m_Version=0; | |||
| m_PluginInfo.Name="Keyboard"; | |||
| m_PluginInfo.Width=300; | |||
| m_PluginInfo.Height=90; | |||
| m_PluginInfo.NumInputs=0; | |||
| m_PluginInfo.NumOutputs=2; | |||
| m_PluginInfo.PortTips.push_back("Note CV"); | |||
| m_PluginInfo.PortTips.push_back("Trigger CV"); | |||
| m_AudioCH->Register("Note",&m_GUIArgs.Note); | |||
| } | |||
| KeyboardPlugin::~KeyboardPlugin() | |||
| { | |||
| } | |||
| SpiralGUIType *KeyboardPlugin::CreateGUI() | |||
| { | |||
| return new KeyboardPluginGUI(m_PluginInfo.Width, | |||
| m_PluginInfo.Height, | |||
| this,m_AudioCH,m_HostInfo); | |||
| } | |||
| void KeyboardPlugin::Execute() | |||
| { | |||
| for (int n=0; n<m_HostInfo->BUFSIZE; n++) | |||
| { | |||
| SetOutputPitch(0,n,m_NoteLevel); | |||
| SetOutput(1,n,m_TriggerLevel); | |||
| } | |||
| } | |||
| void KeyboardPlugin::ExecuteCommands() | |||
| { | |||
| // Process any commands from the GUI | |||
| if (m_AudioCH->IsCommandWaiting()) | |||
| { | |||
| switch (m_AudioCH->GetCommand()) | |||
| { | |||
| case NOTE_ON : | |||
| m_NoteLevel=NoteTable[m_GUIArgs.Note]; | |||
| m_TriggerLevel=1.0f; | |||
| break; | |||
| case NOTE_OFF : m_TriggerLevel=0.0f; break; | |||
| }; | |||
| } | |||
| } | |||
| void KeyboardPlugin::StreamOut(ostream &s) | |||
| { | |||
| s<<m_Version<<endl; | |||
| } | |||
| void KeyboardPlugin::StreamIn(istream &s) | |||
| { | |||
| int version; | |||
| s>>version; | |||
| } | |||
| @@ -0,0 +1,50 @@ | |||
| /* 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> | |||
| #ifndef PLUGIN | |||
| #define PLUGIN | |||
| class KeyboardPlugin : public SpiralPlugin | |||
| { | |||
| public: | |||
| KeyboardPlugin(); | |||
| virtual ~KeyboardPlugin(); | |||
| virtual SpiralGUIType* CreateGUI(); | |||
| virtual void Execute(); | |||
| virtual void ExecuteCommands(); | |||
| virtual void StreamOut(ostream &s); | |||
| virtual void StreamIn(istream &s); | |||
| enum GUICommands{NONE,NOTE_ON,NOTE_OFF}; | |||
| struct GUIArgs | |||
| { | |||
| int Note; | |||
| }; | |||
| private: | |||
| GUIArgs m_GUIArgs; | |||
| float m_NoteLevel; | |||
| float m_TriggerLevel; | |||
| }; | |||
| #endif | |||
| @@ -0,0 +1,190 @@ | |||
| /* 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 "KeyboardPluginGUI.h" | |||
| #include <FL/fl_draw.h> | |||
| #include <FL/fl_file_chooser.H> | |||
| #include <FL/Fl_Hold_Browser.H> | |||
| #include <FL/Fl_Double_Window.H> | |||
| #include <FL/Fl_Scroll.H> | |||
| static const int GUI_COLOUR = 179; | |||
| static const int GUIBG_COLOUR = 144; | |||
| static const int GUIBG2_COLOUR = 145; | |||
| static int NKEYS = 30; | |||
| static char KEYMAP[30]={'z','s','x','d','c','v','g','b','h','n','j','m','q', | |||
| '2','w','3','e','r','5','t','6','y','7','u','i','9', | |||
| 'o','0','p','['}; | |||
| //////////////////////////////////////////////////////////////////////// | |||
| KeyboardPluginGUI::KeyboardPluginGUI(int w, int h,KeyboardPlugin *o,ChannelHandler *ch,const HostInfo *Info) : | |||
| SpiralPluginGUI(w,h,o,ch), | |||
| m_Last(-1), | |||
| m_Oct(4) | |||
| { | |||
| Fl_Scroll *Scroll = new Fl_Scroll(2,20,w-4,h-20); | |||
| Fl_Group *Group = new Fl_Group(0,20,500,h-40); | |||
| Group->box(FL_FLAT_BOX); | |||
| Group->user_data(this); | |||
| Scroll->add(Group); | |||
| int KeyWidth=10,Note,Pos=0,Count=0; | |||
| for (int n=0; n<NUM_KEYS; n++) | |||
| { | |||
| m_Num[n]=n; | |||
| Note = n%12; | |||
| if (Note!=1 && Note!=3 && Note!=6 && Note!=8 && Note!=10) | |||
| { | |||
| Count++; | |||
| Pos=Count*KeyWidth; | |||
| m_Key[n] = new Fl_Button(Pos,20,KeyWidth,50,""); | |||
| m_Key[n]->box(FL_THIN_UP_BOX); | |||
| m_Key[n]->labelsize(10); | |||
| m_Key[n]->when(FL_WHEN_CHANGED); | |||
| if (Note==0) | |||
| { | |||
| int Num=n/12; | |||
| sprintf(m_Label[n],"%d",Num); | |||
| m_Key[n]->label(m_Label[n]); | |||
| m_Key[n]->align(FL_ALIGN_BOTTOM|FL_ALIGN_INSIDE); | |||
| } | |||
| m_Key[n]->color(FL_WHITE); | |||
| m_Key[n]->selection_color(FL_WHITE); | |||
| m_Key[n]->callback((Fl_Callback*)cb_Key, &m_Num[n]); | |||
| Group->add(m_Key[n]); | |||
| } | |||
| } | |||
| Count=0; | |||
| for (int n=0; n<NUM_KEYS; n++) | |||
| { | |||
| Note = n%12; | |||
| if (Note==1 || Note==3 || Note==6 || Note==8 || Note==10) | |||
| { | |||
| m_Key[n] = new Fl_Button(Pos+5,20,KeyWidth,30,""); | |||
| m_Key[n]->box(FL_THIN_UP_BOX); | |||
| m_Key[n]->labelsize(10); | |||
| m_Key[n]->when(FL_WHEN_CHANGED); | |||
| m_Key[n]->color(FL_BLACK); | |||
| m_Key[n]->selection_color(FL_BLACK); | |||
| m_Key[n]->callback((Fl_Callback*)cb_Key, &m_Num[n]); | |||
| Group->add(m_Key[n]); | |||
| } | |||
| else | |||
| { | |||
| Count++; | |||
| Pos=Count*KeyWidth; | |||
| } | |||
| } | |||
| Group->position(-100,20); | |||
| Group->end(); | |||
| Scroll->end(); | |||
| } | |||
| void KeyboardPluginGUI::Update() | |||
| { | |||
| int Volume=0,Note=0,EventDevice=0; | |||
| if (Fl::event_key(FL_F+1)) m_Oct=0; | |||
| if (Fl::event_key(FL_F+2)) m_Oct=1; | |||
| if (Fl::event_key(FL_F+3)) m_Oct=2; | |||
| if (Fl::event_key(FL_F+4)) m_Oct=3; | |||
| if (Fl::event_key(FL_F+5)) m_Oct=4; | |||
| if (Fl::event_key(FL_F+6)) m_Oct=5; | |||
| if (Fl::event_key(FL_F+7)) m_Oct=6; | |||
| if (Fl::event_key(FL_F+8)) m_Oct=7; | |||
| if (Fl::event_key(FL_F+9)) m_Oct=8; | |||
| if (Fl::event_key(FL_F+10)) m_Oct=9; | |||
| if (Fl::event_key(FL_F+11)) m_Oct=10; | |||
| int note=0; | |||
| char KeyChar=0; | |||
| bool KeyPressed=false; | |||
| for (int key=0; key<NKEYS; key++) | |||
| { | |||
| KeyChar=KEYMAP[key]; | |||
| // check if a key's been pressed | |||
| if (Fl::event_key(KeyChar)) | |||
| { | |||
| KeyPressed=true; | |||
| Volume = 127; | |||
| Note=(m_Oct*12)+note; | |||
| if (m_Last!=Note) | |||
| { | |||
| if (m_Last!=-1) | |||
| { | |||
| // turn off the old one | |||
| m_Key[m_Last]->value(0); | |||
| m_Key[m_Last]->parent()->redraw(); | |||
| m_GUICH->SetCommand(KeyboardPlugin::NOTE_OFF); | |||
| m_GUICH->Wait(); | |||
| } | |||
| m_Last = Note; | |||
| m_GUICH->Set("Note",Note); | |||
| m_GUICH->SetCommand(KeyboardPlugin::NOTE_ON); | |||
| m_Key[Note]->value(1); | |||
| m_Key[m_Last]->parent()->redraw(); | |||
| } | |||
| } | |||
| else // it's not pressed down | |||
| { | |||
| //see if the note was pressed down last time | |||
| Note=(m_Oct*12)+note; | |||
| if (m_Last==Note) | |||
| { | |||
| m_Key[m_Last]->value(0); | |||
| m_Key[m_Last]->parent()->redraw(); | |||
| m_GUICH->SetCommand(KeyboardPlugin::NOTE_OFF); | |||
| m_Last=-1; | |||
| } | |||
| } | |||
| note++; | |||
| } | |||
| } | |||
| void KeyboardPluginGUI::UpdateValues(SpiralPlugin *o) | |||
| { | |||
| KeyboardPlugin *Plugin = (KeyboardPlugin*)o; | |||
| } | |||
| //// Callbacks //// | |||
| inline void KeyboardPluginGUI::cb_Key_i(Fl_Button* o, void* v) | |||
| { | |||
| int k=*(int*)(v); | |||
| if (o->value()) | |||
| { | |||
| m_GUICH->Set("Note",k); | |||
| m_GUICH->SetCommand(KeyboardPlugin::NOTE_ON); | |||
| } | |||
| else | |||
| { | |||
| m_GUICH->SetCommand(KeyboardPlugin::NOTE_OFF); | |||
| } | |||
| parent()->redraw(); | |||
| } | |||
| void KeyboardPluginGUI::cb_Key(Fl_Button* o, void* v) | |||
| { ((KeyboardPluginGUI*)(o->parent()->user_data()))->cb_Key_i(o,v);} | |||
| @@ -0,0 +1,56 @@ | |||
| /* 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_Button.H> | |||
| #include <FL/Fl_Pixmap.H> | |||
| #include <FL/Fl_Counter.H> | |||
| #include "../Widgets/Fl_Knob.H" | |||
| #include "../Widgets/Fl_DragBar.H" | |||
| #include "KeyboardPlugin.h" | |||
| #include "../SpiralPluginGUI.h" | |||
| #ifndef MIDIGUI | |||
| #define MIDIGUI | |||
| const int NUM_KEYS = 132; | |||
| class KeyboardPluginGUI : public SpiralPluginGUI | |||
| { | |||
| public: | |||
| KeyboardPluginGUI(int w, int h, KeyboardPlugin *o,ChannelHandler *ch,const HostInfo *Info); | |||
| virtual void UpdateValues(SpiralPlugin *o); | |||
| virtual void Update(); | |||
| private: | |||
| int m_Num[NUM_KEYS]; | |||
| Fl_Button* m_Key[NUM_KEYS]; | |||
| char m_Label[NUM_KEYS][2]; | |||
| int m_Last; | |||
| int m_Oct; | |||
| //// Callbacks //// | |||
| inline void cb_Key_i(Fl_Button* o, void* v); | |||
| static void cb_Key(Fl_Button* o, void* v); | |||
| }; | |||
| #endif | |||
| @@ -0,0 +1,182 @@ | |||
| ############################################################################# | |||
| # Makefile for building KeyboardPlugin.so | |||
| # Generated by tmake at 22:13, 2001/09/17 | |||
| # Project: KeyboardPlugin | |||
| # 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 -pthread | |||
| 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 \ | |||
| ../../Sample.h \ | |||
| ../../Midi.h \ | |||
| KeyboardPlugin.h \ | |||
| KeyboardPluginGUI.h | |||
| SOURCES = ../SpiralPlugin.C \ | |||
| ../SpiralPluginGUI.C \ | |||
| ../../ChannelHandler.C \ | |||
| ../Widgets/Fl_Knob.cxx \ | |||
| ../Widgets/Fl_DragBar.cxx \ | |||
| ../../Sample.C \ | |||
| ../../Midi.C \ | |||
| KeyboardPlugin.C \ | |||
| KeyboardPluginGUI.C | |||
| OBJECTS = ../SpiralPlugin.o \ | |||
| ../SpiralPluginGUI.o \ | |||
| ../../ChannelHandler.o \ | |||
| ../Widgets/Fl_Knob.o \ | |||
| ../Widgets/Fl_DragBar.o \ | |||
| ../../Sample.o \ | |||
| ../../Midi.o \ | |||
| KeyboardPlugin.o \ | |||
| KeyboardPluginGUI.o | |||
| INTERFACES = | |||
| UICDECLS = | |||
| UICIMPLS = | |||
| SRCMOC = | |||
| OBJMOC = | |||
| DIST = | |||
| TARGET = KeyboardPlugin.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 KeyboardPlugin.pro | |||
| dist: | |||
| $(TAR) KeyboardPlugin.tar KeyboardPlugin.pro $(SOURCES) $(HEADERS) $(INTERFACES) $(DIST) | |||
| $(GZIP) KeyboardPlugin.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 | |||
| ../../Sample.o: ../../Sample.C \ | |||
| ../../Sample.h \ | |||
| ../../SpiralInfo.h | |||
| ../../Midi.o: ../../Midi.C \ | |||
| ../../Midi.h \ | |||
| ../../NoteTable.h | |||
| KeyboardPlugin.o: KeyboardPlugin.C \ | |||
| KeyboardPlugin.h \ | |||
| ../SpiralPlugin.h \ | |||
| ../../Sample.h \ | |||
| ../../SpiralInfo.h \ | |||
| ../../Sample.h \ | |||
| KeyboardPluginGUI.h \ | |||
| ../Widgets/Fl_Knob.H \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../../NoteTable.h \ | |||
| ../../Midi.h \ | |||
| SpiralIcon.xpm | |||
| KeyboardPluginGUI.o: KeyboardPluginGUI.C \ | |||
| KeyboardPluginGUI.h \ | |||
| ../Widgets/Fl_Knob.H \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| KeyboardPlugin.h \ | |||
| ../SpiralPlugin.h \ | |||
| ../../Sample.h \ | |||
| ../../SpiralInfo.h \ | |||
| ../../Sample.h \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../Widgets/Fl_DragBar.H | |||
| ../../ChannelHandler.o: ../../ChannelHandler.C \ | |||
| ../../ChannelHandler.h | |||
| @@ -0,0 +1,316 @@ | |||
| /* XPM */ | |||
| static char * SpiralIcon_xpm[] = { | |||
| "36 36 277 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 #0C0C0C", | |||
| "+. c #161800", | |||
| "@. c #1A1B00", | |||
| "#. c #060600", | |||
| "$. c #191A00", | |||
| "%. c #393643", | |||
| "&. c #47415F", | |||
| "*. c #9692A4", | |||
| "=. c #D9D8DE", | |||
| "-. c #F7F7F8", | |||
| ";. c #918DA0", | |||
| ">. c #B8B5C1", | |||
| ",. c #D1D1D1", | |||
| "'. c #252525", | |||
| "). c #040400", | |||
| "!. c #FFF200", | |||
| "~. c #727175", | |||
| "{. c #FEFEFF", | |||
| "]. c #9D99AA", | |||
| "^. c #DBD9E0", | |||
| "/. c #E9E9E9", | |||
| "(. c #CBCBCB", | |||
| "_. c #E0E0E0", | |||
| ":. c #6C6C6C", | |||
| "<. c #515151", | |||
| "[. c #A6A6A7", | |||
| "}. c #827E93", | |||
| "|. c #615C77", | |||
| "1. c #EAEAED", | |||
| "2. c #DFDFE1", | |||
| "3. c #050500", | |||
| "4. c #1E1D24", | |||
| "5. c #9894A7", | |||
| "6. c #B1AEBB", | |||
| "7. c #69686F", | |||
| "8. c #000001", | |||
| "9. c #020200", | |||
| "0. c #615C76", | |||
| "a. c #5F5A75", | |||
| "b. c #413E4D", | |||
| "c. c #020203", | |||
| "d. c #1A1A1C", | |||
| "e. c #C3C1CB", | |||
| "f. c #9D9D9D", | |||
| "g. c #202020", | |||
| "h. c #383838", | |||
| "i. c #4C4C4C", | |||
| "j. c #111112", | |||
| "k. c #C9C7D0", | |||
| "l. c #F1F1F1", | |||
| "m. c #F8F8F8", | |||
| "n. c #050408", | |||
| "o. c #AEACB9", | |||
| "p. c #FEFEFE", | |||
| "q. c #B7B5C1", | |||
| "r. c #9390A2", | |||
| "s. c #BBBBBB", | |||
| "t. c #414141", | |||
| "u. c #28272A", | |||
| "v. c #F4F4F6", | |||
| "w. c #605B76", | |||
| "x. c #736E86", | |||
| "y. c #D8D8D8", | |||
| "z. c #727272", | |||
| "A. c #101010", | |||
| "B. c #848486", | |||
| "C. c #CCCBD3", | |||
| "D. c #747087", | |||
| "E. c #6D6881", | |||
| "F. c #1C1C1C", | |||
| "G. c #242424", | |||
| "H. c #0A0A00", | |||
| "I. c #656566", | |||
| "J. c #F6F6F6", | |||
| "K. c #E8E6EA", | |||
| "L. c #706B84", | |||
| "M. c #E3E1E6", | |||
| "N. c #474746", | |||
| "O. c #151515", | |||
| "P. c #C8C8C8", | |||
| "Q. c #AEAEAE", | |||
| "R. c #080808", | |||
| "S. c #010100", | |||
| "T. c #373639", | |||
| "U. c #FDFCFE", | |||
| "V. c #ABA8B7", | |||
| "W. c #F1F0F3", | |||
| "X. c #6D6980", | |||
| "Y. c #0A090E", | |||
| "Z. 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", | |||
| "^+ c #969699", | |||
| "/+ c #FAFAFA", | |||
| "(+ c #F8F8F9", | |||
| "_+ c #A29EAF", | |||
| ":+ c #F7F6F8", | |||
| "<+ c #F0F0F1", | |||
| "[+ c #B8B7B9", | |||
| "}+ c #E4E4E4", | |||
| "|+ c #FDFDFD", | |||
| "1+ c #A5A2B2", | |||
| "2+ c #3B3456", | |||
| "3+ c #A8A5B4", | |||
| "4+ c #525252", | |||
| "5+ c #848387", | |||
| "6+ c #CDCDCD", | |||
| "7+ c #8D899C", | |||
| "8+ c #494262", | |||
| "9+ c #68627C", | |||
| "0+ c #40395A", | |||
| "a+ c #ECECEC", | |||
| "b+ c #020202", | |||
| "c+ c #B4B5B5", | |||
| "d+ c #0B0B0B", | |||
| "e+ c #313232", | |||
| "f+ c #E3E3E3", | |||
| "g+ c #B1AEBC", | |||
| "h+ c #BDBBC6", | |||
| "i+ c #3C3556", | |||
| "j+ c #898599", | |||
| "k+ c #EDEDED", | |||
| "l+ c #39393A", | |||
| "m+ c #040404", | |||
| "n+ c #333333", | |||
| "o+ c #F5F5F5", | |||
| "p+ c #2B2B2B", | |||
| "q+ c #2D2A3D", | |||
| "r+ c #B6B4C1", | |||
| "s+ c #F5F5F6", | |||
| "t+ c #605A76", | |||
| "u+ c #DAD8DF", | |||
| "v+ c #F5F4F6", | |||
| "w+ c #615B76", | |||
| "x+ c #524D6A", | |||
| "y+ c #E4E3E8", | |||
| "z+ c #D5D5D5", | |||
| "A+ c #1B1B1B", | |||
| "B+ c #303030", | |||
| "C+ c #AAABAB", | |||
| "D+ c #585464", | |||
| "E+ c #B0AEBB", | |||
| "F+ c #A29FAF", | |||
| "G+ c #E9E8E9", | |||
| "H+ c #787779", | |||
| "I+ c #0F0E15", | |||
| "J+ c #2D2D2E", | |||
| "K+ c #595959", | |||
| "L+ c #FAFAFB", | |||
| "M+ c #807B92", | |||
| "N+ c #B0ADBB", | |||
| "O+ c #E8E7EB", | |||
| "P+ c #3A3258", | |||
| "Q+ c #E6E5EA", | |||
| "R+ c #DFDEE3", | |||
| "S+ c #443E5E", | |||
| "T+ c #BAB8C4", | |||
| "U+ c #C1BFCA", | |||
| "V+ c #E0E0E5", | |||
| "W+ c #D0CED6", | |||
| "X+ c #362F52", | |||
| "Y+ c #CECCD5", | |||
| "Z+ 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 6 6 E ~.{.; ; ]. ", | |||
| " ^.; ; /.R h (._.:.6 6 6 6 6 !.!.6 !.6 6 6 6 <.[.4 }. ", | |||
| " |.1.; 2...6 6 6 6 6 6 6 6 !.!.3.!.6 6 !.6 6 6 6 4.5. ", | |||
| " V @ 6.7.8.6 6 6 6 6 6 6 !.!.6 9.!.!.6 6 !.6 6 6 ", | |||
| " 0.a.b.6 c.6 6 6 6 6 6 !.6 !.6 6 !.6 6 !.!.6 6 d. ", | |||
| " e.; ; f.g.g.h.i.g.6 6 !.6 6 6 !.6 6 !.!.6 !.6 6 j. ", | |||
| " k.; ; l.m.; ; ; 6 6 6 !.6 6 6 6 !.!.6 6 6 !.6 6 n. ", | |||
| " o.; ; ; ; p.; ; 6 6 !.!.6 6 6 6 6 6 6 6 6 6 !.6 6 q., ", | |||
| " r.; ; p.; : s.t.6 6 6 !.!.6 6 6 6 6 6 6 6 6 !.6 u.p.v.w. ", | |||
| " x.; ; ; y.z.A.6 6 6 6 6 !.!.6 6 6 6 6 6 6 !.6 6 B.; ; C.D. ", | |||
| " E.J ; : F.6 6 6 6 G...6 6 6 !.6 6 H.6 !.!.6 6 6 I.J.; ; K.L. ", | |||
| " M.; ; N.6 E 6 O.P.Q.R.6 6 6 !.!.!.!.6 S.6 6 6 6 T.U.; ; > L. ", | |||
| " V.; W.X.Y.6 6 Q.p.; Z.`.6 6 6 6 6 6 6 6 +.+6 6 6 ++@+; ; #+$+ ", | |||
| " L.%+! &+*+=+x ; ; -+;+>+,+l '+6 6 6 )+!+~+{+6 6 6 ]+^+/+; ; (+@ ", | |||
| " _+:+<+[+}+|+; 1+2+3+; J.'+6 6 E 4+; ; 5+6 6 E 6 o 6+; ; = 7+ ", | |||
| " 8+> ; ; ; ; ; ; 9+0+; ; a+h.6 6 b+D ; ; c+d+6 6 6 e+f+; ; g+ ", | |||
| " > ; ; ; ; h+i+j+; ; k+l+6 6 m+n+; ; o+p+6 6 q+r+; s+3 ", | |||
| " t+u+= ; v+w+x+y+; ; z+A+6 6 b+B+; ; ; C+4+D+ ", | |||
| " E+4 F+ X ; ; ; G+H+B+I+J+K+; ; ; p.L+M+ ", | |||
| " N+; ; ; ; ; O+P+Q+; ; ; ; = R+S+ ", | |||
| " T+U+V+4 ; ; W+X+Y+; ; ; s j+T ", | |||
| " Z+ `+ @j+ ", | |||
| " ", | |||
| " ", | |||
| " "}; | |||
| @@ -250,6 +250,7 @@ void MatrixPluginGUI::UpdateValues(SpiralPlugin *o) | |||
| void MatrixPluginGUI::UpdateMatrix() | |||
| { | |||
| m_GUICH->Wait(); | |||
| m_GUICH->RequestChannelAndWait("Matrix"); | |||
| m_GUICH->GetData("Matrix",(void*)m_GUIMatrix); | |||
| @@ -20,28 +20,39 @@ | |||
| #include "SpiralPlugin.h" | |||
| #include <FL/fl_draw.h> | |||
| #include <FL/fl_draw.H> | |||
| #include <FL/Fl_Multiline_Output.h> | |||
| static const int GUI_COLOUR = 154; | |||
| static const int GUIBG_COLOUR = 144; | |||
| static const int GUIBG2_COLOUR = 145; | |||
| SpiralPluginGUI::SpiralPluginGUI(int w, int h, SpiralPlugin* o, ChannelHandler *ch) : | |||
| SpiralGUIType(0,0,w,h,"") | |||
| SpiralGUIType(0,0,w,h,""), | |||
| m_HelpWin(NULL) | |||
| { | |||
| Fl::visible_focus(false); | |||
| m_GUICH = ch; | |||
| box(FL_THIN_UP_BOX); | |||
| m_DragBar = new Fl_DragBar(0,0,w,20,o->GetName().c_str()); | |||
| m_DragBar = new Fl_DragBar(0,0,w,15,o->GetName().c_str()); | |||
| m_DragBar->labelsize(10); | |||
| m_DragBar->type(Fl_DragBar::FLDRAG); | |||
| add(m_DragBar); | |||
| m_Hide = new Fl_Button(2,2,18,16,"X"); | |||
| m_Hide = new Fl_Button(0,0,18,16,"X"); | |||
| m_Hide->labeltype(FL_ENGRAVED_LABEL); | |||
| m_Hide->labelsize(10); | |||
| m_Hide->box(FL_NO_BOX); | |||
| m_Hide->callback((Fl_Callback*)cb_Hide); | |||
| add(m_Hide); | |||
| m_Help = new Fl_Button(w-15,0,18,16,"?"); | |||
| m_Help->labeltype(FL_ENGRAVED_LABEL); | |||
| m_Help->labelsize(10); | |||
| m_Help->box(FL_NO_BOX); | |||
| m_Help->callback((Fl_Callback*)cb_Help); | |||
| add(m_Help); | |||
| } | |||
| SpiralPluginGUI::~SpiralPluginGUI() | |||
| @@ -54,6 +65,11 @@ void SpiralPluginGUI::Update() | |||
| { | |||
| } | |||
| const string SpiralPluginGUI::GetHelpText() | |||
| { | |||
| return "Help! I need some helptext!!!"; | |||
| } | |||
| //// Callbacks //// | |||
| inline void SpiralPluginGUI::cb_Hide_i(Fl_Button* o, void* v) | |||
| @@ -61,4 +77,27 @@ inline void SpiralPluginGUI::cb_Hide_i(Fl_Button* o, void* v) | |||
| void SpiralPluginGUI::cb_Hide(Fl_Button* o, void* v) | |||
| { ((SpiralPluginGUI*)(o->parent()))->cb_Hide_i(o,v); } | |||
| inline void SpiralPluginGUI::cb_Help_i(Fl_Button* o, void* v) | |||
| { | |||
| if (m_HelpWin==NULL) | |||
| { | |||
| int w=300,h=200; | |||
| m_HelpWin = new Fl_Double_Window(w,h,"Help"); | |||
| Fl_Multiline_Output* text= new Fl_Multiline_Output(0,0,w,h); | |||
| text->value(GetHelpText().c_str()); | |||
| text->textsize(10); | |||
| text->set_output(); | |||
| m_HelpWin->add(text); | |||
| m_HelpWin->show(); | |||
| } | |||
| else | |||
| { | |||
| m_HelpWin->hide(); | |||
| delete m_HelpWin; | |||
| } | |||
| } | |||
| void SpiralPluginGUI::cb_Help(Fl_Button* o, void* v) | |||
| { ((SpiralPluginGUI*)(o->parent()))->cb_Help_i(o,v); } | |||
| @@ -45,14 +45,19 @@ public: | |||
| protected: | |||
| ChannelHandler *m_GUICH; | |||
| virtual const string GetHelpText(); | |||
| private: | |||
| Fl_DragBar* m_DragBar; | |||
| Fl_Button* m_Hide; | |||
| Fl_Button* m_Help; | |||
| Fl_Double_Window *m_HelpWin; | |||
| //// Callbacks //// | |||
| inline void cb_Hide_i(Fl_Button* o, void* v); | |||
| static void cb_Hide(Fl_Button*, void*); | |||
| inline void cb_Help_i(Fl_Button* o, void* v); | |||
| static void cb_Help(Fl_Button*, void*); | |||
| }; | |||
| #endif | |||
| @@ -23,7 +23,6 @@ | |||
| #include <FL/Fl.H> | |||
| #include <FL/Enumerations.H> | |||
| #include <FL/fl_file_chooser.h> | |||
| #include <FL/fl_ask.h> | |||
| #include <FL/Fl_Box.h> | |||
| #include <FL/Fl_Tooltip.h> | |||
| @@ -38,10 +37,11 @@ | |||
| #include "GUI/options.xpm" | |||
| #include "GUI/edit.xpm" | |||
| #include "GUI/comment.xpm" | |||
| #include "GUI/Widgets/PawfalYesNo.h" | |||
| //#define DEBUG_PLUGINS | |||
| const static string LABEL = "SpiralSynthModular 0.1.1 MultiThreaded"; | |||
| const static string LABEL = "SpiralSynthModular "+VER_STRING; | |||
| static string TITLEBAR; | |||
| static const int FILE_VERSION = 3; | |||
| @@ -210,6 +210,8 @@ void SynthModular::UpdatePluginGUIs() | |||
| break; | |||
| } | |||
| } | |||
| m_Canvas->Poll(); | |||
| } | |||
| ////////////////////////////////////////////////////////// | |||
| @@ -358,7 +360,7 @@ SpiralWindowType *SynthModular::CreateWindow() | |||
| m_Canvas->SetAddDeviceCallback((Fl_Callback*)cb_NewDeviceFromMenu); | |||
| m_CanvasScroll->add(m_Canvas); | |||
| m_NewComment = new Fl_Button(TOOLBOX_WIDTH/2-16, MAIN_HEIGHT*2-25, 32, 20, ""); | |||
| m_NewComment = new Fl_Button(TOOLBOX_WIDTH/2-16, MAIN_HEIGHT*2-25, 40, 40, ""); | |||
| m_NewComment->box(FL_NO_BOX); | |||
| m_Canvas->align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE); | |||
| tPix = new Fl_Pixmap(comment_xpm); | |||
| @@ -560,9 +562,16 @@ DeviceWin* SynthModular::NewDeviceWin(int n, int x, int y) | |||
| ////////////////////////////////////////////////////////// | |||
| void SynthModular::AddDevice(int n, int x=TOOLBOX_WIDTH+50, int y=400) | |||
| void SynthModular::AddDevice(int n, int x=-1, int y=-1) | |||
| { | |||
| //cerr<<"Adding "<<m_NextID<<endl; | |||
| if (x==-1) | |||
| { | |||
| x = m_CanvasScroll->x()+50; | |||
| y = m_CanvasScroll->y()+50; | |||
| } | |||
| DeviceWin* temp = NewDeviceWin(n,x,y); | |||
| if (temp) | |||
| { | |||
| @@ -576,10 +585,16 @@ void SynthModular::AddDevice(int n, int x=TOOLBOX_WIDTH+50, int y=400) | |||
| ////////////////////////////////////////////////////////// | |||
| DeviceWin* SynthModular::NewComment(int n, int x=TOOLBOX_WIDTH+50, int y=400) | |||
| DeviceWin* SynthModular::NewComment(int n, int x=-1, int y=-1) | |||
| { | |||
| DeviceWin *nlw = new DeviceWin; | |||
| if (x==-1) | |||
| { | |||
| x = m_CanvasScroll->x()+50; | |||
| y = m_CanvasScroll->y()+50; | |||
| } | |||
| nlw->m_Device=NULL; | |||
| nlw->m_PluginID = COMMENT_ID; | |||
| @@ -858,7 +873,7 @@ void SynthModular::cb_Close(Fl_Window* o, void* v) | |||
| inline void SynthModular::cb_Load_i(Fl_Button* o, void* v) | |||
| { | |||
| if (m_DeviceWinMap.size()>0 && !fl_ask("Load - Loose changes to current design?")) | |||
| if (m_DeviceWinMap.size()>0 && !Pawfal_YesNo("Load - Loose changes to current design?")) | |||
| { | |||
| return; | |||
| } | |||
| @@ -896,7 +911,7 @@ inline void SynthModular::cb_Save_i(Fl_Button* o, void* v) | |||
| ifstream ifl(fn); | |||
| if (ifl) | |||
| { | |||
| if (!fl_ask("File [%s] exists, overwrite?",fn)) | |||
| if (!Pawfal_YesNo("File [%s] exists, overwrite?",fn)) | |||
| { | |||
| return; | |||
| } | |||
| @@ -922,7 +937,7 @@ void SynthModular::cb_Save(Fl_Button* o, void* v) | |||
| inline void SynthModular::cb_New_i(Fl_Button* o, void* v) | |||
| { | |||
| if (m_DeviceWinMap.size()>0 && !fl_ask("New - Loose changes to current design?")) | |||
| if (m_DeviceWinMap.size()>0 && !Pawfal_YesNo("New - Loose changes to current design?")) | |||
| { | |||
| return; | |||
| } | |||
| @@ -39,6 +39,8 @@ | |||
| #include "SpiralSound/ChannelHandler.h" | |||
| #include "SettingsWindow.h" | |||
| const static string VER_STRING = "0.2.0"; | |||
| typedef Fl_Double_Window SpiralWindowType; | |||
| // typedef Fl_Window SpiralWindowType; | |||
| @@ -72,6 +72,7 @@ SpiralSynthModularInfo::SpiralSynthModularInfo() | |||
| PLUGINVEC.push_back("OutputPlugin.so"); | |||
| PLUGINVEC.push_back("ScopePlugin.so"); | |||
| PLUGINVEC.push_back("MidiPlugin.so"); | |||
| PLUGINVEC.push_back("KeyboardPlugin.so"); | |||
| PLUGINVEC.push_back("ControllerPlugin.so"); | |||
| PLUGINVEC.push_back("WaveTablePlugin.so"); | |||
| PLUGINVEC.push_back("OscillatorPlugin.so"); | |||
| @@ -44,7 +44,7 @@ if test $ac_arg_jack = "Y" ; then | |||
| SampleHoldPlugin ScopePlugin SmoothPlugin SplitterPlugin \ | |||
| StereoMixerPlugin WaveTablePlugin LADSPAPlugin \ | |||
| XFadePlugin JackPlugin PoshSamplerPlugin\ | |||
| DistributorPlugin LFOPlugin" | |||
| DistributorPlugin LFOPlugin KeyboardPlugin" | |||
| else | |||
| PLUGINLIST="AmpPlugin ControllerPlugin DelayPlugin EchoPlugin EnvFollowerPlugin \ | |||
| EnvelopePlugin FilterPlugin MatrixPlugin MidiPlugin MixerPlugin MoogFilterPlugin \ | |||
| @@ -52,7 +52,7 @@ else | |||
| SampleHoldPlugin ScopePlugin SmoothPlugin SplitterPlugin \ | |||
| StereoMixerPlugin WaveTablePlugin LADSPAPlugin \ | |||
| XFadePlugin PoshSamplerPlugin\ | |||
| DistributorPlugin LFOPlugin" | |||
| DistributorPlugin LFOPlugin KeyboardPlugin" | |||
| fi | |||
| echo "$PLUGINLIST" > SpiralSound/PluginList.txt | |||
| @@ -160,6 +160,7 @@ SpiralSound/Plugins/DistributorPlugin/Makefile | |||
| SpiralSound/Plugins/JoystickPlugin/Makefile | |||
| SpiralSound/Plugins/LFOPlugin/Makefile | |||
| SpiralSound/Plugins/MeterPlugin/Makefile | |||
| SpiralSound/Plugins/KeyboardPlugin/Makefile | |||
| Makefile | |||
| ) | |||
| @@ -79,6 +79,21 @@ int main(int argc, char **argv) | |||
| if (!strcmp(argv[a],"--NoGUI")) GUI = false; | |||
| else if (!strcmp(argv[a],"--SHED_FIFO")) FIFO = true; | |||
| else if (!strcmp(argv[a],"--CallbackOnly")) CallbackOnly = true; | |||
| else if (!strcmp(argv[a],"-h")) | |||
| { | |||
| cout<<"usage: spiralsynthmodular [options] [patch.ssm]"<<endl<<endl | |||
| <<"options list"<<endl | |||
| <<"-h : help"<<endl | |||
| <<"-v : print version"<<endl | |||
| <<"--NoGUI : run without GUI (only useful when loading patch from command line"<<endl | |||
| <<"--SHED_FIFO : spawn audio thread with FIFO sheduling (run as root)"<<endl | |||
| <<"--CallbackOnly : prevents 100% cpu usage when idle, but makes OSS output unsable"<<endl; | |||
| exit(0); | |||
| } | |||
| else if (!strcmp(argv[a],"-v")) | |||
| { | |||
| cout<<VER_STRING<<endl; exit(0); | |||
| } | |||
| else | |||
| { | |||
| cmd_filename = argv[1]; | |||
| @@ -86,6 +101,11 @@ int main(int argc, char **argv) | |||
| } | |||
| } | |||
| } | |||
| // set some fltk defaults | |||
| Fl_Tooltip::size(10); | |||
| Fl::visible_focus(false); | |||
| //Fl::set_font(FL_HELVETICA,FL_SCREEN); | |||
| Fl::visual(FL_DOUBLE|FL_RGB); | |||
| @@ -97,10 +117,6 @@ int main(int argc, char **argv) | |||
| win->xclass(""); | |||
| if (GUI) win->show(1, argv); // prevents stuff happening before the plugins have loaded | |||
| // set some fltk defaults | |||
| Fl_Tooltip::size(10); | |||
| Fl::visible_focus(false); | |||
| // spawn the audio thread | |||
| int ret; | |||
| if (FIFO) ret=pthread_create_realtime(&loopthread,(void*(*)(void*))audioloop,NULL,10); | |||