@@ -45,7 +45,6 @@ m_Triggered (false) | |||||
m_PluginInfo.Width = 80; | m_PluginInfo.Width = 80; | ||||
m_PluginInfo.Height = 80; | m_PluginInfo.Height = 80; | ||||
CreatePorts (); | CreatePorts (); | ||||
// Channels | |||||
m_AudioCH->Register ("Chans", &m_GUIArgs.Chans); | m_AudioCH->Register ("Chans", &m_GUIArgs.Chans); | ||||
m_AudioCH->Register ("Switch", &m_GUIArgs.Switch); | m_AudioCH->Register ("Switch", &m_GUIArgs.Switch); | ||||
m_AudioCH->Register ("Echo", &m_GUIArgs.Echo, ChannelHandler::OUTPUT); | m_AudioCH->Register ("Echo", &m_GUIArgs.Echo, ChannelHandler::OUTPUT); | ||||
@@ -115,7 +114,7 @@ void MixSwitchPlugin::Execute() { | |||||
for (n=0; n<m_HostInfo->BUFSIZE; n++) { | for (n=0; n<m_HostInfo->BUFSIZE; n++) { | ||||
if (InputExists (0)) { | if (InputExists (0)) { | ||||
// Check the Switch Pos CV Value | // Check the Switch Pos CV Value | ||||
m_SwitchPos = int (GetInput (0, n)-1) % NumChans; | |||||
m_SwitchPos = abs (int (GetInput (0, n) - 1)) % NumChans; | |||||
} | } | ||||
else if (InputExists (1)) { | else if (InputExists (1)) { | ||||
// Check the trigger CV value | // Check the trigger CV value | ||||
@@ -46,11 +46,9 @@ m_Triggered (false) | |||||
m_PluginInfo.Height = 80; | m_PluginInfo.Height = 80; | ||||
m_PluginInfo.NumInputs = 3; | m_PluginInfo.NumInputs = 3; | ||||
m_PluginInfo.NumOutputs = 3; | m_PluginInfo.NumOutputs = 3; | ||||
// Inputs | |||||
m_PluginInfo.PortTips.push_back ("CV"); | m_PluginInfo.PortTips.push_back ("CV"); | ||||
m_PluginInfo.PortTips.push_back ("Clock"); | m_PluginInfo.PortTips.push_back ("Clock"); | ||||
m_PluginInfo.PortTips.push_back ("In"); | m_PluginInfo.PortTips.push_back ("In"); | ||||
// Outputs | |||||
m_PluginInfo.PortTips.push_back ("CV"); | m_PluginInfo.PortTips.push_back ("CV"); | ||||
m_PluginInfo.PortTips.push_back ("Out 1"); | m_PluginInfo.PortTips.push_back ("Out 1"); | ||||
m_PluginInfo.PortTips.push_back ("Out 2"); | m_PluginInfo.PortTips.push_back ("Out 2"); | ||||
@@ -108,7 +106,7 @@ void SplitSwitchPlugin::Execute() { | |||||
for (n=0; n<m_HostInfo->BUFSIZE; n++) { | for (n=0; n<m_HostInfo->BUFSIZE; n++) { | ||||
if (InputExists (0)) { | if (InputExists (0)) { | ||||
// Check the Switch Pos CV Value | // Check the Switch Pos CV Value | ||||
m_SwitchPos = int (GetInput (0, n)-1) % NumChans; | |||||
m_SwitchPos = abs (int (GetInput (0, n) - 1)) % NumChans; | |||||
} | } | ||||
else if (InputExists (1)) { | else if (InputExists (1)) { | ||||
// Check the trigger CV value | // Check the trigger CV value | ||||
@@ -71,7 +71,8 @@ m_Mode(STOPM) | |||||
m_PluginInfo.PortTips.push_back ("Right Out"); | m_PluginInfo.PortTips.push_back ("Right Out"); | ||||
m_PluginInfo.PortTips.push_back ("Finish Trigger"); | m_PluginInfo.PortTips.push_back ("Finish Trigger"); | ||||
m_GUIArgs.Volume = 1.0f; | m_GUIArgs.Volume = 1.0f; | ||||
m_GUIArgs.PitchMod = 1.0f; | |||||
m_GUIArgs.PitchMod = 1.0f; | |||||
m_GUIArgs.PlayOut = false; | |||||
m_AudioCH->Register ("Volume", &m_GUIArgs.Volume); | m_AudioCH->Register ("Volume", &m_GUIArgs.Volume); | ||||
m_AudioCH->Register ("Pitch", &m_GUIArgs.PitchMod, ChannelHandler::INPUT); | m_AudioCH->Register ("Pitch", &m_GUIArgs.PitchMod, ChannelHandler::INPUT); | ||||
m_AudioCH->RegisterData ("FileName", ChannelHandler::INPUT, | m_AudioCH->RegisterData ("FileName", ChannelHandler::INPUT, | ||||
@@ -79,6 +80,7 @@ m_Mode(STOPM) | |||||
m_AudioCH->Register ("Time", &m_GUIArgs.Time); | m_AudioCH->Register ("Time", &m_GUIArgs.Time); | ||||
m_AudioCH->Register ("TimeOut", &m_GUIArgs.TimeOut, ChannelHandler::OUTPUT); | m_AudioCH->Register ("TimeOut", &m_GUIArgs.TimeOut, ChannelHandler::OUTPUT); | ||||
m_AudioCH->Register ("MaxTime", &m_GUIArgs.MaxTime, ChannelHandler::OUTPUT); | m_AudioCH->Register ("MaxTime", &m_GUIArgs.MaxTime, ChannelHandler::OUTPUT); | ||||
m_AudioCH->Register ("Playing", &m_GUIArgs.PlayOut, ChannelHandler::OUTPUT); | |||||
} | } | ||||
StreamPlugin::~StreamPlugin() | StreamPlugin::~StreamPlugin() | ||||
@@ -100,8 +102,13 @@ void StreamPlugin::Execute() { | |||||
for (int n=0; n<m_HostInfo->BUFSIZE; n++) { | for (int n=0; n<m_HostInfo->BUFSIZE; n++) { | ||||
bool FinTrig = false; | bool FinTrig = false; | ||||
float CVPitch = GetInput(0, n)*10.0f; | float CVPitch = GetInput(0, n)*10.0f; | ||||
if (GetInput (1, n) > 0) Play(); | |||||
if (GetInput (2, n) > 0) Stop(); | |||||
if (GetInput (1, n) > 0) m_Mode = PLAYM; | |||||
if (GetInput (2, n) > 0) { | |||||
m_Mode = STOPM; | |||||
m_Pos = 0; | |||||
m_GlobalPos = 0; | |||||
m_StreamPos = 0; | |||||
} | |||||
if (m_Pos<0) { | if (m_Pos<0) { | ||||
m_Pos = m_SampleSize - 1; | m_Pos = m_SampleSize - 1; | ||||
m_StreamPos -= m_SampleSize; | m_StreamPos -= m_SampleSize; | ||||
@@ -124,26 +131,43 @@ void StreamPlugin::Execute() { | |||||
m_File.SeekToChunk (m_StreamPos); | m_File.SeekToChunk (m_StreamPos); | ||||
m_File.LoadChunk (m_SampleSize, m_SampleL, m_SampleR); | m_File.LoadChunk (m_SampleSize, m_SampleL, m_SampleR); | ||||
} | } | ||||
SetOutput (0, n, m_SampleL[m_Pos] * m_GUIArgs.Volume); | |||||
SetOutput (1, n, m_SampleR[m_Pos] * m_GUIArgs.Volume); | |||||
if (FinTrig) SetOutput (2, n, 1); else SetOutput (2, n, 0); | |||||
if (FinTrig) SetOutput (2, n, 1); | |||||
else SetOutput (2, n, 0); | |||||
if (m_Mode==PLAYM) { | if (m_Mode==PLAYM) { | ||||
m_Pos += m_GUIArgs.PitchMod + CVPitch; | |||||
m_GlobalPos += m_GUIArgs.PitchMod + CVPitch; | |||||
SetOutput (0, n, m_SampleL[m_Pos] * m_GUIArgs.Volume); | |||||
SetOutput (1, n, m_SampleR[m_Pos] * m_GUIArgs.Volume); | |||||
m_Pos += m_GUIArgs.PitchMod + CVPitch; | |||||
m_GlobalPos += m_GUIArgs.PitchMod + CVPitch; | |||||
} | |||||
else { | |||||
SetOutput (0, n, 0); | |||||
SetOutput (1, n, 0); | |||||
} | } | ||||
} | } | ||||
m_GUIArgs.TimeOut = GetTime(); | |||||
m_GUIArgs.TimeOut = m_GlobalPos / (float)m_SampleRate; | |||||
m_GUIArgs.PlayOut = m_Mode==PLAYM; | |||||
} | } | ||||
} | } | ||||
void StreamPlugin::ExecuteCommands() { | void StreamPlugin::ExecuteCommands() { | ||||
if (m_AudioCH->IsCommandWaiting()) { | if (m_AudioCH->IsCommandWaiting()) { | ||||
switch (m_AudioCH->GetCommand()) { | switch (m_AudioCH->GetCommand()) { | ||||
case SET_TIME: SetTime(); break; | |||||
case LOAD: OpenStream(); break; | |||||
case RESTART: Restart(); break; | |||||
case STOP: Stop(); break; | |||||
case PLAY: Play(); break; | |||||
case SET_TIME: | |||||
SetTime(); | |||||
break; | |||||
case LOAD: | |||||
OpenStream(); | |||||
break; | |||||
case RESTART: | |||||
m_StreamPos = 0; | |||||
m_GlobalPos = 0; | |||||
break; | |||||
case STOP: | |||||
m_Mode = STOPM; | |||||
break; | |||||
case PLAY: | |||||
m_Mode = PLAYM; | |||||
break; | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -35,34 +35,28 @@ class StreamPlugin : public SpiralPlugin { | |||||
virtual void StreamIn (istream &s); | virtual void StreamIn (istream &s); | ||||
enum GUICommands { NONE, SET_TIME, LOAD, RESTART, STOP, PLAY }; | enum GUICommands { NONE, SET_TIME, LOAD, RESTART, STOP, PLAY }; | ||||
// has to be defined in the plugin | // has to be defined in the plugin | ||||
virtual void UpdateGUI() { Fl::check(); } | |||||
//virtual void UpdateGUI() { Fl::check(); } | |||||
float GetVolume (void) { return m_GUIArgs.Volume; } | float GetVolume (void) { return m_GUIArgs.Volume; } | ||||
float GetPitch (void) { return m_GUIArgs.PitchMod; } | float GetPitch (void) { return m_GUIArgs.PitchMod; } | ||||
private: | private: | ||||
WavFile m_File; | |||||
Sample m_SampleL, m_SampleR; | |||||
int m_SampleRate, m_SampleSize, m_StreamPos; | |||||
float m_GlobalPos, m_Pitch, m_SamplePos, m_Pos; | |||||
enum Mode { PLAYM, STOPM } m_Mode; | |||||
struct GUIArgs { | struct GUIArgs { | ||||
float Volume; | float Volume; | ||||
float PitchMod; | float PitchMod; | ||||
char FileName[256]; | char FileName[256]; | ||||
float Time; | float Time; | ||||
float TimeOut; | float TimeOut; | ||||
bool PlayOut; | |||||
float MaxTime; | float MaxTime; | ||||
}; | |||||
GUIArgs m_GUIArgs; | |||||
WavFile m_File; | |||||
Sample m_SampleL, m_SampleR; | |||||
int m_SampleRate, m_SampleSize, m_StreamPos; | |||||
float m_GlobalPos, m_Pitch, m_SamplePos, m_Pos; | |||||
enum Mode { PLAYM, STOPM }; | |||||
Mode m_Mode; | |||||
// Internal functions | |||||
float GetTime (void) { return m_GlobalPos / (float)m_SampleRate; } | |||||
} m_GUIArgs; | |||||
float GetLength (void); | float GetLength (void); | ||||
// Commands | // Commands | ||||
void SetTime (void); | void SetTime (void); | ||||
void OpenStream (void); | void OpenStream (void); | ||||
void Restart (void) { m_StreamPos = 0; m_GlobalPos = 0; } | |||||
void Stop (void) { m_Mode = STOPM; } | |||||
void Play (void) { m_Mode = PLAYM; } | |||||
}; | }; | ||||
#endif | #endif |
@@ -155,6 +155,7 @@ void StreamPluginGUI::Update() { | |||||
m_Display[0]->value ((int)(t/600) % 10); | m_Display[0]->value ((int)(t/600) % 10); | ||||
redraw(); | redraw(); | ||||
SetMaxTime (m_GUICH->GetFloat ("MaxTime")); | SetMaxTime (m_GUICH->GetFloat ("MaxTime")); | ||||
if (m_Playing != m_GUICH->GetBool ("Playing")) UpdatePlayStatus (); | |||||
} | } | ||||
// Update GUI on load | // Update GUI on load | ||||
@@ -242,16 +243,15 @@ void StreamPluginGUI::cb_ToStart (Fl_Button* o, void* v) { | |||||
// play | // play | ||||
inline void StreamPluginGUI::cb_Play_i (Fl_Button* o, void* v) { | |||||
if (m_Playing) { | |||||
m_Play->label ("@>"); | |||||
m_GUICH->SetCommand (StreamPlugin::STOP); | |||||
} | |||||
else { | |||||
m_Play->label ("@||"); | |||||
m_GUICH->SetCommand (StreamPlugin::PLAY); | |||||
} | |||||
void StreamPluginGUI::UpdatePlayStatus (void) { | |||||
m_Playing = ! m_Playing; | m_Playing = ! m_Playing; | ||||
if (m_Playing) m_Play->label ("@||"); | |||||
else m_Play->label ("@>"); | |||||
} | |||||
inline void StreamPluginGUI::cb_Play_i (Fl_Button* o, void* v) { | |||||
if (m_Playing) m_GUICH->SetCommand (StreamPlugin::STOP); | |||||
else m_GUICH->SetCommand (StreamPlugin::PLAY); | |||||
} | } | ||||
void StreamPluginGUI::cb_Play (Fl_Button* o, void* v) { | void StreamPluginGUI::cb_Play (Fl_Button* o, void* v) { | ||||
@@ -42,18 +42,12 @@ class StreamPluginGUI : public SpiralPluginGUI { | |||||
char m_TextBuf[256], m_PitchLabel[256]; | char m_TextBuf[256], m_PitchLabel[256]; | ||||
void SetMaxTime (float t) { m_Pos->maximum(t); } | void SetMaxTime (float t) { m_Pos->maximum(t); } | ||||
void UpdatePitch (bool UpdateIt = true, bool DrawIt = true, bool SendIt = true); | void UpdatePitch (bool UpdateIt = true, bool DrawIt = true, bool SendIt = true); | ||||
void UpdatePlayStatus (void); | |||||
// Widgets | // Widgets | ||||
Fl_SevenSeg* m_Display[6]; | |||||
Fl_Knob* m_Volume; | |||||
Fl_Slider* m_Pitch; | |||||
Fl_Slider* m_Pos; | |||||
Fl_Button* m_Load; | |||||
Fl_Button* m_ToStart; | |||||
Fl_Button* m_Play; | |||||
Fl_Button* m_Reset; | |||||
Fl_Button* m_Rev; | |||||
Fl_Button* m_Div; | |||||
Fl_Button* m_Dbl; | |||||
Fl_SevenSeg *m_Display[6]; | |||||
Fl_Knob *m_Volume; | |||||
Fl_Slider *m_Pitch, *m_Pos; | |||||
Fl_Button *m_Load, *m_ToStart, *m_Play, *m_Reset, *m_Rev, *m_Div, *m_Dbl; | |||||
Fl_Repeat_Button* m_Nudge; | Fl_Repeat_Button* m_Nudge; | ||||
//// Callbacks //// | //// Callbacks //// | ||||
inline void cb_Volume_i (Fl_Knob* o, void* v); | inline void cb_Volume_i (Fl_Knob* o, void* v); | ||||