Browse Source

Matrix and Outputplugin fixes, more info in README

master
nebogeo 22 years ago
parent
commit
3c6be46311
9 changed files with 79 additions and 41 deletions
  1. +2
    -2
      CHANGES
  2. +8
    -4
      README
  3. +25
    -21
      SpiralSound/Plugins/MatrixPlugin/MatrixPlugin.C
  4. +2
    -1
      SpiralSound/Plugins/MatrixPlugin/MatrixPlugin.h
  5. +30
    -5
      SpiralSound/Plugins/MatrixPlugin/MatrixPluginGUI.C
  6. +3
    -0
      SpiralSound/Plugins/MatrixPlugin/MatrixPluginGUI.h
  7. +8
    -6
      SpiralSound/Plugins/OutputPlugin/OutputPlugin.C
  8. +1
    -1
      SpiralSound/Plugins/OutputPlugin/OutputPlugin.h
  9. +0
    -1
      configure.in

+ 2
- 2
CHANGES View File

@@ -1,10 +1,10 @@
Release 0.2.0 Release 0.2.0


App now multithreaded, and plugins use a new api to support this App now multithreaded, and plugins use a new api to support this
Jack support fully functional
Jack support fully functional and stable
-Realtime commandline option (as root) runs ssm audio in SCHED_FIFO -Realtime commandline option (as root) runs ssm audio in SCHED_FIFO
LADSPA plugin much improved with built in GUI generator LADSPA plugin much improved with built in GUI generator
App help added with Helptext for most of the plugins
App help added with Helptext for all of the plugins
Numerous fixes, additions and GUI improvements Numerous fixes, additions and GUI improvements


Release 0.1.1 Release 0.1.1


+ 8
- 4
README View File

@@ -1,12 +1,13 @@
** SpiralSynthModular ** ** SpiralSynthModular **


Last changed Saturday March 23 2002.
Last changed Saturday December 11 2002.


SpiralSynthModular is open source software, distributed under the General SpiralSynthModular is open source software, distributed under the General
Public License (GPL). See the file COPYING. Public License (GPL). See the file COPYING.


Dependancies: Dependancies:
FLTK (www.fltk.org)
FLTK (www.fltk.org) If you build FLTK from source use
"./configure --enable-shared"


Sound output can be provided by either OSS or JACK (and therefore alsa). Sound output can be provided by either OSS or JACK (and therefore alsa).


