Merge pull request #506 from andrewcsmith/patch-2
[supercollider.git] / lang / LangSource / Samp.cpp
blob3cf1ca6d4d146ed7d2ca8d95fc5917324a7fe5f8
1 /*
2 SuperCollider real time audio synthesis system
3 Copyright (c) 2002 James McCartney. All rights reserved.
4 http://www.audiosynth.com
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 #include "Samp.h"
23 #include "SC_Constants.h"
24 #include <stdlib.h>
25 #include <stdexcept>
27 float32 gSine[kSineSize+1];
28 float32 gPMSine[kSineSize+1];
29 float32 gInvSine[kSineSize+1];
30 float32 gSineWavetable[2*kSineSize];
32 void SignalAsWavetable(float32* signal, float32* wavetable, long inSize)
34 float32 val1, val2;
36 float32* in = signal;
37 float32* out = wavetable - 1;
38 for (int i=0; i<inSize - 1; ++i) {
39 val1 = in[i];
40 val2 = in[i+1];
41 *++out = 2.f * val1 - val2;
42 *++out = val2 - val1;
44 val1 = in[inSize-1];
45 val2 = in[0];
46 *++out = 2.f * val1 - val2;
47 *++out = val2 - val1;
50 void WavetableAsSignal(float32* wavetable, float32* signal, long inSize)
52 float32* in = wavetable - 1;
53 float32* out = signal - 1;
54 for (int i=0; i<inSize; ++i) {
55 float32 a = *++in;
56 float32 b = *++in;
57 *++out = a + b;
62 class SynthLibInit
64 public:
65 SynthLibInit();
67 void FillTables();
70 SynthLibInit gSynthLibInit;
72 SynthLibInit::SynthLibInit()
74 FillTables();
77 void SynthLibInit::FillTables()
79 double sineIndexToPhase = twopi / kSineSize;
80 double pmf = (1L << 29) / twopi;
81 for (int i=0; i <= kSineSize; ++i) {
82 double phase = i * sineIndexToPhase;
83 float32 d = sin(phase);
84 gSine[i] = d;
85 gInvSine[i] = 1. / d;
86 gPMSine[i] = d * pmf;
88 SignalAsWavetable(gSine, gSineWavetable, kSineSize);
90 gInvSine[0] = gInvSine[kSineSize/2] = gInvSine[kSineSize] = kBadValue;
91 int sz = kSineSize;
92 int sz2 = sz>>1;
93 for (int i=1; i<=8; ++i) {
94 gInvSine[i] = gInvSine[sz-i] = kBadValue;
95 gInvSine[sz2-i] = gInvSine[sz2+i] = kBadValue;
97 //SignalAsWavetable(gInvSine, gInvSineWavetable, kSineSize);