diff --git a/SpiralSound/Plugins/MixSwitchPlugin/MixSwitchPlugin.C b/SpiralSound/Plugins/MixSwitchPlugin/MixSwitchPlugin.C index 6d78c35..49bb169 100644 --- a/SpiralSound/Plugins/MixSwitchPlugin/MixSwitchPlugin.C +++ b/SpiralSound/Plugins/MixSwitchPlugin/MixSwitchPlugin.C @@ -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; nBUFSIZE; 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 diff --git a/SpiralSound/Plugins/SplitSwitchPlugin/SplitSwitchPlugin.C b/SpiralSound/Plugins/SplitSwitchPlugin/SplitSwitchPlugin.C index cf8ff29..a104ddc 100644 --- a/SpiralSound/Plugins/SplitSwitchPlugin/SplitSwitchPlugin.C +++ b/SpiralSound/Plugins/SplitSwitchPlugin/SplitSwitchPlugin.C @@ -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; nBUFSIZE; 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 diff --git a/SpiralSound/Plugins/StreamPlugin/StreamPlugin.C b/SpiralSound/Plugins/StreamPlugin/StreamPlugin.C index 65afd61..116b568 100644 --- a/SpiralSound/Plugins/StreamPlugin/StreamPlugin.C +++ b/SpiralSound/Plugins/StreamPlugin/StreamPlugin.C @@ -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; nBUFSIZE; 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; } } } diff --git a/SpiralSound/Plugins/StreamPlugin/StreamPlugin.h b/SpiralSound/Plugins/StreamPlugin/StreamPlugin.h index 5f38f96..7c9b463 100644 --- a/SpiralSound/Plugins/StreamPlugin/StreamPlugin.h +++ b/SpiralSound/Plugins/StreamPlugin/StreamPlugin.h @@ -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 diff --git a/SpiralSound/Plugins/StreamPlugin/StreamPluginGUI.C b/SpiralSound/Plugins/StreamPlugin/StreamPluginGUI.C index 1e75b5f..347c2f1 100644 --- a/SpiralSound/Plugins/StreamPlugin/StreamPluginGUI.C +++ b/SpiralSound/Plugins/StreamPlugin/StreamPluginGUI.C @@ -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) { diff --git a/SpiralSound/Plugins/StreamPlugin/StreamPluginGUI.h b/SpiralSound/Plugins/StreamPlugin/StreamPluginGUI.h index 280059a..f6362ef 100644 --- a/SpiralSound/Plugins/StreamPlugin/StreamPluginGUI.h +++ b/SpiralSound/Plugins/StreamPlugin/StreamPluginGUI.h @@ -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);