@@ -26,7 +27,10 @@ For more examples be sure to check out the noize farm
(http://groups.yahoo.com/group/noize_farm) an open source repository of (http://groups.yahoo.com/group/noize_farm) an open source repository of
ssm patches. ssm patches.


options list
usage:
spiralsynthmodular options [patch.ssm]

options list:
-h : help -h : help
-v : print version -v : print version
--NoGUI : run without GUI (only useful when loading patch from command line --NoGUI : run without GUI (only useful when loading patch from command line
@@ -54,7 +58,7 @@ the realtime output doesn't.


BufferSize = 512 - Size of sample buffer to be calculated each cycle. BufferSize = 512 - Size of sample buffer to be calculated each cycle.
FragmentSize = 256 - Subbuffer size sent to the soundcard FragmentSize = 256 - Subbuffer size sent to the soundcard
FragmentCount = -1 - Subbuffer count, -1 computes a suitable size,
FragmentCount = 8 - Subbuffer count, -1 computes a suitable size,
setting to 4 or 8 gets better latencies. setting to 4 or 8 gets better latencies.
Samplerate = 44100 - Sets the samplerate Samplerate = 44100 - Sets the samplerate




+ 25
- 21
SpiralSound/Plugins/MatrixPlugin/MatrixPlugin.C View File

@@ -49,6 +49,7 @@ m_Step(0),
m_Loop(true), m_Loop(true),
m_NoteCut(false), m_NoteCut(false),
m_Current(0), m_Current(0),
m_GUICurrent(0),
m_CurrentNoteCV(0), m_CurrentNoteCV(0),
m_CurrentTriggerCV(0), m_CurrentTriggerCV(0),
m_Triggered(false), m_Triggered(false),
@@ -109,7 +110,7 @@ m_PatReset(false)
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_Current,ChannelHandler::INPUT);
m_AudioCH->Register("Current",&m_GUICurrent,ChannelHandler::INPUT);
m_AudioCH->Register("StepTime",&m_StepTime,ChannelHandler::INPUT); m_AudioCH->Register("StepTime",&m_StepTime,ChannelHandler::INPUT);
m_AudioCH->Register("Num",&m_GUIArgs.Num,ChannelHandler::INPUT); m_AudioCH->Register("Num",&m_GUIArgs.Num,ChannelHandler::INPUT);
m_AudioCH->Register("Length",&m_GUIArgs.Length,ChannelHandler::INPUT); m_AudioCH->Register("Length",&m_GUIArgs.Length,ChannelHandler::INPUT);
@@ -153,6 +154,9 @@ void MatrixPlugin::Execute()
// clear the pattern sync // clear the pattern sync
SetOutput(18, n, 0); SetOutput(18, n, 0);
bool ExternalClock = InputExists(4);
bool ExternalClockTriggered=false;
if (GetInputPitch(0,n)>0) if (GetInputPitch(0,n)>0)
{ {
@@ -174,7 +178,7 @@ void MatrixPlugin::Execute()
// will be the first one // will be the first one
m_Time=m_StepTime*(1/m_Matrix[m_Current].Speed); m_Time=m_StepTime*(1/m_Matrix[m_Current].Speed);
m_Step=-1; m_Step=-1;
ExternalClockTriggered=true;
m_Triggered=true; m_Triggered=true;
} }
} }
@@ -186,10 +190,6 @@ void MatrixPlugin::Execute()


// set the individual triggers // set the individual triggers
for (int t=0; t<NUM_PATTERNS; t++) SetOutput(t+2,n,m_TriggerLevel[t]); for (int t=0; t<NUM_PATTERNS; t++) SetOutput(t+2,n,m_TriggerLevel[t]);


bool ExternalClock = InputExists(4);
bool ExternalClockTriggered=false;
if (ExternalClock) if (ExternalClock)
{ {
@@ -258,6 +258,7 @@ 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);
@@ -300,22 +301,22 @@ void MatrixPlugin::ExecuteCommands()
switch (m_AudioCH->GetCommand()) switch (m_AudioCH->GetCommand())
{ {
case MAT_LENGTH : case MAT_LENGTH :
m_Matrix[m_Current].Length=m_GUIArgs.Length;
m_Matrix[m_GUICurrent].Length=m_GUIArgs.Length;
break; break;
case MAT_SPEED : case MAT_SPEED :
m_Matrix[m_Current].Speed=m_GUIArgs.Speed/8.0f;
m_Matrix[m_GUICurrent].Speed=m_GUIArgs.Speed;
break; break;
case MAT_ACTIVATE : case MAT_ACTIVATE :
m_Matrix[m_Current].Matrix[m_GUIArgs.X][m_GUIArgs.Y]=true;
m_Matrix[m_GUICurrent].Matrix[m_GUIArgs.X][m_GUIArgs.Y]=true;
break; break;
case MAT_DEACTIVATE : case MAT_DEACTIVATE :
m_Matrix[m_Current].Matrix[m_GUIArgs.X][m_GUIArgs.Y]=false;
m_Matrix[m_GUICurrent].Matrix[m_GUIArgs.X][m_GUIArgs.Y]=false;
break; break;
case MAT_OCTAVE : case MAT_OCTAVE :
m_Matrix[m_Current].Octave=m_GUIArgs.Octave;
m_Matrix[m_GUICurrent].Octave=m_GUIArgs.Octave;
break; break;
case COPY : case COPY :
CopyPattern(); CopyPattern();
@@ -333,16 +334,19 @@ void MatrixPlugin::ExecuteCommands()
if (CanTransposeDown()) TransposeDown(); if (CanTransposeDown()) TransposeDown();
break; break;
case MAT_VOLUME : case MAT_VOLUME :
m_Matrix[m_Current].Volume[m_GUIArgs.X][m_GUIArgs.Y]=m_GUIArgs.Volume;
m_Matrix[m_GUICurrent].Volume[m_GUIArgs.X][m_GUIArgs.Y]=m_GUIArgs.Volume;
break;
case SET_CURRENT :
m_Current=m_GUIArgs.Num;
break; break;
} }
} }
} }


