@@ -45,7 +45,6 @@ m_Triggered (false) | |||
m_PluginInfo.Width = 80; | |||
m_PluginInfo.Height = 80; | |||
CreatePorts (); | |||
// Channels | |||
m_AudioCH->Register ("Chans", &m_GUIArgs.Chans); | |||
m_AudioCH->Register ("Switch", &m_GUIArgs.Switch); | |||
m_AudioCH->Register ("Echo", &m_GUIArgs.Echo, ChannelHandler::OUTPUT); | |||
@@ -115,7 +114,7 @@ void MixSwitchPlugin::Execute() { | |||
for (n=0; n<m_HostInfo->BUFSIZE; n++) { | |||
if (InputExists (0)) { | |||
// 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)) { | |||
// Check the trigger CV value | |||
@@ -46,11 +46,9 @@ m_Triggered (false) | |||
m_PluginInfo.Height = 80; | |||
m_PluginInfo.NumInputs = 3; | |||
m_PluginInfo.NumOutputs = 3; | |||
// Inputs | |||
m_PluginInfo.PortTips.push_back ("CV"); | |||
m_PluginInfo.PortTips.push_back ("Clock"); | |||
m_PluginInfo.PortTips.push_back ("In"); | |||
// Outputs | |||
m_PluginInfo.PortTips.push_back ("CV"); | |||
m_PluginInfo.PortTips.push_back ("Out 1"); | |||
m_PluginInfo.PortTips.push_back ("Out 2"); | |||
@@ -108,7 +106,7 @@ void SplitSwitchPlugin::Execute() { | |||
for (n=0; n<m_HostInfo->BUFSIZE; n++) { | |||
if (InputExists (0)) { | |||
// 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)) { | |||
// Check the trigger CV value | |||
@@ -71,7 +71,8 @@ m_Mode(STOPM) | |||
m_PluginInfo.PortTips.push_back ("Right Out"); | |||
m_PluginInfo.PortTips.push_back ("Finish Trigger"); | |||
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 ("Pitch", &m_GUIArgs.PitchMod, 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 ("TimeOut", &m_GUIArgs.TimeOut, ChannelHandler::OUTPUT); | |||
m_AudioCH->Register ("MaxTime", &m_GUIArgs.MaxTime, ChannelHandler::OUTPUT); | |||
m_AudioCH->Register ("Playing", &m_GUIArgs.PlayOut, ChannelHandler::OUTPUT); | |||
} | |||
StreamPlugin::~StreamPlugin() | |||
@@ -100,8 +102,13 @@ void StreamPlugin::Execute() { | |||
for (int n=0; n<m_HostInfo->BUFSIZE; n++) { | |||
bool FinTrig = false; | |||
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) { | |||
m_Pos = m_SampleSize - 1; | |||
m_StreamPos -= m_SampleSize; | |||
@@ -124,26 +131,43 @@ void StreamPlugin::Execute() { | |||
m_File.SeekToChunk (m_StreamPos); | |||
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) { | |||
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() { | |||
if (m_AudioCH->IsCommandWaiting()) { | |||
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); | |||
enum GUICommands { NONE, SET_TIME, LOAD, RESTART, STOP, PLAY }; | |||
// 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 GetPitch (void) { return m_GUIArgs.PitchMod; } | |||
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 { | |||
float Volume; | |||
float PitchMod; | |||
char FileName[256]; | |||
float Time; | |||
float TimeOut; | |||
bool PlayOut; | |||
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); | |||
// Commands | |||
void SetTime (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 |
@@ -155,6 +155,7 @@ void StreamPluginGUI::Update() { | |||
m_Display[0]->value ((int)(t/600) % 10); | |||
redraw(); | |||
SetMaxTime (m_GUICH->GetFloat ("MaxTime")); | |||
if (m_Playing != m_GUICH->GetBool ("Playing")) UpdatePlayStatus (); | |||
} | |||
// Update GUI on load | |||
@@ -242,16 +243,15 @@ void StreamPluginGUI::cb_ToStart (Fl_Button* o, void* v) { | |||
// 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; | |||
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) { | |||
@@ -42,18 +42,12 @@ class StreamPluginGUI : public SpiralPluginGUI { | |||
char m_TextBuf[256], m_PitchLabel[256]; | |||
void SetMaxTime (float t) { m_Pos->maximum(t); } | |||
void UpdatePitch (bool UpdateIt = true, bool DrawIt = true, bool SendIt = true); | |||
void UpdatePlayStatus (void); | |||
// 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; | |||
//// Callbacks //// | |||
inline void cb_Volume_i (Fl_Knob* o, void* v); | |||