diff options
| author | Robert Jonsson <spamatica@gmail.com> | 2011-03-07 19:01:11 +0000 | 
|---|---|---|
| committer | Robert Jonsson <spamatica@gmail.com> | 2011-03-07 19:01:11 +0000 | 
| commit | e40fc849149dd97c248866a4a1d026dda5e57b62 (patch) | |
| tree | b12b358f3b3a0608001d30403358f8443118ec5f /attic/muse2-oom/muse2/synti/s1 | |
| parent | 1bd4f2e8d9745cabb667b043171cad22c8577768 (diff) | |
clean3
Diffstat (limited to 'attic/muse2-oom/muse2/synti/s1')
| -rw-r--r-- | attic/muse2-oom/muse2/synti/s1/CMakeLists.txt | 68 | ||||
| -rw-r--r-- | attic/muse2-oom/muse2/synti/s1/s1.cpp | 232 | 
2 files changed, 300 insertions, 0 deletions
diff --git a/attic/muse2-oom/muse2/synti/s1/CMakeLists.txt b/attic/muse2-oom/muse2/synti/s1/CMakeLists.txt new file mode 100644 index 00000000..93c62961 --- /dev/null +++ b/attic/muse2-oom/muse2/synti/s1/CMakeLists.txt @@ -0,0 +1,68 @@ +#============================================================================= +#  MusE +#  Linux Music Editor +#  $Id:$ +# +#  Copyright (C) 2002-2006 by Werner Schweer and others +# +#  This program is free software; you can redistribute it and/or modify +#  it under the terms of the GNU General Public License version 2. +# +#  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., 675 Mass Ave, Cambridge, MA 02139, USA. +#============================================================================= + +## +## List of source files to compile +## +file (GLOB s1_source_files +      s1.cpp +      ) + +## +## Define target +## +add_library ( s1 SHARED +      ${s1_source_files} +      ) + +## +## Append to the list of translations +## +set (FILES_TO_TRANSLATE +      ${FILES_TO_TRANSLATE} +      ${s1_source_files} +      CACHE INTERNAL "" +      ) + +## +## Compilation flags and target name +## +# tell cmake to name target s1.so instead of  +# libs1.so +# +set_target_properties ( s1  +      PROPERTIES PREFIX ""  +      COMPILE_FLAGS "-fvisibility=hidden" +      ) + +## +## Linkage +## +target_link_libraries(s1 +      synti +      ) + +## +## Install location +## +install( TARGETS s1 +      DESTINATION ${MusE_SYNTHI_DIR} +      ) + diff --git a/attic/muse2-oom/muse2/synti/s1/s1.cpp b/attic/muse2-oom/muse2/synti/s1/s1.cpp new file mode 100644 index 00000000..0dca2656 --- /dev/null +++ b/attic/muse2-oom/muse2/synti/s1/s1.cpp @@ -0,0 +1,232 @@ +//========================================================= +//  MusE +//  Linux Music Editor +//  $Id: s1.cpp,v 1.9.2.5 2009/11/19 04:20:33 terminator356 Exp $ +// +//    S1  - simple mono demo synthesizer +//        - plays only one note at a time +//        - has no gui nor any controller +// +//    Version 0.2: stop note on wave zero crossing to avoid +//                 clicks +// +//  (C) Copyright 2001-2004 Werner Schweer (ws@seh.de) +//========================================================= + +#include <cmath> +#include <list> + +#include <QMessageBox> + +#include "libsynti/mono.h" + +#define RESOLUTION   16384 + +//--------------------------------------------------------- +//   S1 - simple mono demo synthesizer +//--------------------------------------------------------- + + +class S1 : public MessMono { +      static int useCount; +      static float *wave_table; + +      int gate; +      float freq; +      unsigned accu; +      float sample; +      bool _showGui; +       +      int param; + +      virtual void note(int channel, int pitch, int velo); +      //virtual void processMessages(); +      virtual void process(float** buffer, int offset, int n); +      virtual bool hasGui() const { return true; } +      virtual bool guiVisible() const { return _showGui; } +      virtual void showGui(bool); +      virtual bool setController(int channel, int ctrl, int val); +      virtual int getControllerInfo(int id, const char** name, int* ctrl, int* min, int* max, int* initval) const; + +   public: +      S1(); +      ~S1(); +      }; + +float* S1::wave_table; +int S1::useCount = 0; + +//--------------------------------------------------------- +//   S1 +//--------------------------------------------------------- + +S1::S1() : MessMono() +      { +       +      if (useCount++ == 0) { +            // +            // create sinus wave table +            // +            wave_table = new float[RESOLUTION]; +            for (int i = 0; i < RESOLUTION; i++) +                  wave_table[i] = sin ((i * 2.0 * M_PI) / RESOLUTION) / 6.0; +            } +      gate = 0; +       +      param = 0; +       +      _showGui=false; +      showGui(true); +      } + +//--------------------------------------------------------- +//   ~S1 +//--------------------------------------------------------- + +S1::~S1() +      { +      if (--useCount == 0) +            delete[] wave_table; +      } + +//--------------------------------------------------------- +//   noteon +//    process note on +//--------------------------------------------------------- + +void S1::note(int /*channel*/, int pitch, int velo) +      { +      if (velo == 0) { +            // +            // note off +            // +            if (sample == 0.0) +                  gate = 0; +            else if (sample > 0.0) +                  gate = 2; +            else if (sample < 0.0) +                  gate = 3; +            } +      else { +            // +            // note on +            // +            accu     = 0; +            gate     = 1; +            freq     = 8.176 * exp(float(pitch)*log(2.0)/12.0); +            } +      } + +//--------------------------------------------------------- +//   write +//    synthesize n samples into buffer+offset +//--------------------------------------------------------- + +void S1::process(float** buffer, int offset, int n) +      { +      if (gate == 0) +            return; +      float* p = buffer[0] + offset; +      float sample1, sample2; +      unsigned freq_256 = (int) (freq * ((double) RESOLUTION) / sampleRate() * 256.0); +      for (int i = 0; i < n; i++) { +            accu += freq_256; +            while (accu >= RESOLUTION * 256) +                  accu -= RESOLUTION * 256; +             +            sample1 = wave_table[accu >> 8]; // sinus component +             +            if (sample1< 0.0f) // square wave component +              sample2 = -0.4;  +            else +              sample2 = 0.4; +             +            sample = ((1.0-float(param)/127.0)*sample1 + (float(param)/127.0)*sample2) / 2.0; +             +            // +            // stop on zero crossing +            // if in decay state +            // +            if (gate == 2 && sample <= 0.0) { +                  gate = 0; +                  break; +                  } +            else if (gate == 3 && sample >= 0.0) { +                  gate = 0; +                  break; +                  } +            p[i] += sample; +            } +      } + +       +//--------------------------------------------------------- +//   inst +//--------------------------------------------------------- +       + +void S1::showGui(bool show) +      { +      if (show) +        QMessageBox::information( NULL, "S1", +        "S1 is a demo synth mainly for\n" +        "developers wishing to learn\n" +        "how to make a M.E.S.S synth.\n" +        "\n" +        "One modulation parameter is available,\n" +        "it sweeps the signal between square and\n" +        "sinus wave.\n", 1 ); +      } +      +bool S1::setController(int, int ctrl, int val) +      { +      if (ctrl == 1) { +             param = val; +             } +      return true; +      } + +int S1::getControllerInfo(int id, const char** name, int* ctrl, int* min, int* max, int* initval) const +      { +        if (id == 0) { +            *name = "Modulation"; +            *ctrl = 1; +            *min = 0; +            *max = 127; +            *initval = 0; +            return 1; +            } +        else +          return 0; +      } + +//--------------------------------------------------------- +//   inst +//--------------------------------------------------------- +class QWidget; + + +static Mess* instantiate(int sr, QWidget*, QString* projectPathPtr, const char*) +      { +      S1* s1 = new S1(); +      s1->setSampleRate(sr); +      return s1; +      } + +extern "C" { +      static MESS descriptor = { +            "S1", +            "S1 MusE Demo Software Synthesizer", +            "0.2",      // version string +            MESS_MAJOR_VERSION, MESS_MINOR_VERSION, +            instantiate +            }; +      // We must compile with -fvisibility=hidden to avoid namespace +      // conflicts with global variables. +      // Only visible symbol is "mess_descriptor". +      // (TODO: all plugins should be compiled this way) +   +      __attribute__ ((visibility("default"))) +      const MESS* mess_descriptor() { return &descriptor; } +      } +  | 