void MatrixPlugin::PastePattern() { void MatrixPlugin::PastePattern() {
m_Matrix[m_Current].Length = m_Matrix[m_CopyPattern].Length;
m_Matrix[m_Current].Speed = m_Matrix[m_CopyPattern].Speed;
m_Matrix[m_Current].Octave = m_Matrix[m_CopyPattern].Octave;
m_Matrix[m_GUICurrent].Length = m_Matrix[m_CopyPattern].Length;
m_Matrix[m_GUICurrent].Speed = m_Matrix[m_CopyPattern].Speed;
m_Matrix[m_GUICurrent].Octave = m_Matrix[m_CopyPattern].Octave;
for (int y=0; y<MATY; y++) { for (int y=0; y<MATY; y++) {
for (int x=0; x<MATX; x++) { for (int x=0; x<MATX; x++) {
m_Matrix[m_Current].Matrix[x][y] = m_Matrix[m_CopyPattern].Matrix[x][y]; m_Matrix[m_Current].Matrix[x][y] = m_Matrix[m_CopyPattern].Matrix[x][y];
@@ -353,7 +357,7 @@ void MatrixPlugin::PastePattern() {
void MatrixPlugin::ClearPattern() { void MatrixPlugin::ClearPattern() {
for (int y=0; y<MATY; y++) { for (int y=0; y<MATY; y++) {
for (int x=0; x<MATX; x++) { for (int x=0; x<MATX; x++) {
m_Matrix[m_Current].Matrix[x][y] = 0;
m_Matrix[m_GUICurrent].Matrix[x][y] = 0;
} }
} }
} }
@@ -362,11 +366,11 @@ void MatrixPlugin::TransposeUp() {
int x, y; int x, y;
for (y=MATY-1; y>=0; y--) { for (y=MATY-1; y>=0; y--) {
for (x=0; x<MATX; x++) { for (x=0; x<MATX; x++) {
m_Matrix[m_Current].Matrix[x][y] = m_Matrix[m_Current].Matrix[x][y-1];
m_Matrix[m_GUICurrent].Matrix[x][y] = m_Matrix[m_GUICurrent].Matrix[x][y-1];
} }
} }
for (x=0; x<MATX; x++) { for (x=0; x<MATX; x++) {
m_Matrix[m_Current].Matrix[x][0] = 0;
m_Matrix[m_GUICurrent].Matrix[x][0] = 0;
} }
} }


@@ -377,18 +381,18 @@ void MatrixPlugin::TransposeDown()
{ {
for (x=0; x<MATX; x++) for (x=0; x<MATX; x++)
{ {
m_Matrix[m_Current].Matrix[x][y] = m_Matrix[m_Current].Matrix[x][y+1];
m_Matrix[m_GUICurrent].Matrix[x][y] = m_Matrix[m_GUICurrent].Matrix[x][y+1];
} }
} }
for (x=0; x<MATX; x++) for (x=0; x<MATX; x++)
{ {
m_Matrix[m_Current].Matrix[x][MATY-1] = 0;
m_Matrix[m_GUICurrent].Matrix[x][MATY-1] = 0;
} }
} }


bool MatrixPlugin::CanTransposeDown() bool MatrixPlugin::CanTransposeDown()
{ {
for (int x=0; x<MATX; x++) if (m_Matrix[m_Current].Matrix[x][0]) return False;
for (int x=0; x<MATX; x++) if (m_Matrix[m_GUICurrent].Matrix[x][0]) return False;
return True; return True;
} }




+ 2
- 1
SpiralSound/Plugins/MatrixPlugin/MatrixPlugin.h View File

@@ -54,7 +54,7 @@ public:
Pattern* GetPattern() { return &m_Matrix[m_Current]; } Pattern* GetPattern() { return &m_Matrix[m_Current]; }
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};
MAT_OCTAVE,COPY,PASTE,CLEAR,TUP,TDOWN,MAT_VOLUME,SET_CURRENT};
struct GUIArgs struct GUIArgs
{ {
@@ -86,6 +86,7 @@ private:
bool m_NoteCut; bool m_NoteCut;
int m_Current; int m_Current;
int m_GUICurrent;
Pattern m_Matrix[NUM_PATTERNS]; Pattern m_Matrix[NUM_PATTERNS];
float m_TriggerLevel[MATY]; float m_TriggerLevel[MATY];


+ 30
- 5
SpiralSound/Plugins/MatrixPlugin/MatrixPluginGUI.C View File

@@ -111,7 +111,7 @@ m_LastLight(0)
m_NoteCut->callback((Fl_Callback*)cb_NoteCut); m_NoteCut->callback((Fl_Callback*)cb_NoteCut);
add(m_NoteCut); add(m_NoteCut);
m_Pattern = new Fl_Counter(5, 20, 40, 20, "Pattern");
m_Pattern = new Fl_Counter(5, 20, 40, 20, "View");
m_Pattern->labelsize(10); m_Pattern->labelsize(10);
m_Pattern->type(FL_SIMPLE_COUNTER); m_Pattern->type(FL_SIMPLE_COUNTER);
m_Pattern->step(1); m_Pattern->step(1);
@@ -119,6 +119,14 @@ m_LastLight(0)
m_Pattern->callback((Fl_Callback*)cb_Pattern); m_Pattern->callback((Fl_Callback*)cb_Pattern);
add(m_Pattern); add(m_Pattern);
m_PlayPattern = new Fl_Counter(50, 20, 40, 20, "Play");
m_PlayPattern->labelsize(10);
m_PlayPattern->type(FL_SIMPLE_COUNTER);
m_PlayPattern->step(1);
m_PlayPattern->value(0);
m_PlayPattern->callback((Fl_Callback*)cb_PlayPattern);
add(m_PlayPattern);
m_Length = new Fl_Counter(5, 55, 40, 20, "Length"); m_Length = new Fl_Counter(5, 55, 40, 20, "Length");
m_Length->labelsize(10); m_Length->labelsize(10);
m_Length->type(FL_SIMPLE_COUNTER); m_Length->type(FL_SIMPLE_COUNTER);
@@ -248,7 +256,7 @@ void MatrixPluginGUI::UpdateValues(SpiralPlugin *o)
m_Pattern->value(Plugin->GetCurrent()); m_Pattern->value(Plugin->GetCurrent());
m_Length->value(Plugin->GetPattern()->Length); m_Length->value(Plugin->GetPattern()->Length);
m_Speed->value(Plugin->GetPattern()->Speed);
m_Speed->value(Plugin->GetPattern()->Speed*8);
m_SpeedVal->value((int)m_Speed->value()); m_SpeedVal->value((int)m_Speed->value());
m_Octave->value(Plugin->GetPattern()->Octave); m_Octave->value(Plugin->GetPattern()->Octave);
@@ -266,11 +274,18 @@ void MatrixPluginGUI::UpdateMatrix()
m_GUICH->RequestChannelAndWait("Matrix"); m_GUICH->RequestChannelAndWait("Matrix");
m_GUICH->GetData("Matrix",(void*)m_GUIMatrix); m_GUICH->GetData("Matrix",(void*)m_GUIMatrix);
Pattern *p=&m_GUIMatrix[(int)m_Pattern->value()];
m_Length->value(p->Length);
m_Speed->value(p->Speed*8);
m_SpeedVal->value((int)m_Speed->value());
m_Octave->value(p->Octave);

for(int x=0; x<MATX; x++) for(int x=0; x<MATX; x++)
for(int y=0; y<MATY; y++) for(int y=0; y<MATY; y++)
{ {
m_Matrix[x][y]->value(m_GUIMatrix[(int)m_Pattern->value()].Matrix[x][y]);
m_Matrix[x][y]->SetVolume(m_GUIMatrix[(int)m_Pattern->value()].Volume[x][y]);
m_Matrix[x][y]->value(p->Matrix[x][y]);
m_Matrix[x][y]->SetVolume(p->Volume[x][y]);
} }


} }
@@ -315,6 +330,16 @@ inline void MatrixPluginGUI::cb_Pattern_i(Fl_Counter* o, void* v)
void MatrixPluginGUI::cb_Pattern(Fl_Counter* o, void* v) void MatrixPluginGUI::cb_Pattern(Fl_Counter* o, void* v)
{ ((MatrixPluginGUI*)(o->parent()))->cb_Pattern_i(o,v);} { ((MatrixPluginGUI*)(o->parent()))->cb_Pattern_i(o,v);}


inline void MatrixPluginGUI::cb_PlayPattern_i(Fl_Counter* o, void* v)
{
if (o->value()<0) o->value(0);
if (o->value()>NUM_PATTERNS-1) o->value(NUM_PATTERNS-1);
m_GUICH->Set("Num",(int)o->value());
m_GUICH->SetCommand(MatrixPlugin::SET_CURRENT);
}
void MatrixPluginGUI::cb_PlayPattern(Fl_Counter* o, void* v)
{ ((MatrixPluginGUI*)(o->parent()))->cb_PlayPattern_i(o,v);}

inline void MatrixPluginGUI::cb_Length_i(Fl_Counter* o, void* v) inline void MatrixPluginGUI::cb_Length_i(Fl_Counter* o, void* v)
{ {
if (o->value()<1) o->value(1); if (o->value()<1) o->value(1);
@@ -333,7 +358,7 @@ inline void MatrixPluginGUI::cb_Speed_i(Fl_Knob* o, void* v)
float value=o->value()+((int)o->value()-o->value()); float value=o->value()+((int)o->value()-o->value());
m_SpeedVal->value(value); m_SpeedVal->value(value);
m_GUICH->Set("Speed",(float)value);
m_GUICH->Set("Speed",(float)value/8.0f);
m_GUICH->SetCommand(MatrixPlugin::MAT_SPEED); m_GUICH->SetCommand(MatrixPlugin::MAT_SPEED);
} }
void MatrixPluginGUI::cb_Speed(Fl_Knob* o, void* v) void MatrixPluginGUI::cb_Speed(Fl_Knob* o, void* v)


+ 3
- 0
SpiralSound/Plugins/MatrixPlugin/MatrixPluginGUI.h View File

@@ -84,6 +84,7 @@ private:
Fl_Button* m_NoteCut; Fl_Button* m_NoteCut;
Fl_Counter* m_Pattern; Fl_Counter* m_Pattern;
Fl_Counter* m_PlayPattern;
Fl_Counter* m_Length; Fl_Counter* m_Length;
Fl_Knob* m_Speed; Fl_Knob* m_Speed;
Fl_MatrixButton* m_Matrix[MATX][MATY]; Fl_MatrixButton* m_Matrix[MATX][MATY];
@@ -104,6 +105,8 @@ private:
static void cb_MatVol(Fl_Button* o, void* v); static void cb_MatVol(Fl_Button* o, void* v);
inline void cb_Pattern_i(Fl_Counter* o, void* v); inline void cb_Pattern_i(Fl_Counter* o, void* v);
static void cb_Pattern(Fl_Counter* o, void* v); static void cb_Pattern(Fl_Counter* o, void* v);
inline void cb_PlayPattern_i(Fl_Counter* o, void* v);
static void cb_PlayPattern(Fl_Counter* o, void* v);
inline void cb_Length_i(Fl_Counter* o, void* v); inline void cb_Length_i(Fl_Counter* o, void* v);
static void cb_Length(Fl_Counter* o, void* v); static void cb_Length(Fl_Counter* o, void* v);
inline void cb_Speed_i(Fl_Knob* o, void* v); inline void cb_Speed_i(Fl_Knob* o, void* v);


+ 8
- 6
SpiralSound/Plugins/OutputPlugin/OutputPlugin.C View File

@@ -54,6 +54,7 @@ static const HostInfo* host;
OSSOutput* OSSOutput::m_Singleton = NULL; OSSOutput* OSSOutput::m_Singleton = NULL;
int OutputPlugin::m_RefCount=0; int OutputPlugin::m_RefCount=0;
int OutputPlugin::m_NoExecuted=0; int OutputPlugin::m_NoExecuted=0;
OutputPlugin::Mode OutputPlugin::m_Mode=NO_MODE;




#define CHECK_AND_REPORT_ERROR if (result<0) \ #define CHECK_AND_REPORT_ERROR if (result<0) \
@@ -103,8 +104,6 @@ m_Volume(1.0f)
m_PluginInfo.PortTips.push_back("Right In"); m_PluginInfo.PortTips.push_back("Right In");
m_AudioCH->Register("Volume",&m_Volume); m_AudioCH->Register("Volume",&m_Volume);
m_Mode=NO_MODE;
} }


