diff --git a/SpiralSound/Plugins/MixSwitchPlugin/Makefile.in b/SpiralSound/Plugins/MixSwitchPlugin/Makefile.in new file mode 100644 index 0000000..fd8988e --- /dev/null +++ b/SpiralSound/Plugins/MixSwitchPlugin/Makefile.in @@ -0,0 +1,170 @@ +############################################################################# +# Makefile for building MixSwitchPlugin.so +############################################################################# + +####### 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 \ + MixSwitchPlugin.h \ + MixSwitchPluginGUI.h +SOURCES = ../SpiralPlugin.C \ + ../SpiralPluginGUI.C \ + ../../ChannelHandler.C \ + ../Widgets/Fl_Knob.cxx \ + ../Widgets/Fl_DragBar.cxx \ + ../../Sample.C \ + MixSwitchPlugin.C \ + MixSwitchPluginGUI.C +OBJECTS = ../SpiralPlugin.o \ + ../SpiralPluginGUI.o \ + ../../ChannelHandler.o \ + ../Widgets/Fl_Knob.o \ + ../Widgets/Fl_DragBar.o \ + ../../Sample.o \ + MixSwitchPlugin.o \ + MixSwitchPluginGUI.o +INTERFACES = +UICDECLS = +UICIMPLS = +SRCMOC = +OBJMOC = +DIST = +TARGET = MixSwitchPlugin.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 MixSwitchPlugin.pro + +dist: + $(TAR) MixSwitchPlugin.tar MixSwitchPlugin.pro $(SOURCES) $(HEADERS) $(INTERFACES) $(DIST) + $(GZIP) MixSwitchPlugin.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 + +MixSwitchPlugin.o: MixSwitchPlugin.C \ + MixSwitchPlugin.h \ + ../SpiralPlugin.h \ + ../../Sample.h \ + ../../SpiralInfo.h \ + ../../Sample.h \ + MixSwitchPluginGUI.h \ + ../Widgets/Fl_Knob.H \ + ../Widgets/Fl_DragBar.H \ + ../SpiralPluginGUI.h \ + ../Widgets/Fl_DragBar.H \ + SpiralIcon.xpm + +MixSwitchPluginGUI.o: MixSwitchPluginGUI.C \ + MixSwitchPluginGUI.h \ + ../Widgets/Fl_Knob.H \ + ../Widgets/Fl_DragBar.H \ + MixSwitchPlugin.h \ + ../SpiralPlugin.h \ + ../../Sample.h \ + ../../SpiralInfo.h \ + ../../Sample.h \ + ../SpiralPluginGUI.h \ + ../Widgets/Fl_DragBar.H + +../../ChannelHandler.o: ../../ChannelHandler.C \ + ../../ChannelHandler.h diff --git a/SpiralSound/Plugins/MixSwitchPlugin/MixSwitchPlugin.C b/SpiralSound/Plugins/MixSwitchPlugin/MixSwitchPlugin.C new file mode 100644 index 0000000..461df4b --- /dev/null +++ b/SpiralSound/Plugins/MixSwitchPlugin/MixSwitchPlugin.C @@ -0,0 +1,155 @@ +/* SpiralSound + * Copyleft (C) 2001 David Griffiths + * + * 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 "MixSwitchPlugin.h" +#include "MixSwitchPluginGUI.h" +#include +#include +#include "SpiralIcon.xpm" + +extern "C" { + + SpiralPlugin* CreateInstance () { return new MixSwitchPlugin; } + + char** GetIcon () { return SpiralIcon_xpm; } + + int GetID () { return 126; } + +} + +/////////////////////////////////////////////////////// + +MixSwitchPlugin::MixSwitchPlugin () : +m_SwitchPos (0), +m_Triggered (false) +{ + m_GUIArgs.Chans = 2; + m_GUIArgs.Switch = 1; + m_GUIArgs.Echo = 1; + m_PluginInfo.Name = "MixSwitch"; + m_PluginInfo.Width = 93; + m_PluginInfo.Height = 55; + 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); +} + +MixSwitchPlugin::~MixSwitchPlugin () { +} + +PluginInfo &MixSwitchPlugin::Initialise (const HostInfo *Host) { + return SpiralPlugin::Initialise (Host); +} + +SpiralGUIType *MixSwitchPlugin::CreateGUI () { + return new MixSwitchPluginGUI (m_PluginInfo.Width, m_PluginInfo.Height, this, m_AudioCH, m_HostInfo); +} + +void MixSwitchPlugin::ExecuteCommands () { + if (m_AudioCH->IsCommandWaiting ()) { + switch (m_AudioCH->GetCommand()) { + case (SETCHANS) : SetChans (m_GUIArgs.Chans); + break; + case (SETSWITCH) : SetSwitch (m_GUIArgs.Switch); + break; + } + } +} + +void MixSwitchPlugin::CreatePorts (int n = 2, bool AddPorts = false) { + int c; + m_PluginInfo.NumInputs = 2 + n; + m_PluginInfo.PortTips.push_back ("CV"); + m_PluginInfo.PortTips.push_back ("Clock"); + char t[256]; + for (c=1; c<=n; c++) { + sprintf (t, "In %d", c); + m_PluginInfo.PortTips.push_back (t); + } + m_PluginInfo.NumOutputs = 2; + m_PluginInfo.PortTips.push_back ("CV"); + m_PluginInfo.PortTips.push_back ("Out"); + if (AddPorts) { + for (c=0; cBUFSIZE; n++) { + if (InputExists (0)) { + // Check the Switch Pos CV Value + m_SwitchPos = int (GetInput (0, n)-1) % NumChans; + } + else if (InputExists (1)) { + // Check the trigger CV value + if (GetInput (1, n) < 0.01) { + m_Triggered = false; + } + else { + if (!m_Triggered) { + m_Triggered = true; + m_SwitchPos = (m_SwitchPos+1) % NumChans; + } + } + } + int o = m_SwitchPos+1; + m_GUIArgs.Echo = o; + SetOutput (0, n, o); + o++; + if (InputExists (o)) f=GetInput (o, n); + else f=0.0; + SetOutput (1, n, f); + } +} + +void MixSwitchPlugin::StreamOut (ostream &s) { + s << m_Version << " " << m_PluginInfo.NumInputs - 2 << " " << m_SwitchPos << " "; +} + +void MixSwitchPlugin::StreamIn (istream &s) { + int Version, Chans, SwitchPos; + s >> Version >> Chans >> SwitchPos; + SetChans (Chans); + m_SwitchPos = SwitchPos; +} diff --git a/SpiralSound/Plugins/MixSwitchPlugin/MixSwitchPlugin.h b/SpiralSound/Plugins/MixSwitchPlugin/MixSwitchPlugin.h new file mode 100644 index 0000000..92d964e --- /dev/null +++ b/SpiralSound/Plugins/MixSwitchPlugin/MixSwitchPlugin.h @@ -0,0 +1,57 @@ +/* SpiralSound + * Copyleft (C) 2001 David Griffiths + * + * 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 + +#ifndef MixSwitchPLUGIN +#define MixSwitchPLUGIN + +class MixSwitchPlugin : public SpiralPlugin { + public: + MixSwitchPlugin (); + virtual ~MixSwitchPlugin (); + virtual PluginInfo& Initialise (const HostInfo *Host); + virtual SpiralGUIType* CreateGUI (); + virtual void Execute (); + virtual void ExecuteCommands(); + virtual void StreamOut (ostream &s); + virtual void StreamIn (istream &s); + int GetSwitch (void) { return m_SwitchPos + 1; } + int GetChans (void) { return m_PluginInfo.NumInputs - 2; } + enum GUICommands {NONE, SETCHANS, SETSWITCH}; + struct GUIArgs { + int Chans; + int Switch; + int Echo; + }; + private: + GUIArgs m_GUIArgs; + void SetChans (int n); + void SetSwitch (int n); + int m_SwitchPos; + bool m_Triggered; + void CreatePorts (int n = 2, bool AddPorts = false); + friend istream &operator>> (istream &s, MixSwitchPlugin &o); + friend ostream &operator<< (ostream &s, MixSwitchPlugin &o); +}; + +istream &operator>> (istream &s, MixSwitchPlugin &o); +ostream &operator<< (ostream &s, MixSwitchPlugin &o); + +#endif diff --git a/SpiralSound/Plugins/MixSwitchPlugin/MixSwitchPluginGUI.C b/SpiralSound/Plugins/MixSwitchPlugin/MixSwitchPluginGUI.C new file mode 100644 index 0000000..1ec7541 --- /dev/null +++ b/SpiralSound/Plugins/MixSwitchPlugin/MixSwitchPluginGUI.C @@ -0,0 +1,95 @@ +/* SpiralPlugin + * Copyleft (C) 2000 David Griffiths + * + * 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 "MixSwitchPluginGUI.h" +#include +#include +#include + +static const int GUI_COLOUR = 179; +static const int GUIBG_COLOUR = 144; +static const int GUIBG2_COLOUR = 145; + +//////////////////////////////////////////// + +MixSwitchPluginGUI::MixSwitchPluginGUI (int w, int h, MixSwitchPlugin *o, ChannelHandler *ch, const HostInfo *Info) : +SpiralPluginGUI (w, h, o, ch) +{ + m_Chans = new Fl_Counter (5, 20, 40, 20, "Channels"); + m_Chans->labelsize (10); + m_Chans->type (FL_SIMPLE_COUNTER); + m_Chans->step (1); + m_Chans->value (2); + m_Chans->callback ((Fl_Callback*) cb_Chans); + add (m_Chans); + + m_Switch = new Fl_Counter (49, 20, 40, 20, "Select"); + m_Switch->labelsize (10); + m_Switch->type (FL_SIMPLE_COUNTER); + m_Switch->step (1); + m_Switch->value (1); + m_Switch->callback ((Fl_Callback*) cb_Switch); + add (m_Switch); +} + +inline void MixSwitchPluginGUI::cb_Chans_i (Fl_Counter* o, void* v) { + if (o->value() < 2) o->value(2); + else { + m_GUICH->Set ("Chans", int (o->value ())); + m_GUICH->SetCommand (MixSwitchPlugin::SETCHANS); + } +} + +void MixSwitchPluginGUI::cb_Chans (Fl_Counter* o, void* v) { + ((MixSwitchPluginGUI*) (o->parent ())) -> cb_Chans_i (o, v); +} + + +inline void MixSwitchPluginGUI::cb_Switch_i (Fl_Counter* o, void* v) { + if (o->value() < 1 || o->value() > m_Chans->value ()) + o->value (1); + m_GUICH->Set ("Switch", int (o->value ())); + m_GUICH->SetCommand (MixSwitchPlugin::SETSWITCH); +} + +void MixSwitchPluginGUI::cb_Switch (Fl_Counter* o, void* v) { + ((MixSwitchPluginGUI*) (o->parent ())) -> cb_Switch_i (o, v); +} + +void MixSwitchPluginGUI::Update () { + m_Switch->value (m_GUICH->GetInt ("Echo")); +} + +void MixSwitchPluginGUI::UpdateValues (SpiralPlugin *o) { + MixSwitchPlugin* Plugin = (MixSwitchPlugin*)o; + m_Chans->value (Plugin->GetChans ()); + m_Switch->value (Plugin->GetSwitch ()); +} + +const string MixSwitchPluginGUI::GetHelpText(const string &loc){ + return string("") + + "It's a simple n-input 1-output rotary switch.\n\n" + + "The 'Channels' parameter controls the number of outputs.\n\n" + + "The 'Select' parameter selects which input is echoed at the output.\n\n" + + "The 'CV' input also selects which input is echoed at the output.\n\n" + + "The 'Clock' input is a trigger to select the next input chanel.\n\n" + + "The 'CV' output enables you to gang several switches together, by\n" + + "connecting it to the other switches' 'CV' input.\n"; +} diff --git a/SpiralSound/Plugins/MixSwitchPlugin/MixSwitchPluginGUI.h b/SpiralSound/Plugins/MixSwitchPlugin/MixSwitchPluginGUI.h new file mode 100644 index 0000000..3868051 --- /dev/null +++ b/SpiralSound/Plugins/MixSwitchPlugin/MixSwitchPluginGUI.h @@ -0,0 +1,45 @@ +/* SpiralPlugin + * Copyleft (C) 2000 David Griffiths + * + * 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 +#include +#include +#include + +#include "MixSwitchPlugin.h" +#include "../SpiralPluginGUI.h" + +#ifndef MixSwitchGUI +#define MixSwitchGUI + +class MixSwitchPluginGUI : public SpiralPluginGUI { + public: + MixSwitchPluginGUI(int w, int h, MixSwitchPlugin *o, ChannelHandler *ch, const HostInfo *Info); + virtual void UpdateValues(SpiralPlugin *o); + virtual void Update(); + protected: + const string GetHelpText(const string &loc); + private: + Fl_Counter *m_Switch, *m_Chans; + inline void cb_Switch_i (Fl_Counter* o, void* v); + static void cb_Switch (Fl_Counter* o, void* v); + inline void cb_Chans_i (Fl_Counter* o, void* v); + static void cb_Chans (Fl_Counter* o, void* v); +}; + +#endif diff --git a/SpiralSound/Plugins/MixSwitchPlugin/SpiralIcon.xpm b/SpiralSound/Plugins/MixSwitchPlugin/SpiralIcon.xpm new file mode 100644 index 0000000..e907be6 --- /dev/null +++ b/SpiralSound/Plugins/MixSwitchPlugin/SpiralIcon.xpm @@ -0,0 +1,324 @@ +/* XPM */ +static char * SpiralIcon_xpm[] = { +"36 36 285 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 #252525", +"). c #040400", +"!. c #FFFF00", +"~. c #141500", +"{. c #727175", +"]. c #FEFEFF", +"^. c #9D99AA", +"/. c #DBD9E0", +"(. c #E9E9E9", +"_. c #CBCBCB", +":. c #E0E0E0", +"<. c #6C6C6C", +"[. c #515151", +"}. c #A6A6A7", +"|. c #827E93", +"1. c #615C77", +"2. c #EAEAED", +"3. c #DFDFE1", +"4. c #1E1D24", +"5. c #9894A7", +"6. c #B1AEBB", +"7. c #69686F", +"8. c #000001", +"9. c #0A0A00", +"0. c #171800", +"a. c #615C76", +"b. c #5F5A75", +"c. c #413E4D", +"d. c #020203", +"e. c #040500", +"f. c #050500", +"g. c #1A1A1C", +"h. c #C3C1CB", +"i. c #9D9D9D", +"j. c #202020", +"k. c #383838", +"l. c #4C4C4C", +"m. c #111112", +"n. c #C9C7D0", +"o. c #F1F1F1", +"p. c #F8F8F8", +"q. c #232323", +"r. c #010100", +"s. c #121300", +"t. c #050408", +"u. c #AEACB9", +"v. c #FEFEFE", +"w. c #1D1D1D", +"x. c #020200", +"y. c #101100", +"z. c #B7B5C1", +"A. c #9390A2", +"B. c #BBBBBB", +"C. c #414141", +"D. c #030303", +"E. c #28272A", +"F. c #F4F4F6", +"G. c #605B76", +"H. c #736E86", +"I. c #D8D8D8", +"J. c #727272", +"K. c #101010", +"L. c #848486", +"M. c #CCCBD3", +"N. c #747087", +"O. c #6D6881", +"P. c #1C1C1C", +"Q. c #242424", +"R. c #656566", +"S. c #F6F6F6", +"T. c #E8E6EA", +"U. c #706B84", +"V. c #E3E1E6", +"W. c #474746", +"X. c #151515", +"Y. c #C8C8C8", +"Z. c #AEAEAE", +"`. c #080808", +" + c #373639", +".+ c #FDFCFE", +"++ c #ABA8B7", +"@+ c #F1F0F3", +"#+ c #6D6980", +"$+ c #0A090E", +"%+ c #95929E", +"&+ c #0A0810", +"*+ 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", +"1+ c #FAFAFA", +"2+ c #F8F8F9", +"3+ c #A29EAF", +"4+ c #F7F6F8", +"5+ c #F0F0F1", +"6+ c #B8B7B9", +"7+ c #E4E4E4", +"8+ c #FDFDFD", +"9+ c #A5A2B2", +"0+ c #3B3456", +"a+ c #A8A5B4", +"b+ c #525252", +"c+ c #848387", +"d+ c #CDCDCD", +"e+ c #8D899C", +"f+ c #494262", +"g+ c #68627C", +"h+ c #40395A", +"i+ c #ECECEC", +"j+ c #020202", +"k+ c #B4B5B5", +"l+ c #0B0B0B", +"m+ c #313232", +"n+ c #E3E3E3", +"o+ c #B1AEBC", +"p+ c #BDBBC6", +"q+ c #3C3556", +"r+ c #898599", +"s+ c #EDEDED", +"t+ c #39393A", +"u+ c #040404", +"v+ c #333333", +"w+ c #F5F5F5", +"x+ c #2B2B2B", +"y+ c #2D2A3D", +"z+ c #B6B4C1", +"A+ c #F5F5F6", +"B+ c #605A76", +"C+ c #DAD8DF", +"D+ c #F5F4F6", +"E+ c #615B76", +"F+ c #524D6A", +"G+ c #E4E3E8", +"H+ c #D5D5D5", +"I+ c #1B1B1B", +"J+ c #303030", +"K+ c #AAABAB", +"L+ c #585464", +"M+ c #B0AEBB", +"N+ c #A29FAF", +"O+ c #E9E8E9", +"P+ c #787779", +"Q+ c #0F0E15", +"R+ c #2D2D2E", +"S+ c #595959", +"T+ c #FAFAFB", +"U+ c #807B92", +"V+ c #B0ADBB", +"W+ c #E8E7EB", +"X+ c #3A3258", +"Y+ c #E6E5EA", +"Z+ c #DFDEE3", +"`+ c #443E5E", +" @ c #BAB8C4", +".@ c #C1BFCA", +"+@ c #E0E0E5", +"@@ c #D0CED6", +"#@ c #362F52", +"$@ c #CECCD5", +"%@ c #413A5B", +"&@ c #6A657F", +"*@ 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 6 6 E {.].; ; ^. ", +" /.; ; (.R h _.:.<.6 !.!.!.!.!.!.6 6 6 6 6 E [.}.4 |. ", +" 1.2.; 3...6 6 6 6 6 6 6 6 6 6 !.!.!.6 6 6 6 6 6 4.5. ", +" V @ 6.7.8.6 6 6 6 6 9.0.6 6 6 6 6 !.!.6 6 6 6 6 6 6 ", +" a.b.c.6 d.6 6 6 6 6 e.6 6 6 !.6 6 !.!.f.6 6 6 g.6 ", +" h.; ; i.j.j.k.l.j.6 6 !.!.!.!.!.!.6 6 !.!.!.!.!.m.6 ", +" n.; ; o.p.; ; ; q.6 r.~.6 6 6 !.6 6 6 6 s.6 6 6 t.6 ", +" u.; ; ; ; v.; ; w.6 x.y.6 6 6 6 6 6 6 6 s.6 6 6 6 z., ", +" A.; ; v.; : B.C.D.6 6 6 6 6 6 !.6 6 6 6 x.6 6 6 E.v.F.G. ", +" H.; ; ; I.J.K.6 6 6 6 !.!.!.!.!.!.6 6 6 6 6 6 6 L.; ; M.N. ", +" O.J ; : P.6 6 6 6 Q...6 6 6 6 !.6 6 6 6 r.6 6 6 R.S.; ; T.U. ", +" V.; ; W.6 E 6 X.Y.Z.`.6 6 6 6 6 6 6 6 r.6 6 6 6 +.+; ; > U. ", +" ++; @+#+$+6 6 Z.v.; %+&+6 6 6 6 6 6 6 6 *+=+6 6 6 -+;+; ; >+,+ ", +" U.'+! )+!+~+x ; ; {+]+^+/+l (+6 6 6 _+:+<+[+6 6 6 }+|+1+; ; 2+@ ", +" 3+4+5+6+7+8+; 9+0+a+; S.(+6 6 E b+; ; c+6 6 E 6 o d+; ; = e+ ", +" f+> ; ; ; ; ; ; g+h+; ; i+k.6 6 j+D ; ; k+l+6 6 6 m+n+; ; o+ ", +" > ; ; ; ; p+q+r+; ; s+t+6 6 u+v+; ; w+x+6 6 y+z+; A+3 ", +" B+C+= ; D+E+F+G+; ; H+I+6 6 j+J+; ; ; K+b+L+ ", +" M+4 N+ X ; ; ; O+P+J+Q+R+S+; ; ; v.T+U+ ", +" V+; ; ; ; ; W+X+Y+; ; ; ; = Z+`+ ", +" @.@+@4 ; ; @@#@$@; ; ; s r+T ", +" %@ &@*@r+ ", +" ", +" ", +" "};