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); | |||