@@ -16,7 +16,7 @@ | |||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
*/ | */ | ||||
#include "Fl/fl_draw.H" | |||||
#include "FL/fl_draw.H" | |||||
#include "Fl_Canvas.h" | #include "Fl_Canvas.h" | ||||
#include "Fl_DeviceGUI.h" | #include "Fl_DeviceGUI.h" | ||||
#include <iostream> | #include <iostream> | ||||
@@ -36,10 +36,10 @@ cb_AddDevice(NULL), | |||||
m_ToolMenu(false), | m_ToolMenu(false), | ||||
m_UpdateTimer(0) | m_UpdateTimer(0) | ||||
{ | { | ||||
m_IncompleteWire.OutputChild=-1; | |||||
m_IncompleteWire.OutputID=-1; | |||||
m_IncompleteWire.OutputPort=-1; | m_IncompleteWire.OutputPort=-1; | ||||
m_IncompleteWire.OutputTerminal=false; | m_IncompleteWire.OutputTerminal=false; | ||||
m_IncompleteWire.InputChild=-1; | |||||
m_IncompleteWire.InputID=-1; | |||||
m_IncompleteWire.InputPort=-1; | m_IncompleteWire.InputPort=-1; | ||||
m_IncompleteWire.InputTerminal=false; | m_IncompleteWire.InputTerminal=false; | ||||
@@ -183,17 +183,9 @@ void Fl_Canvas::DrawWires() | |||||
{ | { | ||||
for(vector<CanvasWire>::iterator i=m_WireVec.begin(); | for(vector<CanvasWire>::iterator i=m_WireVec.begin(); | ||||
i!=m_WireVec.end(); i++) | i!=m_WireVec.end(); i++) | ||||
{ | |||||
if (i->OutputChild>children() || i->InputChild>children()) | |||||
{ | |||||
cerr<<"wire output child = "<<i->OutputChild<<endl; | |||||
cerr<<"wire input child = "<<i->InputChild<<endl; | |||||
SpiralInfo::Alert("Wire drawing mismatch!"); | |||||
return; | |||||
} | |||||
Fl_DeviceGUI* SourceDevice = (Fl_DeviceGUI*)(child(i->OutputChild)); | |||||
Fl_DeviceGUI* DestDevice = (Fl_DeviceGUI*)(child(i->InputChild)); | |||||
{ | |||||
Fl_DeviceGUI* SourceDevice = FindDevice(i->OutputID); | |||||
Fl_DeviceGUI* DestDevice = FindDevice(i->InputID); | |||||
if (!SourceDevice || !DestDevice) | if (!SourceDevice || !DestDevice) | ||||
{ | { | ||||
@@ -225,7 +217,7 @@ void Fl_Canvas::DrawWires() | |||||
bool Fl_Canvas::UserMakingConnection() | bool Fl_Canvas::UserMakingConnection() | ||||
{ | { | ||||
return (m_IncompleteWire.InputChild!=-1 || m_IncompleteWire.OutputChild!=-1); | |||||
return (m_IncompleteWire.InputID!=-1 || m_IncompleteWire.OutputID!=-1); | |||||
} | } | ||||
//////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////// | ||||
@@ -233,9 +225,9 @@ bool Fl_Canvas::UserMakingConnection() | |||||
void Fl_Canvas::DrawIncompleteWire() | void Fl_Canvas::DrawIncompleteWire() | ||||
{ | { | ||||
// draw the wire we are currently connecting | // draw the wire we are currently connecting | ||||
if(m_IncompleteWire.InputChild!=-1) | |||||
if(m_IncompleteWire.InputID!=-1) | |||||
{ | { | ||||
Fl_DeviceGUI* Device = (Fl_DeviceGUI*)(child(m_IncompleteWire.InputChild)); | |||||
Fl_DeviceGUI* Device = FindDevice(m_IncompleteWire.InputID); | |||||
if (!Device) | if (!Device) | ||||
{ | { | ||||
@@ -261,9 +253,9 @@ void Fl_Canvas::DrawIncompleteWire() | |||||
Fl::event_y()); | Fl::event_y()); | ||||
} | } | ||||
if(m_IncompleteWire.OutputChild!=-1) | |||||
if(m_IncompleteWire.OutputID!=-1) | |||||
{ | { | ||||
Fl_DeviceGUI* Device = (Fl_DeviceGUI*)(child(m_IncompleteWire.OutputChild)); | |||||
Fl_DeviceGUI* Device = FindDevice(m_IncompleteWire.OutputID); | |||||
if (!Device) | if (!Device) | ||||
{ | { | ||||
@@ -295,15 +287,14 @@ void Fl_Canvas::DrawIncompleteWire() | |||||
void Fl_Canvas::ClearIncompleteWire() | void Fl_Canvas::ClearIncompleteWire() | ||||
{ | { | ||||
// Turn off both ports | // Turn off both ports | ||||
if (m_IncompleteWire.OutputChild!=-1) | |||||
if (m_IncompleteWire.OutputID!=-1) | |||||
{ | { | ||||
((Fl_DeviceGUI*)(child(m_IncompleteWire.OutputChild)))->RemoveConnection(m_IncompleteWire.OutputPort+ | |||||
((Fl_DeviceGUI*)(child(m_IncompleteWire.OutputChild)))->GetInfo()->NumInputs); | |||||
FindDevice(m_IncompleteWire.OutputID)->RemoveConnection(m_IncompleteWire.OutputPort+FindDevice(m_IncompleteWire.OutputID)->GetInfo()->NumInputs); | |||||
} | } | ||||
if (m_IncompleteWire.InputChild!=-1) | |||||
if (m_IncompleteWire.InputID!=-1) | |||||
{ | { | ||||
((Fl_DeviceGUI*)(child(m_IncompleteWire.InputChild)))->RemoveConnection(m_IncompleteWire.InputPort); | |||||
FindDevice(m_IncompleteWire.InputID)->RemoveConnection(m_IncompleteWire.InputPort); | |||||
} | } | ||||
m_IncompleteWire.Clear(); | m_IncompleteWire.Clear(); | ||||
} | } | ||||
@@ -313,11 +304,21 @@ void Fl_Canvas::ClearIncompleteWire() | |||||
int Fl_Canvas::handle(int event) | int Fl_Canvas::handle(int event) | ||||
{ | { | ||||
if (Fl_Group::handle(event)) return 1; | if (Fl_Group::handle(event)) return 1; | ||||
if (event==FL_PUSH) | if (event==FL_PUSH) | ||||
{ | { | ||||
ClearIncompleteWire(); | ClearIncompleteWire(); | ||||
redraw(); | redraw(); | ||||
m_DragX=Fl::event_x(); | |||||
m_DragY=Fl::event_y(); | |||||
} | |||||
if (Fl::event_button()==1 && event==FL_DRAG) | |||||
{ | |||||
position(x()+(Fl::event_x()-m_DragX),y()+(Fl::event_y()-m_DragY)); | |||||
m_DragX=Fl::event_x(); | |||||
m_DragY=Fl::event_y(); | |||||
redraw(); | |||||
} | } | ||||
if (Fl::event_button()==3) | if (Fl::event_button()==3) | ||||
@@ -349,37 +350,20 @@ int Fl_Canvas::handle(int event) | |||||
return 1; | return 1; | ||||
} | } | ||||
//////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////// | ||||
void Fl_Canvas::PortClicked(Fl_DeviceGUI* Device, int Type, int Port, bool Value) | void Fl_Canvas::PortClicked(Fl_DeviceGUI* Device, int Type, int Port, bool Value) | ||||
{ | { | ||||
// find out which child this comes from. | |||||
int ChildNum=-1; | |||||
for(int n=0; n<children(); n++) | |||||
{ | |||||
if(child(n)==Device) | |||||
{ | |||||
ChildNum=n; | |||||
} | |||||
} | |||||
if (ChildNum==-1) | |||||
{ | |||||
SpiralInfo::Alert("Port clicked callback can't find source child."); | |||||
return; | |||||
} | |||||
if(Value) // Turned on the port | if(Value) // Turned on the port | ||||
{ | { | ||||
if(m_IncompleteWire.InputChild==-1 || m_IncompleteWire.OutputChild==-1) | |||||
if(m_IncompleteWire.InputID==-1 || m_IncompleteWire.OutputID==-1) | |||||
{ | { | ||||
if (Type==Fl_DeviceGUI::OUTPUT) | if (Type==Fl_DeviceGUI::OUTPUT) | ||||
{ | { | ||||
// make sure we don't make a output->output connection | // make sure we don't make a output->output connection | ||||
if (m_IncompleteWire.OutputChild==-1) | |||||
if (m_IncompleteWire.OutputID==-1) | |||||
{ | { | ||||
m_IncompleteWire.OutputChild=ChildNum; | |||||
m_IncompleteWire.OutputPort=Port; | m_IncompleteWire.OutputPort=Port; | ||||
m_IncompleteWire.OutputID=Device->GetID(); | m_IncompleteWire.OutputID=Device->GetID(); | ||||
m_IncompleteWire.OutputTerminal=Device->IsTerminal(); | m_IncompleteWire.OutputTerminal=Device->IsTerminal(); | ||||
@@ -392,9 +376,8 @@ void Fl_Canvas::PortClicked(Fl_DeviceGUI* Device, int Type, int Port, bool Value | |||||
else | else | ||||
{ | { | ||||
// make sure we don't make a input->input connection | // make sure we don't make a input->input connection | ||||
if (m_IncompleteWire.InputChild==-1) | |||||
if (m_IncompleteWire.InputID==-1) | |||||
{ | { | ||||
m_IncompleteWire.InputChild=ChildNum; | |||||
m_IncompleteWire.InputPort=Port; | m_IncompleteWire.InputPort=Port; | ||||
m_IncompleteWire.InputID=Device->GetID(); | m_IncompleteWire.InputID=Device->GetID(); | ||||
m_IncompleteWire.InputTerminal=Device->IsTerminal(); | m_IncompleteWire.InputTerminal=Device->IsTerminal(); | ||||
@@ -406,7 +389,7 @@ void Fl_Canvas::PortClicked(Fl_DeviceGUI* Device, int Type, int Port, bool Value | |||||
} | } | ||||
// if both have now been set... | // if both have now been set... | ||||
if (m_IncompleteWire.InputChild!=-1 && m_IncompleteWire.OutputChild!=-1) | |||||
if (m_IncompleteWire.InputID!=-1 && m_IncompleteWire.OutputID!=-1) | |||||
{ | { | ||||
m_WireVec.push_back(m_IncompleteWire); | m_WireVec.push_back(m_IncompleteWire); | ||||
@@ -416,13 +399,12 @@ void Fl_Canvas::PortClicked(Fl_DeviceGUI* Device, int Type, int Port, bool Value | |||||
m_IncompleteWire.InputID,m_IncompleteWire.InputTerminal); | m_IncompleteWire.InputID,m_IncompleteWire.InputTerminal); | ||||
// Turn on both ports | // Turn on both ports | ||||
Fl_DeviceGUI* ODGUI = (Fl_DeviceGUI*)(child(m_IncompleteWire.OutputChild)); | |||||
Fl_DeviceGUI* ODGUI = FindDevice(m_IncompleteWire.OutputID); | |||||
ODGUI->AddConnection(m_IncompleteWire.OutputPort+ODGUI->GetInfo()->NumInputs); | ODGUI->AddConnection(m_IncompleteWire.OutputPort+ODGUI->GetInfo()->NumInputs); | ||||
Fl_DeviceGUI* IDGUI = (Fl_DeviceGUI*)(child(m_IncompleteWire.InputChild)); | |||||
Fl_DeviceGUI* IDGUI = FindDevice(m_IncompleteWire.InputID); | |||||
IDGUI->AddConnection(m_IncompleteWire.InputPort); | IDGUI->AddConnection(m_IncompleteWire.InputPort); | ||||
m_IncompleteWire.Clear(); | m_IncompleteWire.Clear(); | ||||
redraw(); | redraw(); | ||||
@@ -441,14 +423,14 @@ void Fl_Canvas::PortClicked(Fl_DeviceGUI* Device, int Type, int Port, bool Value | |||||
for(vector<CanvasWire>::iterator i=m_WireVec.begin(); | for(vector<CanvasWire>::iterator i=m_WireVec.begin(); | ||||
i!=m_WireVec.end(); i++) | i!=m_WireVec.end(); i++) | ||||
{ | { | ||||
if ((Type==Fl_DeviceGUI::OUTPUT && i->OutputChild==ChildNum && i->OutputPort==Port) || | |||||
(Type==Fl_DeviceGUI::INPUT && i->InputChild==ChildNum && i->InputPort==Port)) | |||||
if ((Type==Fl_DeviceGUI::OUTPUT && i->OutputID==Device->GetID() && i->OutputPort==Port) || | |||||
(Type==Fl_DeviceGUI::INPUT && i->InputID==Device->GetID() && i->InputPort==Port)) | |||||
{ | { | ||||
// Turn off both ports | // Turn off both ports | ||||
Fl_DeviceGUI* ODGUI = (Fl_DeviceGUI*)(child(i->OutputChild)); | |||||
Fl_DeviceGUI* ODGUI = FindDevice(i->OutputID); | |||||
ODGUI->RemoveConnection(i->OutputPort+ODGUI->GetInfo()->NumInputs); | ODGUI->RemoveConnection(i->OutputPort+ODGUI->GetInfo()->NumInputs); | ||||
Fl_DeviceGUI* IDGUI = (Fl_DeviceGUI*)(child(i->InputChild)); | |||||
Fl_DeviceGUI* IDGUI = FindDevice(i->InputID); | |||||
IDGUI->RemoveConnection(i->InputPort); | IDGUI->RemoveConnection(i->InputPort); | ||||
// send the unconnect callback | // send the unconnect callback | ||||
@@ -475,22 +457,6 @@ void Fl_Canvas::PortClicked(Fl_DeviceGUI* Device, int Type, int Port, bool Value | |||||
void Fl_Canvas::ClearConnections(Fl_DeviceGUI* Device) | void Fl_Canvas::ClearConnections(Fl_DeviceGUI* Device) | ||||
{ | { | ||||
// find out which child this comes from. | |||||
int ChildNum=-1; | |||||
for(int n=0; n<children(); n++) | |||||
{ | |||||
if(child(n)==Device) | |||||
{ | |||||
ChildNum=n; | |||||
} | |||||
} | |||||
if (ChildNum==-1) | |||||
{ | |||||
SpiralInfo::Alert("Clear connections callback can't find source child."); | |||||
return; | |||||
} | |||||
bool removedall=false; | bool removedall=false; | ||||
while (!removedall) | while (!removedall) | ||||
@@ -500,13 +466,12 @@ void Fl_Canvas::ClearConnections(Fl_DeviceGUI* Device) | |||||
for (vector<CanvasWire>::iterator i=m_WireVec.begin(); | for (vector<CanvasWire>::iterator i=m_WireVec.begin(); | ||||
i!=m_WireVec.end(); i++) | i!=m_WireVec.end(); i++) | ||||
{ | { | ||||
if (i->OutputChild==ChildNum || | |||||
i->InputChild==ChildNum) | |||||
if (i->OutputID==Device->GetID() || | |||||
i->InputID==Device->GetID()) | |||||
{ | { | ||||
// Turn off both ports | // Turn off both ports | ||||
((Fl_DeviceGUI*)(child(i->OutputChild)))->RemoveConnection(i->OutputPort+ | |||||
((Fl_DeviceGUI*)(child(i->OutputChild)))->GetInfo()->NumInputs); | |||||
((Fl_DeviceGUI*)(child(i->InputChild)))->RemoveConnection(i->InputPort); | |||||
FindDevice(i->OutputID)->RemoveConnection(i->OutputPort+FindDevice(i->OutputID)->GetInfo()->NumInputs); | |||||
FindDevice(i->InputID)->RemoveConnection(i->InputPort); | |||||
// send the unconnect callback | // send the unconnect callback | ||||
cb_Unconnect(this,(void*)&(*i)); | cb_Unconnect(this,(void*)&(*i)); | ||||
@@ -524,32 +489,8 @@ void Fl_Canvas::ClearConnections(Fl_DeviceGUI* Device) | |||||
void Fl_Canvas::RemoveDevice(Fl_DeviceGUI* Device) | void Fl_Canvas::RemoveDevice(Fl_DeviceGUI* Device) | ||||
{ | { | ||||
// find out which child this comes from. | |||||
int ChildNum=-1; | |||||
for(int n=0; n<children(); n++) | |||||
{ | |||||
if(child(n)==Device) | |||||
{ | |||||
ChildNum=n; | |||||
} | |||||
} | |||||
if (ChildNum==-1) | |||||
{ | |||||
SpiralInfo::Alert("Remove device callback can't find source child."); | |||||
return; | |||||
} | |||||
ClearConnections(Device); | ClearConnections(Device); | ||||
for (vector<CanvasWire>::iterator i=m_WireVec.begin(); | |||||
i!=m_WireVec.end(); i++) | |||||
{ | |||||
if (i->OutputChild>ChildNum) i->OutputChild--; | |||||
if (i->InputChild>ChildNum) i->InputChild--; | |||||
} | |||||
remove(child(ChildNum)); | |||||
remove(Device); | |||||
redraw(); | redraw(); | ||||
} | } | ||||
@@ -579,7 +520,82 @@ void Fl_Canvas::Rename(Fl_DeviceGUI* Device) | |||||
} | } | ||||
//////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////// | ||||
Fl_DeviceGUI *Fl_Canvas::FindDevice(int ID) | |||||
{ | |||||
for(int n=0; n<children(); n++) | |||||
{ | |||||
if(((Fl_DeviceGUI*)child(n))->GetID()==ID) | |||||
{ | |||||
return (Fl_DeviceGUI*)child(n); | |||||
} | |||||
} | |||||
return NULL; | |||||
} | |||||
///////////////////////////////////////////////////////////////////////// | |||||
void Fl_Canvas::ToTop(Fl_DeviceGUI *o) | |||||
{ | |||||
if (children()<2) return; //no need to do anything | |||||
// cast away the const :P | |||||
Fl_Widget** a=(Fl_Widget**)array(); | |||||
int p=find(o); | |||||
if (p<0) | |||||
{ | |||||
cerr<<"ToTop couldn't find widget!"<<endl; | |||||
return; | |||||
} | |||||
Fl_Widget *temp=a[0]; | |||||
Fl_Widget *last=a[0]; | |||||
for(int n=1; n<children(); n++) | |||||
{ | |||||
if (n>p) // after the widget in the list | |||||
{ | |||||
// move the widgets up | |||||
a[n-1]=a[n]; | |||||
} | |||||
} | |||||
a[children()-1]=o; // put the raised one at the top of the list | |||||
} | |||||
void Fl_Canvas::ToBot(Fl_DeviceGUI *o) | |||||
{ | |||||
if (children()<2) return; //no need to do anything | |||||
// cast away the const :P | |||||
Fl_Widget** a=(Fl_Widget**)array(); | |||||
int p=find(o); | |||||
if (p<0) | |||||
{ | |||||
cerr<<"ToBot couldn't find widget!"<<endl; | |||||
return; | |||||
} | |||||
Fl_Widget *temp=a[0]; | |||||
Fl_Widget *last=a[0]; | |||||
for(int n=1; n<children(); n++) | |||||
{ | |||||
if (n<=p) // before the widget in the list | |||||
{ | |||||
// move the widgets down | |||||
temp=a[n]; | |||||
a[n]=last; | |||||
last=temp; | |||||
} | |||||
} | |||||
a[0]=o; // put the lowered one at the top of the list | |||||
} | |||||
///////////////////////////////////////////////////////////////////////// | |||||
istream &operator>>(istream &s, Fl_Canvas &o) | istream &operator>>(istream &s, Fl_Canvas &o) | ||||
{ | { | ||||
@@ -596,20 +612,21 @@ istream &operator>>(istream &s, Fl_Canvas &o) | |||||
for(int n=0; n<NumWires; n++) | for(int n=0; n<NumWires; n++) | ||||
{ | { | ||||
CanvasWire NewWire; | CanvasWire NewWire; | ||||
int dummy; | |||||
s>>NewWire.OutputID; | s>>NewWire.OutputID; | ||||
s>>NewWire.OutputChild; | |||||
s>>dummy; | |||||
s>>NewWire.OutputPort; | s>>NewWire.OutputPort; | ||||
s>>NewWire.OutputTerminal; | s>>NewWire.OutputTerminal; | ||||
s>>NewWire.InputID; | s>>NewWire.InputID; | ||||
s>>NewWire.InputChild; | |||||
s>>dummy; | |||||
s>>NewWire.InputPort; | s>>NewWire.InputPort; | ||||
s>>NewWire.InputTerminal; | s>>NewWire.InputTerminal; | ||||
// if we can turn on both ports | // if we can turn on both ports | ||||
if (((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)) | |||||
if (o.FindDevice(NewWire.OutputID)->AddConnection(NewWire.OutputPort+ | |||||
o.FindDevice(NewWire.OutputID)->GetInfo()->NumInputs) && | |||||
o.FindDevice(NewWire.InputID)->AddConnection(NewWire.InputPort)) | |||||
{ | { | ||||
o.m_WireVec.push_back(NewWire); | o.m_WireVec.push_back(NewWire); | ||||
@@ -625,18 +642,19 @@ istream &operator>>(istream &s, Fl_Canvas &o) | |||||
for(int n=0; n<NumWires; n++) | for(int n=0; n<NumWires; n++) | ||||
{ | { | ||||
CanvasWire NewWire; | CanvasWire NewWire; | ||||
int dummy; | |||||
s>>NewWire.OutputID; | s>>NewWire.OutputID; | ||||
s>>NewWire.OutputChild; | |||||
s>>dummy; | |||||
s>>NewWire.OutputPort; | s>>NewWire.OutputPort; | ||||
s>>NewWire.InputID; | s>>NewWire.InputID; | ||||
s>>NewWire.InputChild; | |||||
s>>dummy; | |||||
s>>NewWire.InputPort; | s>>NewWire.InputPort; | ||||
// if we can turn on both ports | // if we can turn on both ports | ||||
if (((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)) | |||||
if (o.FindDevice(NewWire.OutputID)->AddConnection(NewWire.OutputPort+ | |||||
o.FindDevice(NewWire.OutputID)->GetInfo()->NumInputs) && | |||||
o.FindDevice(NewWire.InputID)->AddConnection(NewWire.InputPort)) | |||||
{ | { | ||||
o.m_WireVec.push_back(NewWire); | o.m_WireVec.push_back(NewWire); | ||||
@@ -662,11 +680,11 @@ ostream &operator<<(ostream &s, Fl_Canvas &o) | |||||
i!=o.m_WireVec.end(); i++) | i!=o.m_WireVec.end(); i++) | ||||
{ | { | ||||
s<<i->OutputID<<" "; | s<<i->OutputID<<" "; | ||||
s<<i->OutputChild<<" "; | |||||
s<<0<<" "; | |||||
s<<i->OutputPort<<" "; | s<<i->OutputPort<<" "; | ||||
s<<i->OutputTerminal<<" "; | s<<i->OutputTerminal<<" "; | ||||
s<<i->InputID<<" "; | s<<i->InputID<<" "; | ||||
s<<i->InputChild<<" "; | |||||
s<<0<<" "; | |||||
s<<i->InputPort<<" "; | s<<i->InputPort<<" "; | ||||
s<<i->InputTerminal<<endl; | s<<i->InputTerminal<<endl; | ||||
} | } | ||||
@@ -37,11 +37,9 @@ public: | |||||
void Clear() | void Clear() | ||||
{ | { | ||||
OutputChild=-1; | |||||
OutputPort=-1; | OutputPort=-1; | ||||
OutputID=-1; | OutputID=-1; | ||||
OutputTerminal=false; | OutputTerminal=false; | ||||
InputChild=-1; | |||||
InputPort=-1; | InputPort=-1; | ||||
InputID=-1; | InputID=-1; | ||||
InputTerminal=false; | InputTerminal=false; | ||||
@@ -49,11 +47,9 @@ public: | |||||
} | } | ||||
int OutputID; | int OutputID; | ||||
int OutputChild; | |||||
int OutputPort; | int OutputPort; | ||||
bool OutputTerminal; | bool OutputTerminal; | ||||
int InputID; | int InputID; | ||||
int InputChild; | |||||
int InputPort; | int InputPort; | ||||
bool InputTerminal; | bool InputTerminal; | ||||
bool DelMe; | bool DelMe; | ||||
@@ -84,13 +80,17 @@ public: | |||||
void Poll(); | void Poll(); | ||||
void ToTop(Fl_DeviceGUI *o); | |||||
void ToBot(Fl_DeviceGUI *o); | |||||
private: | private: | ||||
void DrawWires(); | void DrawWires(); | ||||
void ClearIncompleteWire(); | void ClearIncompleteWire(); | ||||
void DrawIncompleteWire(); | void DrawIncompleteWire(); | ||||
bool UserMakingConnection(); | bool UserMakingConnection(); | ||||
Fl_DeviceGUI *FindDevice(int ID); | |||||
Fl_Image *m_BG; | Fl_Image *m_BG; | ||||
char *m_BGData; | char *m_BGData; | ||||
@@ -108,6 +108,7 @@ private: | |||||
GraphSort m_Graph; | GraphSort m_Graph; | ||||
int m_UpdateTimer; | int m_UpdateTimer; | ||||
int m_DragX,m_DragY; | |||||
friend istream &operator>>(istream &s, Fl_Canvas &o); | friend istream &operator>>(istream &s, Fl_Canvas &o); | ||||
friend ostream &operator<<(ostream &s, Fl_Canvas &o); | friend ostream &operator<<(ostream &s, Fl_Canvas &o); | ||||
@@ -135,7 +135,7 @@ int Fl_DeviceGUI::handle(int event) | |||||
m_IconButton->show(); | m_IconButton->show(); | ||||
} | } | ||||
return t; | |||||
return 1; | |||||
} | } | ||||
void Fl_DeviceGUI::Minimise() | void Fl_DeviceGUI::Minimise() | ||||
@@ -159,6 +159,7 @@ void Fl_DeviceGUI::Maximise() | |||||
m_PluginWindow->show(); | m_PluginWindow->show(); | ||||
m_IconButton->hide(); | m_IconButton->hide(); | ||||
((Fl_Canvas*)parent())->ToTop(this); | |||||
} | } | ||||
void Fl_DeviceGUI::Resize(int width, int height) | void Fl_DeviceGUI::Resize(int width, int height) | ||||
@@ -173,7 +174,11 @@ void Fl_DeviceGUI::Resize(int width, int height) | |||||
m_PortVec[n]->position(x()+width-8,m_PortVec[n]->y()); | m_PortVec[n]->position(x()+width-8,m_PortVec[n]->y()); | ||||
} | } | ||||
position(x()+(oldw-w())/2,y()+(oldh-h())/2); | |||||
position(x()+(oldw-w())/2,y()+(oldh-h())/2); | |||||
int Centx=x()+w()/2; | |||||
int Centy=y()+h()/2; | |||||
m_IconButton->position(Centx-m_Icon->w()/2,Centy-m_Icon->h()/2); | |||||
} | } | ||||
void Fl_DeviceGUI::Setup(const DeviceGUIInfo& Info, bool FirstTime) | void Fl_DeviceGUI::Setup(const DeviceGUIInfo& Info, bool FirstTime) | ||||
@@ -26,6 +26,7 @@ bool Pawfal_Input(const char *a, const char *b, char *out) | |||||
strcpy(out,pi.getText()); | strcpy(out,pi.getText()); | ||||
return true; | return true; | ||||
} | } | ||||
return false; | return false; | ||||
} | } | ||||
@@ -111,22 +111,22 @@ static char * SpiralIcon_xpm[] = { | |||||
"). c #2D2F00", | "). c #2D2F00", | ||||
"!. c #111200", | "!. c #111200", | ||||
"~. c #0B0C00", | "~. c #0B0C00", | ||||
"{. c #FFF200", | |||||
"]. c #727175", | |||||
"^. c #FEFEFF", | |||||
"/. c #9D99AA", | |||||
"(. c #DBD9E0", | |||||
"_. c #E9E9E9", | |||||
":. c #CBCBCB", | |||||
"<. c #E0E0E0", | |||||
"[. c #6C6C6C", | |||||
"}. c #050500", | |||||
"|. c #515151", | |||||
"1. c #A6A6A7", | |||||
"2. c #827E93", | |||||
"3. c #615C77", | |||||
"4. c #EAEAED", | |||||
"5. c #DFDFE1", | |||||
"{. c #727175", | |||||
"]. c #FEFEFF", | |||||
"^. c #9D99AA", | |||||
"/. c #DBD9E0", | |||||
"(. c #E9E9E9", | |||||
"_. c #CBCBCB", | |||||
":. c #E0E0E0", | |||||
"<. c #6C6C6C", | |||||
"[. c #050500", | |||||
"}. c #515151", | |||||
"|. c #A6A6A7", | |||||
"1. c #827E93", | |||||
"2. c #615C77", | |||||
"3. c #EAEAED", | |||||
"4. c #DFDFE1", | |||||
"5. c #FFF200", | |||||
"6. c #1E1D24", | "6. c #1E1D24", | ||||
"7. c #9894A7", | "7. c #9894A7", | ||||
"8. c #B1AEBB", | "8. c #B1AEBB", | ||||
@@ -287,18 +287,18 @@ static char * SpiralIcon_xpm[] = { | |||||
" t u ; v w 6 6 x y z A B 6 C ; D E 6 F G ; H ", | " 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 ", | " 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 +.@.#.$.%.&.*.=.-.;. ", | " X Y ; ; ; ; Z ` .6 ..6 6 6 6 6 +.@.#.$.%.&.*.=.-.;. ", | ||||
" >.; ; ; ; ; ; = ,.'.).!.~.6 {.{.6 6 6 6 E ].^.; ; /. ", | |||||
" (.; ; _.R h :.<.[.6 }.6 6 6 {.{.6 6 6 6 6 E |.1.4 2. ", | |||||
" 3.4.; 5...6 6 6 6 6 6 6 6 6 6 {.{.6 6 6 6 6 6 6 6.7. ", | |||||
" V @ 8.9.0.6 6 6 6 6 6 6 6 6 6 {.{.6 6 6 6 6 6 6 ", | |||||
" a.b.c.6 d.6 6 6 6 6 6 6 {.{.6 {.{.6 6 6 6 6 6 e. ", | |||||
" f.; ; g.h.h.i.j.h.6 6 6 6 {.6 6 6 {.{.6 6 6 6 6 6 ", | |||||
" k.; ; l.m.; ; ; n.6 {.{.{.6 6 6 6 6 {.{.{.{.{.6 6 ", | |||||
" o.; ; ; ; p.; ; q.6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 r., ", | |||||
" s.; ; p.; : t.u.v.6 6 6 {.6 {.6 {.6 {.{.{.6 6 6 6 p.w.x. ", | |||||
" y.; ; ; z.A.B.6 6 6 6 {.6 6 {.6 {.6 {.6 6 6 6 6 6 ; ; C.D. ", | |||||
" E.J ; : F.6 6 6 6 G...6 {.6 {.6 {.6 {.{.{.6 6 6 H.I.; ; J.K. ", | |||||
" L.; ; M.6 E 6 N.O.P.{.6 6 6 {.6 6 {.6 Q.6 6 6 6 R.S.; ; > K. ", | |||||
" >.; ; ; ; ; ; = ,.'.).!.~.6 6 6 6 6 6 6 E {.].; ; ^. ", | |||||
" /.; ; (.R h _.:.<.6 [.6 6 6 6 6 6 6 6 6 6 E }.|.4 1. ", | |||||
" 2.3.; 4...6 6 6 6 6 6 6 6 6 5.5.6 6 6 6 6 6 6 6 6.7. ", | |||||
" V @ 8.9.0.6 6 6 6 6 6 6 6 5.6 6 5.6 6 6 6 6 6 6 ", | |||||
" a.b.c.6 d.6 6 6 6 5.5.5.6 6 6 5.6 6 6 6 6 6 6 e. ", | |||||
" f.; ; g.h.h.i.j.h.6 6 6 6 6 6 6 6 5.6 6 6 6 6 6 6 ", | |||||
" k.; ; l.m.; ; ; n.6 6 6 6 6 6 6 6 5.6 6 6 6 6 6 6 ", | |||||
" o.; ; ; ; p.; ; q.6 6 6 6 6 6 6 6 5.6 6 6 6 6 6 6 r., ", | |||||
" s.; ; p.; : t.u.v.6 6 6 6 6 6 6 6 6 5.6 6 6 6 6 6 p.w.x. ", | |||||
" y.; ; ; z.A.B.6 6 6 6 6 6 6 6 6 6 6 5.5.6 6 6 6 6 ; ; C.D. ", | |||||
" E.J ; : F.6 6 6 6 G...6 6 6 6 6 6 6 6 5.5.5.6 6 H.I.; ; J.K. ", | |||||
" L.; ; M.6 E 6 N.O.P.6 6 6 6 6 6 6 6 6 Q.6 6 6 6 R.S.; ; > K. ", | |||||
" T.; U.V.W.6 6 P.p.; X.Y.6 6 6 6 6 6 6 6 Z.`.6 6 6 +.+; ; ++@+ ", | " T.; U.V.W.6 6 P.p.; X.Y.6 6 6 6 6 6 6 6 Z.`.6 6 6 +.+; ; ++@+ ", | ||||
" K.#+! $+%+&+x ; ; *+=+-+;+l >+6 6 6 ,+'+)+!+6 6 6 ~+{+]+; ; ^+@ ", | " K.#+! $+%+&+x ; ; *+=+-+;+l >+6 6 6 ,+'+)+!+6 6 6 ~+{+]+; ; ^+@ ", | ||||
" /+(+_+:+<+[+; }+|+1+; I.>+6 6 E 2+; ; 3+6 6 E 6 o 4+; ; = 5+ ", | " /+(+_+:+<+[+; }+|+1+; I.>+6 6 E 2+; ; 3+6 6 E 6 o 4+; ; = 5+ ", | ||||
@@ -111,27 +111,27 @@ static char * SpiralIcon_xpm[] = { | |||||
"). c #2D2F00", | "). c #2D2F00", | ||||
"!. c #111200", | "!. c #111200", | ||||
"~. c #0B0C00", | "~. c #0B0C00", | ||||
"{. c #FFF200", | |||||
"]. c #727175", | |||||
"^. c #FEFEFF", | |||||
"/. c #9D99AA", | |||||
"(. c #DBD9E0", | |||||
"_. c #E9E9E9", | |||||
":. c #CBCBCB", | |||||
"<. c #E0E0E0", | |||||
"[. c #6C6C6C", | |||||
"}. c #050500", | |||||
"|. c #515151", | |||||
"1. c #A6A6A7", | |||||
"2. c #827E93", | |||||
"3. c #615C77", | |||||
"4. c #EAEAED", | |||||
"5. c #DFDFE1", | |||||
"6. c #1E1D24", | |||||
"7. c #9894A7", | |||||
"8. c #B1AEBB", | |||||
"9. c #69686F", | |||||
"0. c #000001", | |||||
"{. c #727175", | |||||
"]. c #FEFEFF", | |||||
"^. c #9D99AA", | |||||
"/. c #DBD9E0", | |||||
"(. c #E9E9E9", | |||||
"_. c #CBCBCB", | |||||
":. c #E0E0E0", | |||||
"<. c #6C6C6C", | |||||
"[. c #050500", | |||||
"}. c #515151", | |||||
"|. c #A6A6A7", | |||||
"1. c #827E93", | |||||
"2. c #615C77", | |||||
"3. c #EAEAED", | |||||
"4. c #DFDFE1", | |||||
"5. c #1E1D24", | |||||
"6. c #9894A7", | |||||
"7. c #B1AEBB", | |||||
"8. c #69686F", | |||||
"9. c #000001", | |||||
"0. c #FFF200", | |||||
"a. c #615C76", | "a. c #615C76", | ||||
"b. c #5F5A75", | "b. c #5F5A75", | ||||
"c. c #413E4D", | "c. c #413E4D", | ||||
@@ -287,18 +287,18 @@ static char * SpiralIcon_xpm[] = { | |||||
" t u ; v w 6 6 x y z A B 6 C ; D E 6 F G ; H ", | " 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 ", | " 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 +.@.#.$.%.&.*.=.-.;. ", | " X Y ; ; ; ; Z ` .6 ..6 6 6 6 6 +.@.#.$.%.&.*.=.-.;. ", | ||||
" >.; ; ; ; ; ; = ,.'.).!.~.6 {.{.6 6 6 6 E ].^.; ; /. ", | |||||
" (.; ; _.R h :.<.[.6 }.6 6 6 {.{.6 6 6 6 6 E |.1.4 2. ", | |||||
" 3.4.; 5...6 6 6 6 6 6 6 6 6 6 {.{.6 6 6 6 6 6 6 6.7. ", | |||||
" V @ 8.9.0.6 6 6 6 6 6 6 6 6 6 {.{.6 6 6 6 6 6 6 ", | |||||
" a.b.c.6 d.6 6 6 6 6 6 6 {.{.6 {.{.6 6 6 6 6 6 e. ", | |||||
" f.; ; g.h.h.i.j.h.6 6 6 6 {.6 6 6 {.{.6 6 6 6 6 6 ", | |||||
" k.; ; l.m.; ; ; n.6 {.{.{.6 6 6 6 6 {.{.{.{.{.6 6 ", | |||||
" o.; ; ; ; p.; ; q.6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 r., ", | |||||
" s.; ; p.; : t.u.v.6 6 6 {.6 {.6 {.6 {.{.{.6 6 6 6 p.w.x. ", | |||||
" y.; ; ; z.A.B.6 6 6 6 {.6 6 {.6 {.6 {.6 6 6 6 6 6 ; ; C.D. ", | |||||
" E.J ; : F.6 6 6 6 G...6 {.6 {.6 {.6 {.{.{.6 6 6 H.I.; ; J.K. ", | |||||
" L.; ; M.6 E 6 N.O.P.{.6 6 6 {.6 6 {.6 Q.6 6 6 6 R.S.; ; > K. ", | |||||
" >.; ; ; ; ; ; = ,.'.).!.~.6 6 6 6 6 6 6 E {.].; ; ^. ", | |||||
" /.; ; (.R h _.:.<.6 [.6 6 6 6 6 6 6 6 6 6 E }.|.4 1. ", | |||||
" 2.3.; 4...6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5.6. ", | |||||
" V @ 7.8.9.6 6 6 6 6 6 6 0.0.0.6 6 0.0.0.6 6 6 6 ", | |||||
" a.b.c.6 d.6 6 6 6 0.0.6 6 6 0.0.6 6 6 0.0.6 6 e. ", | |||||
" f.; ; g.h.h.i.j.h.0.6 6 6 6 6 6 6 6 6 6 6 6 0.6 6 ", | |||||
" k.; ; l.m.; ; ; n.6 0.6 6 6 6 6 6 6 6 6 6 0.6 6 6 ", | |||||
" o.; ; ; ; p.; ; q.6 6 0.0.6 6 6 6 6 6 0.0.6 6 6 6 r., ", | |||||
" s.; ; p.; : t.u.v.6 6 6 6 0.0.0.0.0.0.6 6 6 6 6 6 p.w.x. ", | |||||
" y.; ; ; z.A.B.6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ; ; C.D. ", | |||||
" E.J ; : F.6 6 6 6 G...6 6 6 6 6 6 6 6 6 6 6 6 6 H.I.; ; J.K. ", | |||||
" L.; ; M.6 E 6 N.O.P.6 6 6 6 6 6 6 6 6 Q.6 6 6 6 R.S.; ; > K. ", | |||||
" T.; U.V.W.6 6 P.p.; X.Y.6 6 6 6 6 6 6 6 Z.`.6 6 6 +.+; ; ++@+ ", | " T.; U.V.W.6 6 P.p.; X.Y.6 6 6 6 6 6 6 6 Z.`.6 6 6 +.+; ; ++@+ ", | ||||
" K.#+! $+%+&+x ; ; *+=+-+;+l >+6 6 6 ,+'+)+!+6 6 6 ~+{+]+; ; ^+@ ", | " K.#+! $+%+&+x ; ; *+=+-+;+l >+6 6 6 ,+'+)+!+6 6 6 ~+{+]+; ; ^+@ ", | ||||
" /+(+_+:+<+[+; }+|+1+; I.>+6 6 E 2+; ; 3+6 6 E 6 o 4+; ; = 5+ ", | " /+(+_+:+<+[+; }+|+1+; I.>+6 6 E 2+; ; 3+6 6 E 6 o 4+; ; = 5+ ", | ||||
@@ -55,6 +55,7 @@ m_Loop(true), | |||||
m_NoteCut(false), | m_NoteCut(false), | ||||
m_Current(0), | m_Current(0), | ||||
m_GUICurrent(0), | m_GUICurrent(0), | ||||
m_CurPatSeq(0), | |||||
m_CurrentNoteCV(0), | m_CurrentNoteCV(0), | ||||
m_CurrentTriggerCV(0), | m_CurrentTriggerCV(0), | ||||
m_Triggered(false), | m_Triggered(false), | ||||
@@ -63,10 +64,10 @@ m_CopyPattern(0), | |||||
m_PatAdvance(false), | m_PatAdvance(false), | ||||
m_PatReset(false) | m_PatReset(false) | ||||
{ | { | ||||
m_Version=3; | |||||
m_Version=4; | |||||
m_PluginInfo.Name="Matrix"; | m_PluginInfo.Name="Matrix"; | ||||
m_PluginInfo.Width=560; | |||||
m_PluginInfo.Width=600; | |||||
m_PluginInfo.Height=270; | m_PluginInfo.Height=270; | ||||
m_PluginInfo.NumInputs=5; | m_PluginInfo.NumInputs=5; | ||||
m_PluginInfo.NumOutputs=19; | m_PluginInfo.NumOutputs=19; | ||||
@@ -113,6 +114,11 @@ m_PatReset(false) | |||||
m_TriggerLevel[n]=0; | m_TriggerLevel[n]=0; | ||||
} | } | ||||
for (int n=0; n<NUM_PATSEQ; n++) | |||||
{ | |||||
m_PatSeq[n]=0; | |||||
} | |||||
m_AudioCH->Register("NoteCut",&m_NoteCut,ChannelHandler::INPUT); | m_AudioCH->Register("NoteCut",&m_NoteCut,ChannelHandler::INPUT); | ||||
m_AudioCH->Register("Volume",&m_GUIArgs.Volume,ChannelHandler::INPUT); | m_AudioCH->Register("Volume",&m_GUIArgs.Volume,ChannelHandler::INPUT); | ||||
m_AudioCH->Register("Current",&m_GUICurrent,ChannelHandler::INPUT); | m_AudioCH->Register("Current",&m_GUICurrent,ChannelHandler::INPUT); | ||||
@@ -124,6 +130,7 @@ m_PatReset(false) | |||||
m_AudioCH->Register("Y",&m_GUIArgs.Y,ChannelHandler::INPUT); | m_AudioCH->Register("Y",&m_GUIArgs.Y,ChannelHandler::INPUT); | ||||
m_AudioCH->Register("Octave",&m_GUIArgs.Octave,ChannelHandler::INPUT); | m_AudioCH->Register("Octave",&m_GUIArgs.Octave,ChannelHandler::INPUT); | ||||
m_AudioCH->Register("Step",&m_Step,ChannelHandler::OUTPUT); | m_AudioCH->Register("Step",&m_Step,ChannelHandler::OUTPUT); | ||||
m_AudioCH->Register("PatSeqStep",&m_CurPatSeq,ChannelHandler::OUTPUT); | |||||
m_AudioCH->RegisterData("Matrix",ChannelHandler::OUTPUT_REQUEST,&m_Matrix,sizeof(m_Matrix)); | m_AudioCH->RegisterData("Matrix",ChannelHandler::OUTPUT_REQUEST,&m_Matrix,sizeof(m_Matrix)); | ||||
} | } | ||||
@@ -220,42 +227,12 @@ void MatrixPlugin::Execute() | |||||
{ | { | ||||
m_Step=-1; | m_Step=-1; | ||||
ExternalClockTriggered=true; | ExternalClockTriggered=true; | ||||
m_CurPatSeq++; | |||||
if (m_PatSeq[m_CurPatSeq]==-1 || m_CurPatSeq==NUM_PATSEQ) m_CurPatSeq=0; | |||||
m_Current=m_PatSeq[m_CurPatSeq]; | |||||
} | } | ||||
} | } | ||||
/* not yet... | |||||
// external pattern advance | |||||
if (GetInput(5,n)>0) | |||||
{ | |||||
if (!m_PatAdvance) | |||||
{ | |||||
m_Current++; | |||||
if (m_Current==16) m_Current=0; | |||||
m_PatAdvance=true; | |||||
m_Step=-1; | |||||
ExternalClockTriggered=true; | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
m_PatAdvance=false; | |||||
} | |||||
// external pattern reset | |||||
if (GetInput(6,n)>0) | |||||
{ | |||||
if (!m_PatReset) | |||||
{ | |||||
m_Current=0; | |||||
m_PatReset=true; | |||||
m_Step=-1; | |||||
ExternalClockTriggered=true; | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
m_PatReset=false; | |||||
} | |||||
*/ | |||||
// An external clock pulse overrides the internal timing | // An external clock pulse overrides the internal timing | ||||
if ((!ExternalClock && m_Time>=m_StepTime*(1/m_Matrix[m_Current].Speed)) || | if ((!ExternalClock && m_Time>=m_StepTime*(1/m_Matrix[m_Current].Speed)) || | ||||
(ExternalClock && ExternalClockTriggered)) | (ExternalClock && ExternalClockTriggered)) | ||||
@@ -263,11 +240,13 @@ void MatrixPlugin::Execute() | |||||
m_Time=0; | m_Time=0; | ||||
m_Step++; | m_Step++; | ||||
if (m_Step >= m_Matrix[m_Current].Length) | if (m_Step >= m_Matrix[m_Current].Length) | ||||
{ | { | ||||
SetOutput(18, n, 1); | SetOutput(18, n, 1); | ||||
m_Step=0; | m_Step=0; | ||||
m_CurPatSeq++; | |||||
if (m_PatSeq[m_CurPatSeq]==-1 || m_CurPatSeq==NUM_PATSEQ) m_CurPatSeq=0; | |||||
m_Current=m_PatSeq[m_CurPatSeq]; | |||||
} | } | ||||
// Reset the values | // Reset the values | ||||
@@ -284,7 +263,6 @@ void MatrixPlugin::Execute() | |||||
{ | { | ||||
if (m_Matrix[m_Current].Matrix[m_Step][i]) | if (m_Matrix[m_Current].Matrix[m_Step][i]) | ||||
{ | { | ||||
m_CurrentNoteCV=NoteTable[i+m_Matrix[m_Current].Octave*12]; | m_CurrentNoteCV=NoteTable[i+m_Matrix[m_Current].Octave*12]; | ||||
m_CurrentTriggerCV=m_Matrix[m_Current].Volume[m_Step][i]; | m_CurrentTriggerCV=m_Matrix[m_Current].Volume[m_Step][i]; | ||||
m_TriggerLevel[i]=m_Matrix[m_Current].Volume[m_Step][i]; | m_TriggerLevel[i]=m_Matrix[m_Current].Volume[m_Step][i]; | ||||
@@ -344,6 +322,9 @@ void MatrixPlugin::ExecuteCommands() | |||||
case SET_CURRENT : | case SET_CURRENT : | ||||
m_Current=m_GUIArgs.Num; | m_Current=m_GUIArgs.Num; | ||||
break; | break; | ||||
case SET_PATSEQ : | |||||
m_PatSeq[m_GUIArgs.Y]=m_GUIArgs.Num; | |||||
break; | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -425,6 +406,12 @@ void MatrixPlugin::StreamOut(ostream &s) | |||||
} | } | ||||
s<<"-1 "; | s<<"-1 "; | ||||
} | } | ||||
s<<endl; | |||||
for (int n=0; n<NUM_PATSEQ; n++) | |||||
{ | |||||
s<<m_PatSeq[n]<<" "; | |||||
} | |||||
} | } | ||||
void MatrixPlugin::StreamIn(istream &s) | void MatrixPlugin::StreamIn(istream &s) | ||||
@@ -472,6 +459,7 @@ void MatrixPlugin::StreamIn(istream &s) | |||||
} break; | } break; | ||||
case 3: | case 3: | ||||
case 4: | |||||
{ | { | ||||
s>>m_Current>>m_Time>>m_Step>>m_Loop>>m_NoteCut; | s>>m_Current>>m_Time>>m_Step>>m_Loop>>m_NoteCut; | ||||
@@ -495,6 +483,15 @@ void MatrixPlugin::StreamIn(istream &s) | |||||
} | } | ||||
} | } | ||||
} | } | ||||
if (version>3) | |||||
{ | |||||
for (int n=0; n<NUM_PATSEQ; n++) | |||||
{ | |||||
s>>m_PatSeq[n]; | |||||
} | |||||
} | |||||
} break; | } break; | ||||
} | } | ||||
} | } |
@@ -25,6 +25,7 @@ | |||||
static const int MATX = 64; | static const int MATX = 64; | ||||
static const int MATY = 32; | static const int MATY = 32; | ||||
static const int NUM_PATTERNS = 16; | static const int NUM_PATTERNS = 16; | ||||
static const int NUM_PATSEQ = 16; | |||||
struct Pattern | struct Pattern | ||||
{ | { | ||||
@@ -52,9 +53,11 @@ public: | |||||
int GetCurrent() { return m_Current; } | int GetCurrent() { return m_Current; } | ||||
float GetStepTime() { return m_StepTime; } | float GetStepTime() { return m_StepTime; } | ||||
Pattern* GetPattern() { return &m_Matrix[m_Current]; } | Pattern* GetPattern() { return &m_Matrix[m_Current]; } | ||||
int GetPatSeq(int n) { return m_PatSeq[n]; } | |||||
enum GUICommands{NONE,MAT_LENGTH,MAT_SPEED,MAT_ACTIVATE,MAT_DEACTIVATE, | enum GUICommands{NONE,MAT_LENGTH,MAT_SPEED,MAT_ACTIVATE,MAT_DEACTIVATE, | ||||
MAT_OCTAVE,COPY,PASTE,CLEAR,TUP,TDOWN,MAT_VOLUME,SET_CURRENT}; | |||||
MAT_OCTAVE,COPY,PASTE,CLEAR,TUP,TDOWN,MAT_VOLUME, | |||||
SET_CURRENT,SET_PATSEQ}; | |||||
struct GUIArgs | struct GUIArgs | ||||
{ | { | ||||
@@ -89,6 +92,8 @@ private: | |||||
int m_GUICurrent; | int m_GUICurrent; | ||||
Pattern m_Matrix[NUM_PATTERNS]; | Pattern m_Matrix[NUM_PATTERNS]; | ||||
float m_TriggerLevel[MATY]; | float m_TriggerLevel[MATY]; | ||||
int m_PatSeq[NUM_PATSEQ]; | |||||
int m_CurPatSeq; | |||||
float m_CurrentNoteCV; | float m_CurrentNoteCV; | ||||
float m_CurrentTriggerCV; | float m_CurrentTriggerCV; | ||||
@@ -101,7 +101,8 @@ void Fl_MatrixButton::cb_Vol(Fl_Slider* o, void* v) | |||||
MatrixPluginGUI::MatrixPluginGUI(int w, int h,MatrixPlugin *o,ChannelHandler *ch,const HostInfo *Info) : | MatrixPluginGUI::MatrixPluginGUI(int w, int h,MatrixPlugin *o,ChannelHandler *ch,const HostInfo *Info) : | ||||
SpiralPluginGUI(w,h,o,ch), | SpiralPluginGUI(w,h,o,ch), | ||||
m_LastLight(0) | |||||
m_LastLight(0), | |||||
m_LastPatSeqLight(0) | |||||
{ | { | ||||
//size_range(10,10); | //size_range(10,10); | ||||
m_NoteCut = new Fl_Button (5, h-30, 85, 20,"NoteCut"); | m_NoteCut = new Fl_Button (5, h-30, 85, 20,"NoteCut"); | ||||
@@ -236,6 +237,28 @@ m_LastLight(0) | |||||
add(m_Flash[x]); | add(m_Flash[x]); | ||||
} | } | ||||
xoff=560; | |||||
yoff=40; | |||||
int height=12,gap=2; | |||||
Fl_Box *patseqlabel = new Fl_Box(xoff,yoff-15,30,10,"Pat Seq"); | |||||
patseqlabel->labelsize(10); | |||||
add(patseqlabel); | |||||
for(int y=0; y<NUM_PATSEQ; y++) | |||||
{ | |||||
m_PatSeq[y]= new Fl_Counter(xoff,yoff+y*(height+gap),25,height); | |||||
m_PatSeq[y]->type(FL_SIMPLE_COUNTER); | |||||
m_PatSeq[y]->step(1); | |||||
m_PatSeq[y]->textsize(8); | |||||
m_PatSeq[y]->callback((Fl_Callback*)cb_PatSeq,(void*)&Numbers[y]); | |||||
add(m_PatSeq[y]); | |||||
m_PatSeqFlash[y] = new Fl_LED_Button(xoff+25,yoff+y*(height+gap),15,15,""); | |||||
m_PatSeqFlash[y]->selection_color(FL_WHITE); | |||||
add(m_PatSeqFlash[y]); | |||||
} | |||||
end(); | end(); | ||||
} | } | ||||
@@ -247,6 +270,14 @@ void MatrixPluginGUI::Update() | |||||
m_Flash[Light]->value(1); | m_Flash[Light]->value(1); | ||||
m_Flash[m_LastLight]->value(0); | m_Flash[m_LastLight]->value(0); | ||||
m_LastLight=Light; | m_LastLight=Light; | ||||
int PatSeqLight=m_GUICH->GetInt("PatSeqStep"); | |||||
if (PatSeqLight!=m_LastPatSeqLight) | |||||
{ | |||||
m_PatSeqFlash[PatSeqLight]->value(1); | |||||
m_PatSeqFlash[m_LastPatSeqLight]->value(0); | |||||
m_LastPatSeqLight=PatSeqLight; | |||||
} | |||||
} | } | ||||
} | } | ||||
@@ -265,7 +296,12 @@ void MatrixPluginGUI::UpdateValues(SpiralPlugin *o) | |||||
{ | { | ||||
m_Matrix[x][y]->value(Plugin->GetPattern()->Matrix[x][y]); | m_Matrix[x][y]->value(Plugin->GetPattern()->Matrix[x][y]); | ||||
m_Matrix[x][y]->SetVolume(Plugin->GetPattern()->Volume[x][y]); | m_Matrix[x][y]->SetVolume(Plugin->GetPattern()->Volume[x][y]); | ||||
} | |||||
} | |||||
for(int n=0; n<NUM_PATSEQ; n++) | |||||
{ | |||||
m_PatSeq[n]->value(Plugin->GetPatSeq(n)); | |||||
} | |||||
} | } | ||||
void MatrixPluginGUI::UpdateMatrix() | void MatrixPluginGUI::UpdateMatrix() | ||||
@@ -441,6 +477,17 @@ void MatrixPluginGUI::cb_TransDnBtn (Fl_Button* o, void* v) | |||||
((MatrixPluginGUI*)(o->parent())) -> cb_TransDnBtn_i (o, v); | ((MatrixPluginGUI*)(o->parent())) -> cb_TransDnBtn_i (o, v); | ||||
} | } | ||||
inline void MatrixPluginGUI::cb_PatSeq_i(Fl_Counter* o, void* v) | |||||
{ | |||||
if (o->value()<-1) o->value(-1); | |||||
if (o->value()>NUM_PATTERNS-1) o->value(NUM_PATTERNS-1); | |||||
m_GUICH->Set("Num",(int)o->value()); | |||||
m_GUICH->Set("Y",*(int*)v); | |||||
m_GUICH->SetCommand(MatrixPlugin::SET_PATSEQ); | |||||
} | |||||
void MatrixPluginGUI::cb_PatSeq(Fl_Counter* o, void* v) | |||||
{ ((MatrixPluginGUI*)(o->parent()))->cb_PatSeq_i(o,v);} | |||||
const string MatrixPluginGUI::GetHelpText(const string &loc){ | const string MatrixPluginGUI::GetHelpText(const string &loc){ | ||||
return string("") | return string("") | ||||
+ "This is a matrix style step sequencer for techno purists. Great for\n" | + "This is a matrix style step sequencer for techno purists. Great for\n" | ||||
@@ -465,5 +512,10 @@ const string MatrixPluginGUI::GetHelpText(const string &loc){ | |||||
+ "oscillator clock. To allow you to sync these matrixes, the matrix is\n" | + "oscillator clock. To allow you to sync these matrixes, the matrix is\n" | ||||
+ "provided with a Reset Trigger, which when plugged into the Play Trigger\n" | + "provided with a Reset Trigger, which when plugged into the Play Trigger\n" | ||||
+ "of another matrix, will synch the two so they start at the same clock\n" | + "of another matrix, will synch the two so they start at the same clock\n" | ||||
+ "pulse."; | |||||
+ "pulse.\n\n" | |||||
+ "On the right hand side of the matrix you will find the pattern sequencer\n" | |||||
+ "this will advance each time a full pattern is played, and you can use it\n" | |||||
+ "to select which pattern will be played next. There are a maximum of 16\n" | |||||
+ "patterns to the sequence, but you can use less by setting a slot to -1\n" | |||||
+ "this will cause the sequence to loop back to zero"; | |||||
} | } |
@@ -81,6 +81,7 @@ private: | |||||
int Numbers[MATX*MATY]; | int Numbers[MATX*MATY]; | ||||
Pattern m_GUIMatrix[NUM_PATTERNS]; | Pattern m_GUIMatrix[NUM_PATTERNS]; | ||||
int m_LastLight; | int m_LastLight; | ||||
int m_LastPatSeqLight; | |||||
Fl_Button* m_NoteCut; | Fl_Button* m_NoteCut; | ||||
Fl_Counter* m_Pattern; | Fl_Counter* m_Pattern; | ||||
@@ -97,6 +98,9 @@ private: | |||||
Fl_Box* m_TransLbl; | Fl_Box* m_TransLbl; | ||||
Fl_Button* m_TransUpBtn; | Fl_Button* m_TransUpBtn; | ||||
Fl_Button* m_TransDnBtn; | Fl_Button* m_TransDnBtn; | ||||
Fl_Counter* m_PatSeq[NUM_PATSEQ]; | |||||
Fl_LED_Button* m_PatSeqFlash[NUM_PATSEQ]; | |||||
//// Callbacks //// | //// Callbacks //// | ||||
inline void cb_Matrix_i(Fl_Button* o, void* v); | inline void cb_Matrix_i(Fl_Button* o, void* v); | ||||
@@ -127,6 +131,8 @@ private: | |||||
static void cb_TransUpBtn (Fl_Button* o, void* v); | static void cb_TransUpBtn (Fl_Button* o, void* v); | ||||
inline void cb_TransDnBtn_i (Fl_Button* o, void* v); | inline void cb_TransDnBtn_i (Fl_Button* o, void* v); | ||||
static void cb_TransDnBtn (Fl_Button* o, void* v); | static void cb_TransDnBtn (Fl_Button* o, void* v); | ||||
inline void cb_PatSeq_i(Fl_Counter* o, void* v); | |||||
static void cb_PatSeq(Fl_Counter* o, void* v); | |||||
}; | }; | ||||
#endif | #endif |
@@ -69,10 +69,10 @@ SpiralPluginGUI(w,h,o,ch), | |||||
m_Bypass(false) | m_Bypass(false) | ||||
{ | { | ||||
m_Scope = new ScopeWidget(5, 20, 210, 85, "Scope", Info->BUFSIZE); | m_Scope = new ScopeWidget(5, 20, 210, 85, "Scope", Info->BUFSIZE); | ||||
Bypass = new Fl_Button(175, 107, 40, 16, "Bypass"); | |||||
/*Bypass = new Fl_Button(175, 107, 40, 16, "Bypass"); | |||||
Bypass->labelsize(10); | Bypass->labelsize(10); | ||||
Bypass->type(1); | Bypass->type(1); | ||||
Bypass->callback((Fl_Callback*)cb_Bypass); | |||||
Bypass->callback((Fl_Callback*)cb_Bypass);*/ | |||||
end(); | end(); | ||||
} | } | ||||
@@ -62,9 +62,6 @@ m_LoopPoint(0), | |||||
m_Speed(1.0f), | m_Speed(1.0f), | ||||
m_Volume(1.0f), | m_Volume(1.0f), | ||||
m_RecordingSource(NULL), | m_RecordingSource(NULL), | ||||
m_Balance(1.0f), | |||||
m_LeftVol(1.0f), | |||||
m_RightVol(1.0f), | |||||
m_FirstRecord(true), | m_FirstRecord(true), | ||||
m_FixedRecord(false), | m_FixedRecord(false), | ||||
m_RecLength(0), | m_RecLength(0), | ||||
@@ -225,14 +222,30 @@ void SpiralLoopPlugin::ExecuteCommands() | |||||
void SpiralLoopPlugin::StreamOut(ostream &s) | void SpiralLoopPlugin::StreamOut(ostream &s) | ||||
{ | { | ||||
s<<m_Version; | |||||
s<<m_LoopPoint<<" "<<m_Speed<<" "<<m_Volume<<" "<<m_TicksPerLoop<<" "; | |||||
s<<m_TriggerVec.size()<<" "; | |||||
for (vector<TriggerInfo>::iterator i=m_TriggerVec.begin(); | |||||
i!=m_TriggerVec.end(); i++) | |||||
{ | |||||
s<<i->Channel<<" "<<i->Time<<" "; | |||||
} | |||||
} | } | ||||
void SpiralLoopPlugin::StreamIn(istream &s) | void SpiralLoopPlugin::StreamIn(istream &s) | ||||
{ | { | ||||
int version; | int version; | ||||
s>>version; | s>>version; | ||||
s>>m_LoopPoint>>m_Speed>>m_Volume>>m_TicksPerLoop; | |||||
int size; | |||||
s>>size; | |||||
for (int n=0; n<size; n++) | |||||
{ | |||||
TriggerInfo t; | |||||
s>>t.Channel>>t.Time; | |||||
m_TriggerVec.push_back(t); | |||||
} | |||||
} | } | ||||
bool SpiralLoopPlugin::SaveExternalFiles(const string &Dir) | bool SpiralLoopPlugin::SaveExternalFiles(const string &Dir) | ||||
@@ -79,10 +79,8 @@ public: | |||||
void SetRecordingSource(const float *s) { m_RecordingSource=s; } | void SetRecordingSource(const float *s) { m_RecordingSource=s; } | ||||
void Record(bool r) { m_Recording=r; if (!r) EndRecordBuf(); } | void Record(bool r) { m_Recording=r; if (!r) EndRecordBuf(); } | ||||
void DelMe() { m_DelMe=true; } | void DelMe() { m_DelMe=true; } | ||||
void SetBalance(float s) { m_Balance=s; m_LeftVol=(2-s)/2; m_RightVol=(1+s-1.0f)/2;} | |||||
void Trigger() { m_Pos=0; SetPlaying(true); } | void Trigger() { m_Pos=0; SetPlaying(true); } | ||||
const float GetBalance() {return m_Balance;} | |||||
const bool IsPlaying() {return m_Playing;} | const bool IsPlaying() {return m_Playing;} | ||||
const float *GetLoopPtr() {return m_StoreBuffer.GetBuffer();} | const float *GetLoopPtr() {return m_StoreBuffer.GetBuffer();} | ||||
const int GetId() {return m_Id;} | const int GetId() {return m_Id;} | ||||
@@ -91,8 +89,7 @@ public: | |||||
const int GetTotalLength() {assert(m_StoreBuffer.GetLength()==m_DubBuffer.GetLength()); return m_StoreBuffer.GetLength();} | const int GetTotalLength() {assert(m_StoreBuffer.GetLength()==m_DubBuffer.GetLength()); return m_StoreBuffer.GetLength();} | ||||
const bool Delete() {return m_DelMe; } | const bool Delete() {return m_DelMe; } | ||||
const float GetSpeed() {return m_Speed;} | const float GetSpeed() {return m_Speed;} | ||||
const float GetLeftVol() { return m_LeftVol; } | |||||
const float GetRightVol() { return m_RightVol; } | |||||
const float GetVolume() { return m_Volume; } | |||||
const float GetCurrentAngle() { return m_LoopPoint?(m_Pos/m_LoopPoint)*360.0f:0; } | const float GetCurrentAngle() { return m_LoopPoint?(m_Pos/m_LoopPoint)*360.0f:0; } | ||||
const string& GetSampleName() { return m_Sample; } | const string& GetSampleName() { return m_Sample; } | ||||
@@ -106,6 +103,8 @@ public: | |||||
void Halve(); | void Halve(); | ||||
void SelectAll(); | void SelectAll(); | ||||
void Move(int Start); | void Move(int Start); | ||||
Sample *GetStoreBuffer() { return &m_StoreBuffer; } | |||||
private: | private: | ||||
@@ -138,8 +137,6 @@ private: | |||||
Sample m_RecBuffer; | Sample m_RecBuffer; | ||||
Sample m_CopyBuffer; | Sample m_CopyBuffer; | ||||
int m_RecPos; | int m_RecPos; | ||||
float m_Balance; | |||||
float m_LeftVol,m_RightVol; | |||||
bool m_FirstRecord; | bool m_FirstRecord; | ||||
bool m_FixedRecord; | bool m_FixedRecord; | ||||
@@ -223,6 +223,13 @@ SpiralPluginGUI(w,h,o,ch) | |||||
void SpiralLoopPluginGUI::UpdateValues(SpiralPlugin *o) | void SpiralLoopPluginGUI::UpdateValues(SpiralPlugin *o) | ||||
{ | { | ||||
SpiralLoopPlugin *Plugin=(SpiralLoopPlugin *)o; | |||||
m_SampleSize=Plugin->GetStoreBuffer()->GetLength(); | |||||
m_LoopGUI->SetData((float*)Plugin->GetStoreBuffer()->GetBuffer(),m_SampleSize); | |||||
m_Volume->value(Plugin->GetVolume()); | |||||
m_Speed->value(Plugin->GetSpeed()); | |||||
m_Length->value(Plugin->GetLoopLength()/m_SampleSize); | |||||
} | } | ||||
void SpiralLoopPluginGUI::Update() | void SpiralLoopPluginGUI::Update() | ||||
@@ -79,13 +79,13 @@ inline void SpiralPluginGUI::cb_Help_i(Fl_Button* o, void* v) | |||||
{ | { | ||||
if (m_HelpWin==NULL) | if (m_HelpWin==NULL) | ||||
{ | { | ||||
int w=330,h=200; | |||||
int w=450,h=200; | |||||
m_HelpWin = new Fl_Double_Window(w,h,"Help"); | m_HelpWin = new Fl_Double_Window(w,h,"Help"); | ||||
Fl_Text_Display* text = new Fl_Text_Display(0,0,10,10); | Fl_Text_Display* text = new Fl_Text_Display(0,0,10,10); | ||||
text->buffer(new Fl_Text_Buffer); | text->buffer(new Fl_Text_Buffer); | ||||
text->insert(GetHelpText(SpiralInfo::LOCALE).c_str()); | text->insert(GetHelpText(SpiralInfo::LOCALE).c_str()); | ||||
text->textsize(10); | |||||
text->textsize(12); | |||||
m_HelpWin->add(text); | m_HelpWin->add(text); | ||||
m_HelpWin->resizable(text); | m_HelpWin->resizable(text); | ||||
m_HelpWin->show(); | m_HelpWin->show(); | ||||
@@ -3,7 +3,7 @@ | |||||
#ifndef Fl_Knob_H | #ifndef Fl_Knob_H | ||||
#define Fl_Knob_H | #define Fl_Knob_H | ||||
#include <FL/Fl.H> | #include <FL/Fl.H> | ||||
#include <Fl/Fl_Valuator.H> | |||||
#include <FL/Fl_Valuator.H> | |||||
class Fl_Knob : public Fl_Valuator { | class Fl_Knob : public Fl_Valuator { | ||||
public: | public: | ||||
@@ -1,7 +1,7 @@ | |||||
// generated by Fast Light User Interface Designer (fluid) version 1.0100 | // generated by Fast Light User Interface Designer (fluid) version 1.0100 | ||||
#include "Fl_Knob.H" | #include "Fl_Knob.H" | ||||
#include <Fl/fl_draw.H> | |||||
#include <FL/fl_draw.H> | |||||
#include <math.h> | #include <math.h> | ||||
#include <iostream.h> | #include <iostream.h> | ||||
@@ -95,7 +95,8 @@ void SpiralInfo::StreamOutPrefs(ostream &s) | |||||
void SpiralInfo::Alert(string Text) | void SpiralInfo::Alert(string Text) | ||||
{ | { | ||||
fl_message(Text.c_str()); | |||||
//fl_message(Text.c_str()); | |||||
cerr<<"Spiral alert: "<<Text<<endl; | |||||
} | } | ||||
void SpiralInfo::Log(string Text) | void SpiralInfo::Log(string Text) | ||||
@@ -869,9 +869,11 @@ istream &operator>>(istream &s, SynthModular &o) | |||||
temp->m_Device->SetUpdateInfoCallback(ID,o.cb_UpdatePluginInfo); | temp->m_Device->SetUpdateInfoCallback(ID,o.cb_UpdatePluginInfo); | ||||
o.m_DeviceWinMap[ID]=temp; | o.m_DeviceWinMap[ID]=temp; | ||||
o.m_DeviceWinMap[ID]->m_Device->StreamIn(s); // load the plugin | o.m_DeviceWinMap[ID]->m_Device->StreamIn(s); // load the plugin | ||||
// load external files | |||||
o.m_DeviceWinMap[ID]->m_Device->LoadExternalFiles(o.m_FilePath+"_files/"); | |||||
if (ver>1 && o.m_DeviceWinMap[ID]->m_DeviceGUI->GetPluginWindow()) | if (ver>1 && o.m_DeviceWinMap[ID]->m_DeviceGUI->GetPluginWindow()) | ||||
{ | |||||
{ | |||||
// set the GUI up with the loaded values | // set the GUI up with the loaded values | ||||
// looks messy, but if we do it here, the plugin and it's gui can remain | // looks messy, but if we do it here, the plugin and it's gui can remain | ||||
// totally seperated. | // totally seperated. | ||||
@@ -887,9 +889,6 @@ istream &operator>>(istream &s, SynthModular &o) | |||||
if (ps) o.m_DeviceWinMap[ID]->m_DeviceGUI->Maximise(); | if (ps) o.m_DeviceWinMap[ID]->m_DeviceGUI->Maximise(); | ||||
else o.m_DeviceWinMap[ID]->m_DeviceGUI->Minimise(); | else o.m_DeviceWinMap[ID]->m_DeviceGUI->Minimise(); | ||||
// load external files | |||||
o.m_DeviceWinMap[ID]->m_Device->LoadExternalFiles(o.m_FilePath+"_files/"); | |||||
} | } | ||||
if (o.m_NextID<=ID) o.m_NextID=ID+1; | if (o.m_NextID<=ID) o.m_NextID=ID+1; | ||||