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/muse_qt4_evolution/synti/s1/s1.cpp | |
parent | 1bd4f2e8d9745cabb667b043171cad22c8577768 (diff) |
clean3
Diffstat (limited to 'attic/muse_qt4_evolution/synti/s1/s1.cpp')
-rw-r--r-- | attic/muse_qt4_evolution/synti/s1/s1.cpp | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/attic/muse_qt4_evolution/synti/s1/s1.cpp b/attic/muse_qt4_evolution/synti/s1/s1.cpp new file mode 100644 index 00000000..596a5797 --- /dev/null +++ b/attic/muse_qt4_evolution/synti/s1/s1.cpp @@ -0,0 +1,156 @@ +//========================================================= +// MusE +// Linux Music Editor +// $Id: s1.cpp,v 1.10 2005/01/13 21:16:27 wschweer 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 "synti/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; + + virtual void note(int channel, int pitch, int velo); + virtual void process(float** buffer, int offset, int n); + + 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; + } + +//--------------------------------------------------------- +// ~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; + 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; + sample = wave_table[accu >> 8]; + // + // 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 +//--------------------------------------------------------- + +static Mess* instantiate(int sr, 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 + }; + + const MESS* mess_descriptor() { return &descriptor; } + } + |