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