OutputPlugin::~OutputPlugin() OutputPlugin::~OutputPlugin()
@@ -137,7 +136,7 @@ SpiralGUIType *OutputPlugin::CreateGUI()


void OutputPlugin::Execute() void OutputPlugin::Execute()
{ {
if (m_Mode==NO_MODE)
if (m_Mode==NO_MODE && m_RefCount==1)
{ {
if (OSSOutput::Get()->OpenWrite()) if (OSSOutput::Get()->OpenWrite())
{ {
@@ -192,12 +191,15 @@ void OutputPlugin::Execute()
void OutputPlugin::ExecuteCommands() void OutputPlugin::ExecuteCommands()
{ {
// Only Play() once per set of plugins // Only Play() once per set of plugins
m_NoExecuted++;
if (m_NoExecuted==m_RefCount)
cerr<<m_RefCount<<" "<<m_NoExecuted<<endl;
m_NoExecuted--;
if (m_NoExecuted<=0)
{ {
if (m_Mode==INPUT || m_Mode==DUPLEX) OSSOutput::Get()->Read(); if (m_Mode==INPUT || m_Mode==DUPLEX) OSSOutput::Get()->Read();
if (m_Mode==OUTPUT || m_Mode==DUPLEX) OSSOutput::Get()->Play(); if (m_Mode==OUTPUT || m_Mode==DUPLEX) OSSOutput::Get()->Play();
m_NoExecuted=0;
m_NoExecuted=m_RefCount;
} }






+ 1
- 1
SpiralSound/Plugins/OutputPlugin/OutputPlugin.h View File

@@ -88,7 +88,7 @@ public:
private: private:
static int m_RefCount; static int m_RefCount;
static int m_NoExecuted; static int m_NoExecuted;
Mode m_Mode;
static Mode m_Mode;
bool m_CheckedAlready; bool m_CheckedAlready;
bool m_Recmode; bool m_Recmode;
}; };


+ 0
- 1
configure.in View File

@@ -143,7 +143,6 @@ SpiralSound/Plugins/SVFilterPlugin/Makefile
SpiralSound/Plugins/SampleHoldPlugin/Makefile SpiralSound/Plugins/SampleHoldPlugin/Makefile
SpiralSound/Plugins/SeqSelectorPlugin/Makefile SpiralSound/Plugins/SeqSelectorPlugin/Makefile
SpiralSound/Plugins/SmoothPlugin/Makefile SpiralSound/Plugins/SmoothPlugin/Makefile
SpiralSound/Plugins/SpiralLoopPlugin/Makefile
SpiralSound/Plugins/SplitterPlugin/Makefile SpiralSound/Plugins/SplitterPlugin/Makefile
SpiralSound/Plugins/StereoMixerPlugin/Makefile SpiralSound/Plugins/StereoMixerPlugin/Makefile
SpiralSound/Plugins/StreamPlugin/Makefile SpiralSound/Plugins/StreamPlugin/Makefile


Loading…
Cancel
Save