| @@ -0,0 +1,130 @@ | |||||
| /* SpiralSound | |||||
| * Copyleft (C) 2001 David Griffiths <dave@pawfal.org> | |||||
| * | |||||
| * This program is free software; you can redistribute it and/or modify | |||||
| * it under the terms of the GNU General Public License as published by | |||||
| * the Free Software Foundation; either version 2 of the License, or | |||||
| * (at your option) any later version. | |||||
| * | |||||
| * This program is distributed in the hope that it will be useful, | |||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * GNU General Public License for more details. | |||||
| * | |||||
| * You should have received a copy of the GNU General Public License | |||||
| * along with this program; if not, write to the Free Software | |||||
| * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
| */ | |||||
| #include <math.h> | |||||
| #include "AnotherFilterPlugin.h" | |||||
| #include "AnotherFilterPluginGUI.h" | |||||
| #include <FL/Fl_Button.h> | |||||
| #include "SpiralIcon.xpm" | |||||
| #define PI 3.141592654 | |||||
| static const int GRANULARITY = 10; | |||||
| extern "C" { | |||||
| SpiralPlugin* CreateInstance() | |||||
| { | |||||
| return new AnotherFilterPlugin; | |||||
| } | |||||
| char** GetIcon() | |||||
| { | |||||
| return SpiralIcon_xpm; | |||||
| } | |||||
| int GetID() | |||||
| { | |||||
| return 43; | |||||
| } | |||||
| } | |||||
| /////////////////////////////////////////////////////// | |||||
| AnotherFilterPlugin::AnotherFilterPlugin() : | |||||
| Cutoff(0.0f), | |||||
| Resonance(0.0f), | |||||
| vibrapos(0.0f), | |||||
| vibraspeed(0.0f) | |||||
| { | |||||
| m_PluginInfo.Name="AnotherLPF"; | |||||
| m_PluginInfo.Width=120; | |||||
| m_PluginInfo.Height=110; | |||||
| m_PluginInfo.NumInputs=3; | |||||
| m_PluginInfo.NumOutputs=1; | |||||
| m_PluginInfo.PortTips.push_back("Input"); | |||||
| m_PluginInfo.PortTips.push_back("Cutoff CV"); | |||||
| m_PluginInfo.PortTips.push_back("Emphasis CV"); | |||||
| m_PluginInfo.PortTips.push_back("LowPass output"); | |||||
| m_AudioCH->Register("Cutoff",&Cutoff); | |||||
| m_AudioCH->Register("Resonance",&Resonance); | |||||
| } | |||||
| AnotherFilterPlugin::~AnotherFilterPlugin() | |||||
| { | |||||
| } | |||||
| PluginInfo &AnotherFilterPlugin::Initialise(const HostInfo *Host) | |||||
| { | |||||
| return SpiralPlugin::Initialise(Host); | |||||
| } | |||||
| SpiralGUIType *AnotherFilterPlugin::CreateGUI() | |||||
| { | |||||
| return new AnotherFilterPluginGUI(m_PluginInfo.Width, | |||||
| m_PluginInfo.Height, | |||||
| this,m_AudioCH,m_HostInfo); | |||||
| } | |||||
| void AnotherFilterPlugin::Execute() | |||||
| { | |||||
| float in; | |||||
| for (int n=0; n<m_HostInfo->BUFSIZE; n++) | |||||
| { | |||||
| if (n%GRANULARITY==0) | |||||
| { | |||||
| w = 2.0*PI*((Cutoff+GetInput(1,n))*10000+1)/m_HostInfo->SAMPLERATE; // Pole angle | |||||
| q = 1.0-w/(2.0*(((Resonance+GetInput(2,n))*10+1)+0.5/(1.0+w))+w-2.0); // Pole magnitude | |||||
| r = q*q; | |||||
| c = r+1.0-2.0*cos(w)*q; | |||||
| } | |||||
| /* Accelerate vibra by signal-vibra, multiplied by lowpasscutoff */ | |||||
| vibraspeed += (GetInput(0,n)*0.3f - vibrapos) * c; | |||||
| /* Add velocity to vibra's position */ | |||||
| vibrapos += vibraspeed; | |||||
| /* Attenuate/amplify vibra's velocity by resonance */ | |||||
| vibraspeed *= r; | |||||
| // needs clipping :( | |||||
| if (vibrapos>1.0f) vibrapos=1.0f; | |||||
| if (vibrapos<-1.0f) vibrapos=-1.0f; | |||||
| /* Store new value */ | |||||
| SetOutput(0,n,vibrapos); | |||||
| } | |||||
| } | |||||
| void AnotherFilterPlugin::Randomise() | |||||
| { | |||||
| } | |||||
| void AnotherFilterPlugin::StreamOut(ostream &s) | |||||
| { | |||||
| s<<m_Version<<" "<<Cutoff<<" "<<Resonance<<" "; | |||||
| } | |||||
| void AnotherFilterPlugin::StreamIn(istream &s) | |||||
| { | |||||
| int version; | |||||
| s>>version; | |||||
| s>>Cutoff>>Resonance; | |||||
| } | |||||
| @@ -0,0 +1,58 @@ | |||||
| /* SpiralSound | |||||
| * Copyleft (C) 2001 David Griffiths <dave@pawfal.org> | |||||
| * | |||||
| * This program is free software; you can redistribute it and/or modify | |||||
| * it under the terms of the GNU General Public License as published by | |||||
| * the Free Software Foundation; either version 2 of the License, or | |||||
| * (at your option) any later version. | |||||
| * | |||||
| * This program is distributed in the hope that it will be useful, | |||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * GNU General Public License for more details. | |||||
| * | |||||
| * You should have received a copy of the GNU General Public License | |||||
| * along with this program; if not, write to the Free Software | |||||
| * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
| */ | |||||
| #include "../SpiralPlugin.h" | |||||
| #include <FL/Fl_Pixmap.H> | |||||
| #ifndef AnotherFilterPLUGIN | |||||
| #define AnotherFilterPLUGIN | |||||
| static const int NUM_CHANNELS = 4; | |||||
| // A State Variable Filter | |||||
| class AnotherFilterPlugin : public SpiralPlugin | |||||
| { | |||||
| public: | |||||
| AnotherFilterPlugin(); | |||||
| virtual ~AnotherFilterPlugin(); | |||||
| virtual PluginInfo &Initialise(const HostInfo *Host); | |||||
| virtual SpiralGUIType *CreateGUI(); | |||||
| virtual void Execute(); | |||||
| virtual void StreamOut(ostream &s); | |||||
| virtual void StreamIn(istream &s); | |||||
| float GetCutoff() { return Cutoff; } | |||||
| float GetResonance() { return Resonance; } | |||||
| void Randomise(); | |||||
| void Clear(); | |||||
| private: | |||||
| float Cutoff, Resonance; | |||||
| // Calculation | |||||
| double w,q,r,c,vibrapos,vibraspeed; | |||||
| friend istream &operator>>(istream &s, AnotherFilterPlugin &o); | |||||
| friend ostream &operator<<(ostream &s, AnotherFilterPlugin &o); | |||||
| }; | |||||
| istream &operator>>(istream &s, AnotherFilterPlugin &o); | |||||
| ostream &operator<<(ostream &s, AnotherFilterPlugin &o); | |||||
| #endif | |||||
| @@ -0,0 +1,77 @@ | |||||
| /* SpiralPlugin | |||||
| * Copyleft (C) 2000 David Griffiths <dave@pawfal.org> | |||||
| * | |||||
| * This program is free software; you can redistribute it and/or modify | |||||
| * it under the terms of the GNU General Public License as published by | |||||
| * the Free Software Foundation; either version 2 of the License, or | |||||
| * (at your option) any later version. | |||||
| * | |||||
| * This program is distributed in the hope that it will be useful, | |||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * GNU General Public License for more details. | |||||
| * | |||||
| * You should have received a copy of the GNU General Public License | |||||
| * along with this program; if not, write to the Free Software | |||||
| * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
| */ | |||||
| #include "AnotherFilterPluginGUI.h" | |||||
| #include <FL/fl_draw.h> | |||||
| #include <FL/fl_draw.H> | |||||
| static const int GUI_COLOUR = 179; | |||||
| static const int GUIBG_COLOUR = 144; | |||||
| static const int GUIBG2_COLOUR = 145; | |||||
| //////////////////////////////////////////// | |||||
| AnotherFilterPluginGUI::AnotherFilterPluginGUI(int w, int h,AnotherFilterPlugin *o,ChannelHandler *ch,const HostInfo *Info) : | |||||
| SpiralPluginGUI(w,h,o,ch) | |||||
| { | |||||
| Cutoff = new Fl_Slider(15, 20, 20, 70, "Cutoff"); | |||||
| Cutoff->type(4); | |||||
| Cutoff->selection_color(GUI_COLOUR); | |||||
| Cutoff->labelsize(10); | |||||
| Cutoff->maximum(1); | |||||
| Cutoff->step(0.0001); | |||||
| Cutoff->value(1); | |||||
| Cutoff->callback((Fl_Callback*)cb_Cutoff); | |||||
| Resonance = new Fl_Knob(58, 18, 45, 45, "Emphasis"); | |||||
| Resonance->color(GUI_COLOUR); | |||||
| Resonance->type(Fl_Knob::DOTLIN); | |||||
| Resonance->labelsize(10); | |||||
| Resonance->maximum(1); | |||||
| Resonance->step(0.00001); | |||||
| Resonance->value(0); | |||||
| Resonance->callback((Fl_Callback*)cb_Resonance); | |||||
| end(); | |||||
| } | |||||
| void AnotherFilterPluginGUI::UpdateValues(SpiralPlugin *o) | |||||
| { | |||||
| AnotherFilterPlugin *Plugin = (AnotherFilterPlugin*)o; | |||||
| Cutoff->value(100.0f-sqrt(Plugin->GetCutoff()-10.0f)); | |||||
| Resonance->value(Plugin->GetResonance()-1.0f); | |||||
| } | |||||
| inline void AnotherFilterPluginGUI::cb_Cutoff_i(Fl_Slider* o, void* v) | |||||
| { | |||||
| float value=1.0f-o->value(); | |||||
| m_GUICH->Set("Cutoff",value); | |||||
| } | |||||
| void AnotherFilterPluginGUI::cb_Cutoff(Fl_Slider* o, void* v) | |||||
| { ((AnotherFilterPluginGUI*)(o->parent()))->cb_Cutoff_i(o,v); } | |||||
| inline void AnotherFilterPluginGUI::cb_Resonance_i(Fl_Knob* o, void* v) | |||||
| { m_GUICH->Set("Resonance",(float)o->value()); } | |||||
| void AnotherFilterPluginGUI::cb_Resonance(Fl_Knob* o, void* v) | |||||
| { ((AnotherFilterPluginGUI*)(o->parent()))->cb_Resonance_i(o,v); } | |||||
| const string AnotherFilterPluginGUI::GetHelpText(const string &loc){ | |||||
| return string("") | |||||
| + "Resonant IIR lowpass (12dB/oct) filter\n"; | |||||
| } | |||||
| @@ -0,0 +1,56 @@ | |||||
| /* SpiralPlugin | |||||
| * Copyleft (C) 2000 David Griffiths <dave@pawfal.org> | |||||
| * | |||||
| * This program is free software; you can redistribute it and/or modify | |||||
| * it under the terms of the GNU General Public License as published by | |||||
| * the Free Software Foundation; either version 2 of the License, or | |||||
| * (at your option) any later version. | |||||
| * | |||||
| * This program is distributed in the hope that it will be useful, | |||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * GNU General Public License for more details. | |||||
| * | |||||
| * You should have received a copy of the GNU General Public License | |||||
| * along with this program; if not, write to the Free Software | |||||
| * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
| */ | |||||
| #include <FL/Fl.H> | |||||
| #include <FL/Fl_Window.H> | |||||
| #include <FL/Fl_Group.H> | |||||
| #include <FL/Fl_Slider.H> | |||||
| #include "AnotherFilterPlugin.h" | |||||
| #include "../SpiralPluginGUI.h" | |||||
| #include "../Widgets/Fl_Knob.H" | |||||
| #ifndef GUI | |||||
| #define GUI | |||||
| class AnotherFilterPluginGUI : public SpiralPluginGUI | |||||
| { | |||||
| public: | |||||
| AnotherFilterPluginGUI(int w, int h, AnotherFilterPlugin *o,ChannelHandler *ch,const HostInfo *Info); | |||||
| virtual void UpdateValues(SpiralPlugin *o); | |||||
| protected: | |||||
| const string GetHelpText(const string &loc); | |||||
| private: | |||||
| Fl_Group *GUIFilterGroup; | |||||
| Fl_Slider *Cutoff; | |||||
| Fl_Knob *Resonance; | |||||
| //// Callbacks //// | |||||
| inline void cb_Cutoff_i(Fl_Slider* o, void* v); | |||||
| static void cb_Cutoff(Fl_Slider*, void*); | |||||
| inline void cb_Resonance_i(Fl_Knob* o, void* v); | |||||
| static void cb_Resonance(Fl_Knob* o, void* v); | |||||
| }; | |||||
| #endif | |||||
| @@ -0,0 +1,171 @@ | |||||
| ############################################################################# | |||||
| # Makefile for building AnotherFilterPlugin.so | |||||
| # Generated by tmake at 22:13, 2001/09/17 | |||||
| # Project: AnotherFilterPlugin | |||||
| # Template: app | |||||
| ############################################################################# | |||||
| ####### Compiler, tools and options | |||||
| CC = gcc | |||||
| CXX = g++ | |||||
| CFLAGS = @CFLAGS@ | |||||
| CXXFLAGS= @CXXFLAGS@ | |||||
| INCPATH = -I/usr/X11R6/include | |||||
| LINK = g++ -shared | |||||
| LFLAGS = | |||||
| LIBS = -L/usr/X11R6/lib @FLTK_LIBS@ -lGL -lXext -lX11 -ldl | |||||
| MOC = moc | |||||
| UIC = | |||||
| TAR = tar -cf | |||||
| GZIP = gzip -9f | |||||
| INSTALL = @INSTALL@ | |||||
| ###### Autoconf variables | |||||
| prefix = @prefix@ | |||||
| exec_prefix = @exec_prefix@ | |||||
| bindir = @bindir@ | |||||
| sbindir = @sbindir@ | |||||
| libexecdir = @libexecdir@ | |||||
| datadir = @datadir@ | |||||
| sysconfdir = @sysconfdir@ | |||||
| sharedstatedir = @sharedstatedir@ | |||||
| localstatedir = @localstatedir@ | |||||
| libdir = @libdir@ | |||||
| infodir = @infodir@ | |||||
| mandir = @mandir@ | |||||
| ####### Files | |||||
| HEADERS = ../SpiralPlugin.h \ | |||||
| ../SpiralPluginGUI.h \ | |||||
| ../../ChannelHandler.h \ | |||||
| ../Widgets/Fl_Knob.H \ | |||||
| ../Widgets/Fl_DragBar.H \ | |||||
| ../../Sample.h \ | |||||
| AnotherFilterPlugin.h \ | |||||
| AnotherFilterPluginGUI.h | |||||
| SOURCES = ../SpiralPlugin.C \ | |||||
| ../SpiralPluginGUI.C \ | |||||
| ../../ChannelHandler.C \ | |||||
| ../Widgets/Fl_Knob.cxx \ | |||||
| ../Widgets/Fl_DragBar.cxx \ | |||||
| ../../Sample.C \ | |||||
| AnotherFilterPlugin.C \ | |||||
| AnotherFilterPluginGUI.C | |||||
| OBJECTS = ../SpiralPlugin.o \ | |||||
| ../SpiralPluginGUI.o \ | |||||
| ../../ChannelHandler.o \ | |||||
| ../Widgets/Fl_Knob.o \ | |||||
| ../Widgets/Fl_DragBar.o \ | |||||
| ../../Sample.o \ | |||||
| AnotherFilterPlugin.o \ | |||||
| AnotherFilterPluginGUI.o | |||||
| INTERFACES = | |||||
| UICDECLS = | |||||
| UICIMPLS = | |||||
| SRCMOC = | |||||
| OBJMOC = | |||||
| DIST = | |||||
| TARGET = AnotherFilterPlugin.so | |||||
| ####### Implicit rules | |||||
| .SUFFIXES: .cpp .cxx .cc .C .c | |||||
| .cpp.o: | |||||
| $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< | |||||
| .cxx.o: | |||||
| $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< | |||||
| .cc.o: | |||||
| $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< | |||||
| .C.o: | |||||
| $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< | |||||
| .c.o: | |||||
| $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $< | |||||
| ####### Build rules | |||||
| all: $(TARGET) | |||||
| $(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC) | |||||
| $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS) | |||||
| moc: $(SRCMOC) | |||||
| tmake: | |||||
| tmake AnotherFilterPlugin.pro | |||||
| dist: | |||||
| $(TAR) AnotherFilterPlugin.tar AnotherFilterPlugin.pro $(SOURCES) $(HEADERS) $(INTERFACES) $(DIST) | |||||
| $(GZIP) AnotherFilterPlugin.tar | |||||
| clean: | |||||
| -rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(UICIMPLS) $(UICDECLS) $(TARGET) | |||||
| -rm -f *~ core | |||||
| install: | |||||
| $(INSTALL) $(TARGET) $(libdir)/SpiralPlugins | |||||
| ####### Sub-libraries | |||||
| ###### Combined headers | |||||
| ####### Compile | |||||
| ../SpiralPlugin.o: ../SpiralPlugin.C \ | |||||
| ../SpiralPlugin.h \ | |||||
| ../../Sample.h | |||||
| ../SpiralPluginGUI.o: ../SpiralPluginGUI.C \ | |||||
| ../SpiralPluginGUI.h \ | |||||
| ../Widgets/Fl_DragBar.H \ | |||||
| ../SpiralPlugin.h \ | |||||
| ../../Sample.h | |||||
| ../Widgets/Fl_Knob.o: ../Widgets/Fl_Knob.cxx \ | |||||
| ../Widgets/Fl_Knob.H | |||||
| ../Widgets/Fl_DragBar.o: ../Widgets/Fl_DragBar.cxx \ | |||||
| ../Widgets/Fl_DragBar.H | |||||
| ../../Sample.o: ../../Sample.C \ | |||||
| ../../Sample.h \ | |||||
| ../../SpiralInfo.h | |||||
| AnotherFilterPlugin.o: AnotherFilterPlugin.C \ | |||||
| AnotherFilterPlugin.h \ | |||||
| ../SpiralPlugin.h \ | |||||
| ../../Sample.h \ | |||||
| ../../SpiralInfo.h \ | |||||
| ../../Sample.h \ | |||||
| AnotherFilterPluginGUI.h \ | |||||
| ../SpiralPluginGUI.h \ | |||||
| ../Widgets/Fl_DragBar.H \ | |||||
| ../Widgets/Fl_Knob.H \ | |||||
| SpiralIcon.xpm | |||||
| AnotherFilterPluginGUI.o: AnotherFilterPluginGUI.C \ | |||||
| AnotherFilterPluginGUI.h \ | |||||
| AnotherFilterPlugin.h \ | |||||
| ../SpiralPlugin.h \ | |||||
| ../../Sample.h \ | |||||
| ../../SpiralInfo.h \ | |||||
| ../../Sample.h \ | |||||
| ../SpiralPluginGUI.h \ | |||||
| ../Widgets/Fl_DragBar.H \ | |||||
| ../Widgets/Fl_Knob.H | |||||
| ../../ChannelHandler.o: ../../ChannelHandler.C \ | |||||
| ../../ChannelHandler.h | |||||
| @@ -0,0 +1,314 @@ | |||||
| /* XPM */ | |||||
| static char * SpiralIcon_xpm[] = { | |||||
| "36 36 275 2", | |||||
| " c None", | |||||
| ". c #8B889B", | |||||
| "+ c #9C99AA", | |||||
| "@ c #ADAAB9", | |||||
| "# c #837F94", | |||||
| "$ c #7D7990", | |||||
| "% c #9995A7", | |||||
| "& c #67627C", | |||||
| "* c #CDCBD4", | |||||
| "= c #FCFCFC", | |||||
| "- c #D1D0D8", | |||||
| "; c #FFFFFF", | |||||
| "> c #F1F1F3", | |||||
| ", c #848095", | |||||
| "' c #2A2248", | |||||
| ") c #CFCED6", | |||||
| "! c #68637D", | |||||
| "~ c #ABA8B6", | |||||
| "{ c #D5D3DB", | |||||
| "] c #9490A2", | |||||
| "^ c #C4C4C4", | |||||
| "/ c #1D1C1D", | |||||
| "( c #313134", | |||||
| "_ c #EEEFEE", | |||||
| ": c #FBFBFB", | |||||
| "< c #EFEFEF", | |||||
| "[ c #7B768D", | |||||
| "} c #464060", | |||||
| "| c #DEDEE1", | |||||
| "1 c #CBCACC", | |||||
| "2 c #EEEEF1", | |||||
| "3 c #79758C", | |||||
| "4 c #FBFBFC", | |||||
| "5 c #A2A2A2", | |||||
| "6 c #000000", | |||||
| "7 c #F5F6F5", | |||||
| "8 c #747474", | |||||
| "9 c #2A2A2B", | |||||
| "0 c #403958", | |||||
| "a c #7D788F", | |||||
| "b c #C0BEC8", | |||||
| "c c #BCBAC6", | |||||
| "d c #BCBAC5", | |||||
| "e c #625C79", | |||||
| "f c #2B2932", | |||||
| "g c #191919", | |||||
| "h c #CCCCCC", | |||||
| "i c #807B91", | |||||
| "j c #3B3556", | |||||
| "k c #F2F2F4", | |||||
| "l c #929292", | |||||
| "m c #0E0E0E", | |||||
| "n c #BFBFBF", | |||||
| "o c #111111", | |||||
| "p c #100E15", | |||||
| "q c #868689", | |||||
| "r c #FEFDFE", | |||||
| "s c #D9D7DE", | |||||
| "t c #9C98AA", | |||||
| "u c #FDFCFD", | |||||
| "v c #DDDDDD", | |||||
| "w c #575755", | |||||
| "x c #5E5E5E", | |||||
| "y c #C4C2CD", | |||||
| "z c #423C5C", | |||||
| "A c #F0F0F2", | |||||
| "B c #939393", | |||||
| "C c #555555", | |||||
| "D c #4A4A4A", | |||||
| "E c #010101", | |||||
| "F c #282828", | |||||
| "G c #C2C2C2", | |||||
| "H c #DBDAE0", | |||||
| "I c #615C78", | |||||
| "J c #F6F6F7", | |||||
| "K c #DADADA", | |||||
| "L c #545454", | |||||
| "M c #0F0F0F", | |||||
| "N c #B8B8B8", | |||||
| "O c #48445C", | |||||
| "P c #2B2B2C", | |||||
| "Q c #181900", | |||||
| "R c #D3D3D3", | |||||
| "S c #C1BEC9", | |||||
| "T c #474060", | |||||
| "U c #31294D", | |||||
| "V c #716C85", | |||||
| "W c #65607A", | |||||
| "X c #625D78", | |||||
| "Y c #D5D4DB", | |||||
| "Z c #F7F7F7", | |||||
| "` c #8B8B8B", | |||||
| " . c #161616", | |||||
| ".. c #0C0C0C", | |||||
| "+. c #161800", | |||||
| "@. c #1A1B00", | |||||
| "#. c #060600", | |||||
| "$. c #191A00", | |||||
| "%. c #393643", | |||||
| "&. c #47415F", | |||||
| "*. c #9692A4", | |||||
| "=. c #D9D8DE", | |||||
| "-. c #F7F7F8", | |||||
| ";. c #918DA0", | |||||
| ">. c #B8B5C1", | |||||
| ",. c #D1D1D1", | |||||
| "'. c #212121", | |||||
| "). c #2D2F00", | |||||
| "!. c #111200", | |||||
| "~. c #0B0C00", | |||||
| "{. c #FFF200", | |||||
| "]. c #727175", | |||||
| "^. c #FEFEFF", | |||||
| "/. c #9D99AA", | |||||
| "(. c #DBD9E0", | |||||
| "_. c #E9E9E9", | |||||
| ":. c #CBCBCB", | |||||
| "<. c #E0E0E0", | |||||
| "[. c #6C6C6C", | |||||
| "}. c #050500", | |||||
| "|. c #515151", | |||||
| "1. c #A6A6A7", | |||||
| "2. c #827E93", | |||||
| "3. c #615C77", | |||||
| "4. c #EAEAED", | |||||
| "5. c #DFDFE1", | |||||
| "6. c #1E1D24", | |||||
| "7. c #9894A7", | |||||
| "8. c #B1AEBB", | |||||
| "9. c #69686F", | |||||
| "0. c #000001", | |||||
| "a. c #615C76", | |||||
| "b. c #5F5A75", | |||||
| "c. c #413E4D", | |||||
| "d. c #020203", | |||||
| "e. c #1A1A1C", | |||||
| "f. c #C3C1CB", | |||||
| "g. c #9D9D9D", | |||||
| "h. c #202020", | |||||
| "i. c #383838", | |||||
| "j. c #4C4C4C", | |||||
| "k. c #C9C7D0", | |||||
| "l. c #F1F1F1", | |||||
| "m. c #F8F8F8", | |||||
| "n. c #232323", | |||||
| "o. c #AEACB9", | |||||
| "p. c #FEFEFE", | |||||
| "q. c #1D1D1D", | |||||
| "r. c #B7B5C1", | |||||
| "s. c #9390A2", | |||||
| "t. c #BBBBBB", | |||||
| "u. c #414141", | |||||
| "v. c #030303", | |||||
| "w. c #F4F4F6", | |||||
| "x. c #605B76", | |||||
| "y. c #736E86", | |||||
| "z. c #D8D8D8", | |||||
| "A. c #727272", | |||||
| "B. c #101010", | |||||
| "C. c #CCCBD3", | |||||
| "D. c #747087", | |||||
| "E. c #6D6881", | |||||
| "F. c #1C1C1C", | |||||
| "G. c #242424", | |||||
| "H. c #656566", | |||||
| "I. c #F6F6F6", | |||||
| "J. c #E8E6EA", | |||||
| "K. c #706B84", | |||||
| "L. c #E3E1E6", | |||||
| "M. c #474746", | |||||
| "N. c #151515", | |||||
| "O. c #C8C8C8", | |||||
| "P. c #AEAEAE", | |||||
| "Q. c #010100", | |||||
| "R. c #373639", | |||||
| "S. c #FDFCFE", | |||||
| "T. c #ABA8B7", | |||||
| "U. c #F1F0F3", | |||||
| "V. c #6D6980", | |||||
| "W. c #0A090E", | |||||
| "X. c #95929E", | |||||
| "Y. c #0A0810", | |||||
| "Z. c #0D0D0D", | |||||
| "`. c #050505", | |||||
| " + c #5B5A5C", | |||||
| ".+ c #F7F6F7", | |||||
| "++ c #F4F3F5", | |||||
| "@+ c #908C9F", | |||||
| "#+ c #C8C6D0", | |||||
| "$+ c #837E96", | |||||
| "%+ c #86868A", | |||||
| "&+ c #070608", | |||||
| "*+ c #ECEBEE", | |||||
| "=+ c #5B5571", | |||||
| "-+ c #646078", | |||||
| ";+ c #AFAFB0", | |||||
| ">+ c #454545", | |||||
| ",+ c #363636", | |||||
| "'+ c #7A7A7A", | |||||
| ")+ c #C8C8C9", | |||||
| "!+ c #212025", | |||||
| "~+ c #060607", | |||||
| "{+ c #969699", | |||||
| "]+ c #FAFAFA", | |||||
| "^+ c #F8F8F9", | |||||
| "/+ c #A29EAF", | |||||
| "(+ c #F7F6F8", | |||||
| "_+ c #F0F0F1", | |||||
| ":+ c #B8B7B9", | |||||
| "<+ c #E4E4E4", | |||||
| "[+ c #FDFDFD", | |||||
| "}+ c #A5A2B2", | |||||
| "|+ c #3B3456", | |||||
| "1+ c #A8A5B4", | |||||
| "2+ c #525252", | |||||
| "3+ c #848387", | |||||
| "4+ c #CDCDCD", | |||||
| "5+ c #8D899C", | |||||
| "6+ c #494262", | |||||
| "7+ c #68627C", | |||||
| "8+ c #40395A", | |||||
| "9+ c #ECECEC", | |||||
| "0+ c #020202", | |||||
| "a+ c #B4B5B5", | |||||
| "b+ c #0B0B0B", | |||||
| "c+ c #313232", | |||||
| "d+ c #E3E3E3", | |||||
| "e+ c #B1AEBC", | |||||
| "f+ c #BDBBC6", | |||||
| "g+ c #3C3556", | |||||
| "h+ c #898599", | |||||
| "i+ c #EDEDED", | |||||
| "j+ c #39393A", | |||||
| "k+ c #040404", | |||||
| "l+ c #333333", | |||||
| "m+ c #F5F5F5", | |||||
| "n+ c #2B2B2B", | |||||
| "o+ c #2D2A3D", | |||||
| "p+ c #B6B4C1", | |||||
| "q+ c #F5F5F6", | |||||
| "r+ c #605A76", | |||||
| "s+ c #DAD8DF", | |||||
| "t+ c #F5F4F6", | |||||
| "u+ c #615B76", | |||||
| "v+ c #524D6A", | |||||
| "w+ c #E4E3E8", | |||||
| "x+ c #D5D5D5", | |||||
| "y+ c #1B1B1B", | |||||
| "z+ c #303030", | |||||
| "A+ c #AAABAB", | |||||
| "B+ c #585464", | |||||
| "C+ c #B0AEBB", | |||||
| "D+ c #A29FAF", | |||||
| "E+ c #E9E8E9", | |||||
| "F+ c #787779", | |||||
| "G+ c #0F0E15", | |||||
| "H+ c #2D2D2E", | |||||
| "I+ c #595959", | |||||
| "J+ c #FAFAFB", | |||||
| "K+ c #807B92", | |||||
| "L+ c #B0ADBB", | |||||
| "M+ c #E8E7EB", | |||||
| "N+ c #3A3258", | |||||
| "O+ c #E6E5EA", | |||||
| "P+ c #DFDEE3", | |||||
| "Q+ c #443E5E", | |||||
| "R+ c #BAB8C4", | |||||
| "S+ c #C1BFCA", | |||||
| "T+ c #E0E0E5", | |||||
| "U+ c #D0CED6", | |||||
| "V+ c #362F52", | |||||
| "W+ c #CECCD5", | |||||
| "X+ c #413A5B", | |||||
| "Y+ c #6A657F", | |||||
| "Z+ c #9793A6", | |||||
| " ", | |||||
| " ", | |||||
| " ", | |||||
| " . + @ # $ % ", | |||||
| " & * = * - ; > , ' ; ; ; ) ! ", | |||||
| " ~ ; ; { ] ; ^ / ( _ ; : < [ ", | |||||
| " } | 1 2 3 4 5 6 6 7 : 8 9 0 a b ", | |||||
| " c : d e f g h i j k l 6 m ; n o 6 p q r s ", | |||||
| " t u ; v w 6 6 x y z A B 6 C ; D E 6 F G ; H ", | |||||
| " I J ; ; K L 6 6 M N O P E 6 6 6 Q Q M R S T U V W ", | |||||
| " X Y ; ; ; ; Z ` .6 ..6 6 6 6 6 +.@.#.$.%.&.*.=.-.;. ", | |||||
| " >.; ; ; ; ; ; = ,.'.).!.~.6 {.{.6 6 6 6 E ].^.; ; /. ", | |||||
| " (.; ; _.R h :.<.[.6 }.6 6 6 {.{.6 6 6 6 6 E |.1.4 2. ", | |||||
| " 3.4.; 5...6 6 6 6 6 6 6 6 6 6 {.{.6 6 6 6 6 6 6 6.7. ", | |||||
| " V @ 8.9.0.6 6 6 6 6 6 6 6 6 6 {.{.6 6 6 6 6 6 6 ", | |||||
| " a.b.c.6 d.6 6 6 6 6 6 6 {.{.6 {.{.6 6 6 6 6 6 e. ", | |||||
| " f.; ; g.h.h.i.j.h.6 6 6 6 {.6 6 6 {.{.6 6 6 6 6 6 ", | |||||
| " k.; ; l.m.; ; ; n.6 {.{.{.6 6 6 6 6 {.{.{.{.{.6 6 ", | |||||
| " o.; ; ; ; p.; ; q.6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 r., ", | |||||
| " s.; ; p.; : t.u.v.6 6 6 {.6 {.6 {.6 {.{.{.6 6 6 6 p.w.x. ", | |||||
| " y.; ; ; z.A.B.6 6 6 6 {.6 6 {.6 {.6 {.6 6 6 6 6 6 ; ; C.D. ", | |||||
| " E.J ; : F.6 6 6 6 G...6 {.6 {.6 {.6 {.{.{.6 6 6 H.I.; ; J.K. ", | |||||
| " L.; ; M.6 E 6 N.O.P.{.6 6 6 {.6 6 {.6 Q.6 6 6 6 R.S.; ; > K. ", | |||||
| " T.; U.V.W.6 6 P.p.; X.Y.6 6 6 6 6 6 6 6 Z.`.6 6 6 +.+; ; ++@+ ", | |||||
| " K.#+! $+%+&+x ; ; *+=+-+;+l >+6 6 6 ,+'+)+!+6 6 6 ~+{+]+; ; ^+@ ", | |||||
| " /+(+_+:+<+[+; }+|+1+; I.>+6 6 E 2+; ; 3+6 6 E 6 o 4+; ; = 5+ ", | |||||
| " 6+> ; ; ; ; ; ; 7+8+; ; 9+i.6 6 0+D ; ; a+b+6 6 6 c+d+; ; e+ ", | |||||
| " > ; ; ; ; f+g+h+; ; i+j+6 6 k+l+; ; m+n+6 6 o+p+; q+3 ", | |||||
| " r+s+= ; t+u+v+w+; ; x+y+6 6 0+z+; ; ; A+2+B+ ", | |||||
| " C+4 D+ X ; ; ; E+F+z+G+H+I+; ; ; p.J+K+ ", | |||||
| " L+; ; ; ; ; M+N+O+; ; ; ; = P+Q+ ", | |||||
| " R+S+T+4 ; ; U+V+W+; ; ; s h+T ", | |||||
| " X+ Y+Z+h+ ", | |||||
| " ", | |||||
| " ", | |||||
| " "}; | |||||
| @@ -0,0 +1,174 @@ | |||||
| /* SpiralSound | |||||
| * Copyleft (C) 2001 David Griffiths <dave@pawfal.org> | |||||
| * | |||||
| * This program is free software; you can redistribute it and/or modify | |||||
| * it under the terms of the GNU General Public License as published by | |||||
| * the Free Software Foundation; either version 2 of the License, or | |||||
| * (at your option) any later version. | |||||
| * | |||||
| * This program is distributed in the hope that it will be useful, | |||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * GNU General Public License for more details. | |||||
| * | |||||
| * You should have received a copy of the GNU General Public License | |||||
| * along with this program; if not, write to the Free Software | |||||
| * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
| */ | |||||
| #include <math.h> | |||||
| #include "FormantFilterPlugin.h" | |||||
| #include "FormantFilterPluginGUI.h" | |||||
| #include <FL/Fl_Button.h> | |||||
| #include "SpiralIcon.xpm" | |||||
| /* | |||||
| Public source code by alex@smartelectronix.com | |||||
| Simple example of implementation of formant filter | |||||
| Vowelnum can be 0,1,2,3,4 <=> A,E,I,O,U | |||||
| Good for spectral rich input like saw or square | |||||
| */ | |||||
| //-------------------------------------------------------------VOWEL COEFFICIENTS | |||||
| const double coeff[5][11]= { | |||||
| { 8.11044e-06, | |||||
| 8.943665402, -36.83889529, 92.01697887, -154.337906, 181.6233289, | |||||
| -151.8651235, 89.09614114, -35.10298511, 8.388101016, -0.923313471 ///A | |||||
| }, | |||||
| {4.36215e-06, | |||||
| 8.90438318, -36.55179099, 91.05750846, -152.422234, 179.1170248, ///E | |||||
| -149.6496211,87.78352223, -34.60687431, 8.282228154, -0.914150747 | |||||
| }, | |||||
| { 3.33819e-06, | |||||
| 8.893102966, -36.49532826, 90.96543286, -152.4545478, 179.4835618, | |||||
| -150.315433, 88.43409371, -34.98612086, 8.407803364, -0.932568035 ///I | |||||
| }, | |||||
| {1.13572e-06, | |||||
| 8.994734087, -37.2084849, 93.22900521, -156.6929844, 184.596544, ///O | |||||
| -154.3755513, 90.49663749, -35.58964535, 8.478996281, -0.929252233 | |||||
| }, | |||||
| {4.09431e-07, | |||||
| 8.997322763, -37.20218544, 93.11385476, -156.2530937, 183.7080141, ///U | |||||
| -153.2631681, 89.59539726, -35.12454591, 8.338655623, -0.910251753 | |||||
| } | |||||
| }; | |||||
| //--------------------------------------------------------------------------------- | |||||
| static double memory[5][10]={{0,0,0,0,0,0,0,0,0,0}, | |||||
| {0,0,0,0,0,0,0,0,0,0}, | |||||
| {0,0,0,0,0,0,0,0,0,0}, | |||||
| {0,0,0,0,0,0,0,0,0,0}, | |||||
| {0,0,0,0,0,0,0,0,0,0}}; | |||||
| //--------------------------------------------------------------------------------- | |||||
| extern "C" { | |||||
| SpiralPlugin* CreateInstance() | |||||
| { | |||||
| return new FormantFilterPlugin; | |||||
| } | |||||
| char** GetIcon() | |||||
| { | |||||
| return SpiralIcon_xpm; | |||||
| } | |||||
| int GetID() | |||||
| { | |||||
| return 42; | |||||
| } | |||||
| } | |||||
| /////////////////////////////////////////////////////// | |||||
| FormantFilterPlugin::FormantFilterPlugin() : | |||||
| m_Vowel(0) | |||||
| { | |||||
| m_PluginInfo.Name="FormantFilter"; | |||||
| m_PluginInfo.Width=90; | |||||
| m_PluginInfo.Height=110; | |||||
| m_PluginInfo.NumInputs=2; | |||||
| m_PluginInfo.NumOutputs=1; | |||||
| m_PluginInfo.PortTips.push_back("Input"); | |||||
| m_PluginInfo.PortTips.push_back("Vowel CV"); | |||||
| m_PluginInfo.PortTips.push_back("Output"); | |||||
| m_AudioCH->Register("Vowel",&m_Vowel); | |||||
| } | |||||
| FormantFilterPlugin::~FormantFilterPlugin() | |||||
| { | |||||
| } | |||||
| PluginInfo &FormantFilterPlugin::Initialise(const HostInfo *Host) | |||||
| { | |||||
| return SpiralPlugin::Initialise(Host); | |||||
| } | |||||
| SpiralGUIType *FormantFilterPlugin::CreateGUI() | |||||
| { | |||||
| return new FormantFilterPluginGUI(m_PluginInfo.Width, | |||||
| m_PluginInfo.Height, | |||||
| this,m_AudioCH,m_HostInfo); | |||||
| } | |||||
| void FormantFilterPlugin::Execute() | |||||
| { | |||||
| float res,o[5],out=0; | |||||
| for (int n=0; n<m_HostInfo->BUFSIZE; n++) | |||||
| { | |||||
| for (int v=0; v<5; v++) | |||||
| { | |||||
| res= (float) (coeff[v][0]*(GetInput(0,n)*0.1f) + | |||||
| coeff[v][1]*memory[v][0] + | |||||
| coeff[v][2]*memory[v][1] + | |||||
| coeff[v][3]*memory[v][2] + | |||||
| coeff[v][4]*memory[v][3] + | |||||
| coeff[v][5]*memory[v][4] + | |||||
| coeff[v][6]*memory[v][5] + | |||||
| coeff[v][7]*memory[v][6] + | |||||
| coeff[v][8]*memory[v][7] + | |||||
| coeff[v][9]*memory[v][8] + | |||||
| coeff[v][10]*memory[v][9] ); | |||||
| memory[v][9]=memory[v][8]; | |||||
| memory[v][8]=memory[v][7]; | |||||
| memory[v][7]=memory[v][6]; | |||||
| memory[v][6]=memory[v][5]; | |||||
| memory[v][5]=memory[v][4]; | |||||
| memory[v][4]=memory[v][3]; | |||||
| memory[v][3]=memory[v][2]; | |||||
| memory[v][2]=memory[v][1]; | |||||
| memory[v][1]=memory[v][0]; | |||||
| memory[v][0]=(double) res; | |||||
| o[v]=res; | |||||
| } | |||||
| if (InputExists(1)) m_Vowel=fabs(GetInput(1,n))*4.0f; | |||||
| // mix between vowel sounds | |||||
| if (m_Vowel<1) out=Linear(0,1,m_Vowel,o[1],o[0]); | |||||
| else if (m_Vowel>1 && m_Vowel<2) out=Linear(0,1,m_Vowel-1.0f,o[2],o[1]); | |||||
| else if (m_Vowel>2 && m_Vowel<3) out=Linear(0,1,m_Vowel-2.0f,o[3],o[2]); | |||||
| else if (m_Vowel>3 && m_Vowel<4) out=Linear(0,1,m_Vowel-3.0f,o[4],o[3]); | |||||
| else if (m_Vowel==4) out=o[4]; | |||||
| SetOutput(0,n,out); | |||||
| } | |||||
| } | |||||
| void FormantFilterPlugin::Randomise() | |||||
| { | |||||
| } | |||||
| void FormantFilterPlugin::StreamOut(ostream &s) | |||||
| { | |||||
| s<<m_Version<<" "<<m_Vowel<<" "; | |||||
| } | |||||
| void FormantFilterPlugin::StreamIn(istream &s) | |||||
| { | |||||
| int version; | |||||
| s>>version; | |||||
| s>>m_Vowel; | |||||
| } | |||||
| @@ -0,0 +1,50 @@ | |||||
| /* SpiralSound | |||||
| * Copyleft (C) 2001 David Griffiths <dave@pawfal.org> | |||||
| * | |||||
| * This program is free software; you can redistribute it and/or modify | |||||
| * it under the terms of the GNU General Public License as published by | |||||
| * the Free Software Foundation; either version 2 of the License, or | |||||
| * (at your option) any later version. | |||||
| * | |||||
| * This program is distributed in the hope that it will be useful, | |||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * GNU General Public License for more details. | |||||
| * | |||||
| * You should have received a copy of the GNU General Public License | |||||
| * along with this program; if not, write to the Free Software | |||||
| * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
| */ | |||||
| #include "../SpiralPlugin.h" | |||||
| #include <FL/Fl_Pixmap.H> | |||||
| #ifndef FormantFilterPLUGIN | |||||
| #define FormantFilterPLUGIN | |||||
| class FormantFilterPlugin : public SpiralPlugin | |||||
| { | |||||
| public: | |||||
| FormantFilterPlugin(); | |||||
| virtual ~FormantFilterPlugin(); | |||||
| virtual PluginInfo &Initialise(const HostInfo *Host); | |||||
| virtual SpiralGUIType *CreateGUI(); | |||||
| virtual void Execute(); | |||||
| virtual void StreamOut(ostream &s); | |||||
| virtual void StreamIn(istream &s); | |||||
| void Randomise(); | |||||
| void Clear(); | |||||
| float GetVowel() { return m_Vowel; } | |||||
| private: | |||||
| float m_Vowel; | |||||
| friend istream &operator>>(istream &s, FormantFilterPlugin &o); | |||||
| friend ostream &operator<<(ostream &s, FormantFilterPlugin &o); | |||||
| }; | |||||
| istream &operator>>(istream &s, FormantFilterPlugin &o); | |||||
| ostream &operator<<(ostream &s, FormantFilterPlugin &o); | |||||
| #endif | |||||
| @@ -0,0 +1,85 @@ | |||||
| /* SpiralPlugin | |||||
| * Copyleft (C) 2000 David Griffiths <dave@pawfal.org> | |||||
| * | |||||
| * This program is free software; you can redistribute it and/or modify | |||||
| * it under the terms of the GNU General Public License as published by | |||||
| * the Free Software Foundation; either version 2 of the License, or | |||||
| * (at your option) any later version. | |||||
| * | |||||
| * This program is distributed in the hope that it will be useful, | |||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * GNU General Public License for more details. | |||||
| * | |||||
| * You should have received a copy of the GNU General Public License | |||||
| * along with this program; if not, write to the Free Software | |||||
| * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
| */ | |||||
| #include "FormantFilterPluginGUI.h" | |||||
| #include <FL/fl_draw.h> | |||||
| #include <FL/fl_draw.H> | |||||
| static const int GUI_COLOUR = 179; | |||||
| static const int GUIBG_COLOUR = 144; | |||||
| static const int GUIBG2_COLOUR = 145; | |||||
| //////////////////////////////////////////// | |||||
| FormantFilterPluginGUI::FormantFilterPluginGUI(int w, int h,FormantFilterPlugin *o,ChannelHandler *ch,const HostInfo *Info) : | |||||
| SpiralPluginGUI(w,h,o,ch) | |||||
| { | |||||
| Selection = new Fl_Knob(20, 18, 45, 45, "Vowel"); | |||||
| Selection->color(GUI_COLOUR); | |||||
| Selection->type(Fl_Knob::DOTLIN); | |||||
| Selection->labelsize(10); | |||||
| Selection->maximum(4); | |||||
| Selection->step(0.0001); | |||||
| Selection->value(0); | |||||
| Selection->callback((Fl_Callback*)cb_Selection); | |||||
| Display = new Fl_Output(30,80,30,20,""); | |||||
| Display->color(GUI_COLOUR); | |||||
| Display->set_output(); | |||||
| end(); | |||||
| } | |||||
| void FormantFilterPluginGUI::UpdateValues(SpiralPlugin *o) | |||||
| { | |||||
| FormantFilterPlugin *Plugin = (FormantFilterPlugin*)o; | |||||
| Selection->value(Plugin->GetVowel()); | |||||
| float v=Plugin->GetVowel(); | |||||
| if (v<1) Display->value("A"); | |||||
| if (v>1 && v<2) Display->value("E"); | |||||
| if (v>2 && v<3) Display->value("I"); | |||||
| if (v>3 && v<4) Display->value("O"); | |||||
| if (v==4) Display->value("U"); | |||||
| } | |||||
| inline void FormantFilterPluginGUI::cb_Selection_i(Fl_Knob* o, void* v) | |||||
| { | |||||
| m_GUICH->Set("Vowel",(float)o->value()); | |||||
| float vf=o->value(); | |||||
| if (vf<1) Display->value("A"); | |||||
| if (vf>1 && vf<2) Display->value("E"); | |||||
| if (vf>2 && vf<3) Display->value("I"); | |||||
| if (vf>3 && vf<4) Display->value("O"); | |||||
| if (vf==4) Display->value("U"); | |||||
| } | |||||
| void FormantFilterPluginGUI::cb_Selection(Fl_Knob* o, void* v) | |||||
| { ((FormantFilterPluginGUI*)(o->parent()))->cb_Selection_i(o,v); } | |||||
| const string FormantFilterPluginGUI::GetHelpText(const string &loc){ | |||||
| return string("") | |||||
| + "A formant filter for synthesising vowel sounds by filtering\n" | |||||
| + "high harmonic input waveforms.\n" | |||||
| + "From the great www.musicdsp.org site, I've added linear\n" | |||||
| + "interpolation between the filters so you can sweep them with\n" | |||||
| + "an external CV if desired"; | |||||
| } | |||||
| @@ -0,0 +1,52 @@ | |||||
| /* SpiralPlugin | |||||
| * Copyleft (C) 2000 David Griffiths <dave@pawfal.org> | |||||
| * | |||||
| * This program is free software; you can redistribute it and/or modify | |||||
| * it under the terms of the GNU General Public License as published by | |||||
| * the Free Software Foundation; either version 2 of the License, or | |||||
| * (at your option) any later version. | |||||
| * | |||||
| * This program is distributed in the hope that it will be useful, | |||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| * GNU General Public License for more details. | |||||
| * | |||||
| * You should have received a copy of the GNU General Public License | |||||
| * along with this program; if not, write to the Free Software | |||||
| * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
| */ | |||||
| #include <FL/Fl.H> | |||||
| #include <FL/Fl_Window.H> | |||||
| #include <FL/Fl_Group.H> | |||||
| #include <FL/Fl_Output.H> | |||||
| #include "FormantFilterPlugin.h" | |||||
| #include "../SpiralPluginGUI.h" | |||||
| #include "../Widgets/Fl_Knob.H" | |||||
| #ifndef GUI | |||||
| #define GUI | |||||
| class FormantFilterPluginGUI : public SpiralPluginGUI | |||||
| { | |||||
| public: | |||||
| FormantFilterPluginGUI(int w, int h, FormantFilterPlugin *o,ChannelHandler *ch,const HostInfo *Info); | |||||
| virtual void UpdateValues(SpiralPlugin *o); | |||||
| protected: | |||||
| const string GetHelpText(const string &loc); | |||||
| private: | |||||
| Fl_Knob *Selection; | |||||
| Fl_Output *Display; | |||||
| //// Callbacks //// | |||||
| inline void cb_Selection_i(Fl_Knob* o, void* v); | |||||
| static void cb_Selection(Fl_Knob* o, void* v); | |||||
| }; | |||||
| #endif | |||||
| @@ -0,0 +1,171 @@ | |||||
| ############################################################################# | |||||
| # Makefile for building FormantFilterPlugin.so | |||||
| # Generated by tmake at 22:13, 2001/09/17 | |||||
| # Project: FormantFilterPlugin | |||||
| # Template: app | |||||
| ############################################################################# | |||||
| ####### Compiler, tools and options | |||||
| CC = gcc | |||||
| CXX = g++ | |||||
| CFLAGS = @CFLAGS@ | |||||
| CXXFLAGS= @CXXFLAGS@ | |||||
| INCPATH = -I/usr/X11R6/include | |||||
| LINK = g++ -shared | |||||
| LFLAGS = | |||||
| LIBS = -L/usr/X11R6/lib @FLTK_LIBS@ -lGL -lXext -lX11 -ldl | |||||
| MOC = moc | |||||
| UIC = | |||||
| TAR = tar -cf | |||||
| GZIP = gzip -9f | |||||
| INSTALL = @INSTALL@ | |||||
| ###### Autoconf variables | |||||
| prefix = @prefix@ | |||||
| exec_prefix = @exec_prefix@ | |||||
| bindir = @bindir@ | |||||
| sbindir = @sbindir@ | |||||
| libexecdir = @libexecdir@ | |||||
| datadir = @datadir@ | |||||
| sysconfdir = @sysconfdir@ | |||||
| sharedstatedir = @sharedstatedir@ | |||||
| localstatedir = @localstatedir@ | |||||
| libdir = @libdir@ | |||||
| infodir = @infodir@ | |||||
| mandir = @mandir@ | |||||
| ####### Files | |||||
| HEADERS = ../SpiralPlugin.h \ | |||||
| ../SpiralPluginGUI.h \ | |||||
| ../../ChannelHandler.h \ | |||||
| ../Widgets/Fl_Knob.H \ | |||||
| ../Widgets/Fl_DragBar.H \ | |||||
| ../../Sample.h \ | |||||
| FormantFilterPlugin.h \ | |||||
| FormantFilterPluginGUI.h | |||||
| SOURCES = ../SpiralPlugin.C \ | |||||
| ../SpiralPluginGUI.C \ | |||||
| ../../ChannelHandler.C \ | |||||
| ../Widgets/Fl_Knob.cxx \ | |||||
| ../Widgets/Fl_DragBar.cxx \ | |||||
| ../../Sample.C \ | |||||
| FormantFilterPlugin.C \ | |||||
| FormantFilterPluginGUI.C | |||||
| OBJECTS = ../SpiralPlugin.o \ | |||||
| ../SpiralPluginGUI.o \ | |||||
| ../../ChannelHandler.o \ | |||||
| ../Widgets/Fl_Knob.o \ | |||||
| ../Widgets/Fl_DragBar.o \ | |||||
| ../../Sample.o \ | |||||
| FormantFilterPlugin.o \ | |||||
| FormantFilterPluginGUI.o | |||||
| INTERFACES = | |||||
| UICDECLS = | |||||
| UICIMPLS = | |||||
| SRCMOC = | |||||
| OBJMOC = | |||||
| DIST = | |||||
| TARGET = FormantFilterPlugin.so | |||||
| ####### Implicit rules | |||||
| .SUFFIXES: .cpp .cxx .cc .C .c | |||||
| .cpp.o: | |||||
| $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< | |||||
| .cxx.o: | |||||
| $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< | |||||
| .cc.o: | |||||
| $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< | |||||
| .C.o: | |||||
| $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< | |||||
| .c.o: | |||||
| $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $< | |||||
| ####### Build rules | |||||
| all: $(TARGET) | |||||
| $(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC) | |||||
| $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS) | |||||
| moc: $(SRCMOC) | |||||
| tmake: | |||||
| tmake FormantFilterPlugin.pro | |||||
| dist: | |||||
| $(TAR) FormantFilterPlugin.tar FormantFilterPlugin.pro $(SOURCES) $(HEADERS) $(INTERFACES) $(DIST) | |||||
| $(GZIP) FormantFilterPlugin.tar | |||||
| clean: | |||||
| -rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(UICIMPLS) $(UICDECLS) $(TARGET) | |||||
| -rm -f *~ core | |||||
| install: | |||||
| $(INSTALL) $(TARGET) $(libdir)/SpiralPlugins | |||||
| ####### Sub-libraries | |||||
| ###### Combined headers | |||||
| ####### Compile | |||||
| ../SpiralPlugin.o: ../SpiralPlugin.C \ | |||||
| ../SpiralPlugin.h \ | |||||
| ../../Sample.h | |||||
| ../SpiralPluginGUI.o: ../SpiralPluginGUI.C \ | |||||
| ../SpiralPluginGUI.h \ | |||||
| ../Widgets/Fl_DragBar.H \ | |||||
| ../SpiralPlugin.h \ | |||||
| ../../Sample.h | |||||
| ../Widgets/Fl_Knob.o: ../Widgets/Fl_Knob.cxx \ | |||||
| ../Widgets/Fl_Knob.H | |||||
| ../Widgets/Fl_DragBar.o: ../Widgets/Fl_DragBar.cxx \ | |||||
| ../Widgets/Fl_DragBar.H | |||||
| ../../Sample.o: ../../Sample.C \ | |||||
| ../../Sample.h \ | |||||
| ../../SpiralInfo.h | |||||
| FormantFilterPlugin.o: FormantFilterPlugin.C \ | |||||
| FormantFilterPlugin.h \ | |||||
| ../SpiralPlugin.h \ | |||||
| ../../Sample.h \ | |||||
| ../../SpiralInfo.h \ | |||||
| ../../Sample.h \ | |||||
| FormantFilterPluginGUI.h \ | |||||
| ../SpiralPluginGUI.h \ | |||||
| ../Widgets/Fl_DragBar.H \ | |||||
| ../Widgets/Fl_Knob.H \ | |||||
| SpiralIcon.xpm | |||||
| FormantFilterPluginGUI.o: FormantFilterPluginGUI.C \ | |||||
| FormantFilterPluginGUI.h \ | |||||
| FormantFilterPlugin.h \ | |||||
| ../SpiralPlugin.h \ | |||||
| ../../Sample.h \ | |||||
| ../../SpiralInfo.h \ | |||||
| ../../Sample.h \ | |||||
| ../SpiralPluginGUI.h \ | |||||
| ../Widgets/Fl_DragBar.H \ | |||||
| ../Widgets/Fl_Knob.H | |||||
| ../../ChannelHandler.o: ../../ChannelHandler.C \ | |||||
| ../../ChannelHandler.h | |||||
| @@ -0,0 +1,314 @@ | |||||
| /* XPM */ | |||||
| static char * SpiralIcon_xpm[] = { | |||||
| "36 36 275 2", | |||||
| " c None", | |||||
| ". c #8B889B", | |||||
| "+ c #9C99AA", | |||||
| "@ c #ADAAB9", | |||||
| "# c #837F94", | |||||
| "$ c #7D7990", | |||||
| "% c #9995A7", | |||||
| "& c #67627C", | |||||
| "* c #CDCBD4", | |||||
| "= c #FCFCFC", | |||||
| "- c #D1D0D8", | |||||
| "; c #FFFFFF", | |||||
| "> c #F1F1F3", | |||||
| ", c #848095", | |||||
| "' c #2A2248", | |||||
| ") c #CFCED6", | |||||
| "! c #68637D", | |||||
| "~ c #ABA8B6", | |||||
| "{ c #D5D3DB", | |||||
| "] c #9490A2", | |||||
| "^ c #C4C4C4", | |||||
| "/ c #1D1C1D", | |||||
| "( c #313134", | |||||
| "_ c #EEEFEE", | |||||
| ": c #FBFBFB", | |||||
| "< c #EFEFEF", | |||||
| "[ c #7B768D", | |||||
| "} c #464060", | |||||
| "| c #DEDEE1", | |||||
| "1 c #CBCACC", | |||||
| "2 c #EEEEF1", | |||||
| "3 c #79758C", | |||||
| "4 c #FBFBFC", | |||||
| "5 c #A2A2A2", | |||||
| "6 c #000000", | |||||
| "7 c #F5F6F5", | |||||
| "8 c #747474", | |||||
| "9 c #2A2A2B", | |||||
| "0 c #403958", | |||||
| "a c #7D788F", | |||||
| "b c #C0BEC8", | |||||
| "c c #BCBAC6", | |||||
| "d c #BCBAC5", | |||||
| "e c #625C79", | |||||
| "f c #2B2932", | |||||
| "g c #191919", | |||||
| "h c #CCCCCC", | |||||
| "i c #807B91", | |||||
| "j c #3B3556", | |||||
| "k c #F2F2F4", | |||||
| "l c #929292", | |||||
| "m c #0E0E0E", | |||||
| "n c #BFBFBF", | |||||
| "o c #111111", | |||||
| "p c #100E15", | |||||
| "q c #868689", | |||||
| "r c #FEFDFE", | |||||
| "s c #D9D7DE", | |||||
| "t c #9C98AA", | |||||
| "u c #FDFCFD", | |||||
| "v c #DDDDDD", | |||||
| "w c #575755", | |||||
| "x c #5E5E5E", | |||||
| "y c #C4C2CD", | |||||
| "z c #423C5C", | |||||
| "A c #F0F0F2", | |||||
| "B c #939393", | |||||
| "C c #555555", | |||||
| "D c #4A4A4A", | |||||
| "E c #010101", | |||||
| "F c #282828", | |||||
| "G c #C2C2C2", | |||||
| "H c #DBDAE0", | |||||
| "I c #615C78", | |||||
| "J c #F6F6F7", | |||||
| "K c #DADADA", | |||||
| "L c #545454", | |||||
| "M c #0F0F0F", | |||||
| "N c #B8B8B8", | |||||
| "O c #48445C", | |||||
| "P c #2B2B2C", | |||||
| "Q c #181900", | |||||
| "R c #D3D3D3", | |||||
| "S c #C1BEC9", | |||||
| "T c #474060", | |||||
| "U c #31294D", | |||||
| "V c #716C85", | |||||
| "W c #65607A", | |||||
| "X c #625D78", | |||||
| "Y c #D5D4DB", | |||||
| "Z c #F7F7F7", | |||||
| "` c #8B8B8B", | |||||
| " . c #161616", | |||||
| ".. c #0C0C0C", | |||||
| "+. c #161800", | |||||
| "@. c #1A1B00", | |||||
| "#. c #060600", | |||||
| "$. c #191A00", | |||||
| "%. c #393643", | |||||
| "&. c #47415F", | |||||
| "*. c #9692A4", | |||||
| "=. c #D9D8DE", | |||||
| "-. c #F7F7F8", | |||||
| ";. c #918DA0", | |||||
| ">. c #B8B5C1", | |||||
| ",. c #D1D1D1", | |||||
| "'. c #212121", | |||||
| "). c #2D2F00", | |||||
| "!. c #111200", | |||||
| "~. c #0B0C00", | |||||
| "{. c #FFF200", | |||||
| "]. c #727175", | |||||
| "^. c #FEFEFF", | |||||
| "/. c #9D99AA", | |||||
| "(. c #DBD9E0", | |||||
| "_. c #E9E9E9", | |||||
| ":. c #CBCBCB", | |||||
| "<. c #E0E0E0", | |||||
| "[. c #6C6C6C", | |||||
| "}. c #050500", | |||||
| "|. c #515151", | |||||
| "1. c #A6A6A7", | |||||
| "2. c #827E93", | |||||
| "3. c #615C77", | |||||
| "4. c #EAEAED", | |||||
| "5. c #DFDFE1", | |||||
| "6. c #1E1D24", | |||||
| "7. c #9894A7", | |||||
| "8. c #B1AEBB", | |||||
| "9. c #69686F", | |||||
| "0. c #000001", | |||||
| "a. c #615C76", | |||||
| "b. c #5F5A75", | |||||
| "c. c #413E4D", | |||||
| "d. c #020203", | |||||
| "e. c #1A1A1C", | |||||
| "f. c #C3C1CB", | |||||
| "g. c #9D9D9D", | |||||
| "h. c #202020", | |||||
| "i. c #383838", | |||||
| "j. c #4C4C4C", | |||||
| "k. c #C9C7D0", | |||||
| "l. c #F1F1F1", | |||||
| "m. c #F8F8F8", | |||||
| "n. c #232323", | |||||
| "o. c #AEACB9", | |||||
| "p. c #FEFEFE", | |||||
| "q. c #1D1D1D", | |||||
| "r. c #B7B5C1", | |||||
| "s. c #9390A2", | |||||
| "t. c #BBBBBB", | |||||
| "u. c #414141", | |||||
| "v. c #030303", | |||||
| "w. c #F4F4F6", | |||||
| "x. c #605B76", | |||||
| "y. c #736E86", | |||||
| "z. c #D8D8D8", | |||||
| "A. c #727272", | |||||
| "B. c #101010", | |||||
| "C. c #CCCBD3", | |||||
| "D. c #747087", | |||||
| "E. c #6D6881", | |||||
| "F. c #1C1C1C", | |||||
| "G. c #242424", | |||||
| "H. c #656566", | |||||
| "I. c #F6F6F6", | |||||
| "J. c #E8E6EA", | |||||
| "K. c #706B84", | |||||
| "L. c #E3E1E6", | |||||
| "M. c #474746", | |||||
| "N. c #151515", | |||||
| "O. c #C8C8C8", | |||||
| "P. c #AEAEAE", | |||||
| "Q. c #010100", | |||||
| "R. c #373639", | |||||
| "S. c #FDFCFE", | |||||
| "T. c #ABA8B7", | |||||
| "U. c #F1F0F3", | |||||
| "V. c #6D6980", | |||||
| "W. c #0A090E", | |||||
| "X. c #95929E", | |||||
| "Y. c #0A0810", | |||||
| "Z. c #0D0D0D", | |||||
| "`. c #050505", | |||||
| " + c #5B5A5C", | |||||
| ".+ c #F7F6F7", | |||||
| "++ c #F4F3F5", | |||||
| "@+ c #908C9F", | |||||
| "#+ c #C8C6D0", | |||||
| "$+ c #837E96", | |||||
| "%+ c #86868A", | |||||
| "&+ c #070608", | |||||
| "*+ c #ECEBEE", | |||||
| "=+ c #5B5571", | |||||
| "-+ c #646078", | |||||
| ";+ c #AFAFB0", | |||||
| ">+ c #454545", | |||||
| ",+ c #363636", | |||||
| "'+ c #7A7A7A", | |||||
| ")+ c #C8C8C9", | |||||
| "!+ c #212025", | |||||
| "~+ c #060607", | |||||
| "{+ c #969699", | |||||
| "]+ c #FAFAFA", | |||||
| "^+ c #F8F8F9", | |||||
| "/+ c #A29EAF", | |||||
| "(+ c #F7F6F8", | |||||
| "_+ c #F0F0F1", | |||||
| ":+ c #B8B7B9", | |||||
| "<+ c #E4E4E4", | |||||
| "[+ c #FDFDFD", | |||||
| "}+ c #A5A2B2", | |||||
| "|+ c #3B3456", | |||||
| "1+ c #A8A5B4", | |||||
| "2+ c #525252", | |||||
| "3+ c #848387", | |||||
| "4+ c #CDCDCD", | |||||
| "5+ c #8D899C", | |||||
| "6+ c #494262", | |||||
| "7+ c #68627C", | |||||
| "8+ c #40395A", | |||||
| "9+ c #ECECEC", | |||||
| "0+ c #020202", | |||||
| "a+ c #B4B5B5", | |||||
| "b+ c #0B0B0B", | |||||
| "c+ c #313232", | |||||
| "d+ c #E3E3E3", | |||||
| "e+ c #B1AEBC", | |||||
| "f+ c #BDBBC6", | |||||
| "g+ c #3C3556", | |||||
| "h+ c #898599", | |||||
| "i+ c #EDEDED", | |||||
| "j+ c #39393A", | |||||
| "k+ c #040404", | |||||
| "l+ c #333333", | |||||
| "m+ c #F5F5F5", | |||||
| "n+ c #2B2B2B", | |||||
| "o+ c #2D2A3D", | |||||
| "p+ c #B6B4C1", | |||||
| "q+ c #F5F5F6", | |||||
| "r+ c #605A76", | |||||
| "s+ c #DAD8DF", | |||||
| "t+ c #F5F4F6", | |||||
| "u+ c #615B76", | |||||
| "v+ c #524D6A", | |||||
| "w+ c #E4E3E8", | |||||
| "x+ c #D5D5D5", | |||||
| "y+ c #1B1B1B", | |||||
| "z+ c #303030", | |||||
| "A+ c #AAABAB", | |||||
| "B+ c #585464", | |||||
| "C+ c #B0AEBB", | |||||
| "D+ c #A29FAF", | |||||
| "E+ c #E9E8E9", | |||||
| "F+ c #787779", | |||||
| "G+ c #0F0E15", | |||||
| "H+ c #2D2D2E", | |||||
| "I+ c #595959", | |||||
| "J+ c #FAFAFB", | |||||
| "K+ c #807B92", | |||||
| "L+ c #B0ADBB", | |||||
| "M+ c #E8E7EB", | |||||
| "N+ c #3A3258", | |||||
| "O+ c #E6E5EA", | |||||
| "P+ c #DFDEE3", | |||||
| "Q+ c #443E5E", | |||||
| "R+ c #BAB8C4", | |||||
| "S+ c #C1BFCA", | |||||
| "T+ c #E0E0E5", | |||||
| "U+ c #D0CED6", | |||||
| "V+ c #362F52", | |||||
| "W+ c #CECCD5", | |||||
| "X+ c #413A5B", | |||||
| "Y+ c #6A657F", | |||||
| "Z+ c #9793A6", | |||||
| " ", | |||||
| " ", | |||||
| " ", | |||||
| " . + @ # $ % ", | |||||
| " & * = * - ; > , ' ; ; ; ) ! ", | |||||
| " ~ ; ; { ] ; ^ / ( _ ; : < [ ", | |||||
| " } | 1 2 3 4 5 6 6 7 : 8 9 0 a b ", | |||||
| " c : d e f g h i j k l 6 m ; n o 6 p q r s ", | |||||
| " t u ; v w 6 6 x y z A B 6 C ; D E 6 F G ; H ", | |||||
| " I J ; ; K L 6 6 M N O P E 6 6 6 Q Q M R S T U V W ", | |||||
| " X Y ; ; ; ; Z ` .6 ..6 6 6 6 6 +.@.#.$.%.&.*.=.-.;. ", | |||||
| " >.; ; ; ; ; ; = ,.'.).!.~.6 {.{.6 6 6 6 E ].^.; ; /. ", | |||||
| " (.; ; _.R h :.<.[.6 }.6 6 6 {.{.6 6 6 6 6 E |.1.4 2. ", | |||||
| " 3.4.; 5...6 6 6 6 6 6 6 6 6 6 {.{.6 6 6 6 6 6 6 6.7. ", | |||||
| " V @ 8.9.0.6 6 6 6 6 6 6 6 6 6 {.{.6 6 6 6 6 6 6 ", | |||||
| " a.b.c.6 d.6 6 6 6 6 6 6 {.{.6 {.{.6 6 6 6 6 6 e. ", | |||||
| " f.; ; g.h.h.i.j.h.6 6 6 6 {.6 6 6 {.{.6 6 6 6 6 6 ", | |||||
| " k.; ; l.m.; ; ; n.6 {.{.{.6 6 6 6 6 {.{.{.{.{.6 6 ", | |||||
| " o.; ; ; ; p.; ; q.6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 r., ", | |||||
| " s.; ; p.; : t.u.v.6 6 6 {.6 {.6 {.6 {.{.{.6 6 6 6 p.w.x. ", | |||||
| " y.; ; ; z.A.B.6 6 6 6 {.6 6 {.6 {.6 {.6 6 6 6 6 6 ; ; C.D. ", | |||||
| " E.J ; : F.6 6 6 6 G...6 {.6 {.6 {.6 {.{.{.6 6 6 H.I.; ; J.K. ", | |||||
| " L.; ; M.6 E 6 N.O.P.{.6 6 6 {.6 6 {.6 Q.6 6 6 6 R.S.; ; > K. ", | |||||
| " T.; U.V.W.6 6 P.p.; X.Y.6 6 6 6 6 6 6 6 Z.`.6 6 6 +.+; ; ++@+ ", | |||||
| " K.#+! $+%+&+x ; ; *+=+-+;+l >+6 6 6 ,+'+)+!+6 6 6 ~+{+]+; ; ^+@ ", | |||||
| " /+(+_+:+<+[+; }+|+1+; I.>+6 6 E 2+; ; 3+6 6 E 6 o 4+; ; = 5+ ", | |||||
| " 6+> ; ; ; ; ; ; 7+8+; ; 9+i.6 6 0+D ; ; a+b+6 6 6 c+d+; ; e+ ", | |||||
| " > ; ; ; ; f+g+h+; ; i+j+6 6 k+l+; ; m+n+6 6 o+p+; q+3 ", | |||||
| " r+s+= ; t+u+v+w+; ; x+y+6 6 0+z+; ; ; A+2+B+ ", | |||||
| " C+4 D+ X ; ; ; E+F+z+G+H+I+; ; ; p.J+K+ ", | |||||
| " L+; ; ; ; ; M+N+O+; ; ; ; = P+Q+ ", | |||||
| " R+S+T+4 ; ; U+V+W+; ; ; s h+T ", | |||||
| " X+ Y+Z+h+ ", | |||||
| " ", | |||||
| " ", | |||||
| " "}; | |||||