CSL  6.0
Test_Sources.cpp
Go to the documentation of this file.
1 //
2 // Test_Sources.cpp -- C main functions for CSL noise and other source tests.
3 // See the copyright notice and acknowledgment of authors in the file COPYRIGHT
4 //
5 // This program simply reads the run_tests() function (at the bottom of this file)
6 // and executes a list of basic CSL source tests
7 // There are other source tests in Test_Oscillators.cpp and Test_Envelopes.cpp
8 //
9 
10 #ifndef USE_JUCE
11 #define USE_TEST_MAIN // use the main() function in test_support.h
12 #include "Test_Support.cpp" // include all of CSL core and the test support functions
13 #else
14 #include "Test_Support.h"
15 #endif
16 
17 /////////////////////// Here are the actual unit tests ////////////////////
18 
19 /// Noise tests, WhiteNoise & PinkNoise - using Scalable to protect our ears
20 
21 void testNoises() {
22  WhiteNoise whitey(0.5); // amplitude, offset
23 // logMsg("dumping quiet white noise...");
24 // dumpTest(whitey);
25  logMsg("playing quiet white noise...");
26  runTest(whitey);
27  logMsg("quiet white noise done.");
28 
29  PinkNoise pinky(42, 0.8); // seed, amplitude, offset
30 // logMsg("dumping quiet pink noise with seed...");
31 // dumpTest(pinky);
32  logMsg("playing quiet pink noise with seed...");
33  runTest(pinky);
34  logMsg("quiet pink noise with seed done.");
35 }
36 
37 /// Plucked string simulation
38 
39 #include "KarplusString.h"
40 
41 void testString() {
42  KarplusString pluck(fRandM(80, 1024)); // rand freq range
43  pluck.setScale(0.6); // quiet
44  pluck.trigger(); // srart it
45  logMsg("playing plucked string...");
46  runTest(pluck, 5);
47  logMsg("done.");
48 }
49 
50 /// Test a chorus of strings -- this demo plays an endless loop of string arpeggii.
51 /// For each arpeggio, it picks a starting pitch and pitch step, a starting position
52 /// and position increment, and a duration; the inner loop then creates notes and sleeps.
53 
55  unsigned numStrings = 64; // # strings
56  Mixer mix(2); // stereo mix
57  UGenVector strings; // vector of strings
58  UGenVector pans; // vector of panners
59 
60  for (int i = 0; i < numStrings; i++) { // loop to create strings/panners
61  KarplusString * plk = new KarplusString(); // create string sources
62  plk->setScale(40.0 / (float) numStrings); // make them loud
63  strings.push_back(plk); // add strings to the vector of strings
64  Panner * pan = new Panner(*plk); // create stereo panners on the strings
65  pans.push_back(pan); // add panners to the vector
66  mix.addInput(*pan); // add panners to the mixer
67  }
68  theIO->setRoot(mix); // send mix to IO
69  logMsg("playing 64-string chorus...");
70  unsigned cnt = 0; // string cnt
71 
72  while(1) { // loop for string arpeggio phrases
73  int numN = iRandM(3, 10); // pick # notes to play
74  int pit1 = iRandM(30, 84); // pick start pitch (in MIDI)
75  int pitX = iRandM(1, 4); // pick pitch step
76  if (coin()) // pick step up or down
77  pitX = 0 - pitX;
78  float pos1 = fRandZ(); // pick starting pos (0 - 1)
79  if (pos1 == 0)
80  pos1 = 0.1;
81  pos1 = sqrtf(pos1); // sqrt of starting pos (moves it away from 0)
82  if (coin()) // pick pos L or R
83  pos1 = 0.0f - pos1;
84  float posX = (pos1 > 0) // calc pan step
85  ? ((0.0f - ((pos1 + 1.0f) / (float)numN)))
86  : ((1.0f - pos1) / (float)numN);
87  float dela = fRandM(0.08, 0.25); // calc delay
88  logMsg("n: %d p: %d/%d \tx: %5.2f/%5.2f \td:%5.2f", numN, pit1, pitX, pos1, posX, dela);
89  // note loop
90  for (int i = 0; i < numN; i++) { // loop to create string gliss
91 // logMsg("\t\ts: %d p: %d x: %5.2f", cnt, pit1, pos1);
92  // set freq to MIDI pitch
93  ((KarplusString *)strings[cnt])->setFrequency(keyToFreq(pit1));
94  pit1 += pitX;
95  // set pan
96  ((Panner *)pans[cnt])->setPosition(pos1);
97  pos1 += posX;
98  // trigger
99  ((KarplusString *)strings[cnt])->trigger();
100  if (sleepSec(dela)) // sleep
101  goto done; // exit if sleep was interrupted
102  cnt++; // pick next string
103  if (cnt == numStrings) // should I check ifthe string is still active?
104  cnt = 0; // reset string counter
105  }
106  sleepSec(fRandM(0.02, 0.2)); // sleep a bit between sets
107  }
108 done:
109  logMsg("done.");
110  for (int i = 0; i < numStrings; i++) { // loop to create strings/panners
111  delete strings[i];
112  delete pans[i];
113  }
114 }
115 
116 ///////////////// SoundFile tests ////////
117 
118 /// Test the sound file player - mono, stereo input files
119 
121 // SoundFile sfile(CGestalt::dataFolder(), "Piano_A5_mf_mono.aiff"); // open a piano note file
122  SoundFile sfile(CGestalt::dataFolder() + "MKG1a1b.aiff");
123 // SoundFile sfile(CGestalt::dataFolder(), "Piano_A5_mf.caf"); // play a piano note
124 // SoundFile sfile(CGestalt::dataFolder(), "splash_mono.aiff");
125 
126  sfile.dump(); // print snd file info
127 
128 // float * left = sfile.mWavetable.buffer(0); // dump the first few samples
129 // for (unsigned j = 0; j < 1000; j += 4) // 0 to 1000 by 4
130 // printf("\t\t%5.3f\n", left[j]);
131 
132  logMsg("Playing sound file...");
133  sfile.trigger();
134  runTest(sfile);
135 // runTest(pan);
136  logMsg("done.");
137 }
138 
140  SoundFile sfile(CGestalt::dataFolder() + "piano-tones.aiff"); // load a piano note
141  sfile.dump(); // print snd file info
142 
143 // float * left = sfile.mSampleBuffer.buffer(0); // dump the first few samples
144 // float * rite = sfile.mSampleBuffer.buffer(1);
145 // for (unsigned j = 0; j < 1000; j++)
146 // printf("\t\t%5.3f : %5.3f\n", *left++, *rite++);
147 
148  logMsg("Playing sound file...");
149  sfile.trigger();
150  runTest(sfile);
151  logMsg("done.");
152 }
153 
154 #ifdef USE_MP3 // uses libsndfile for now
155 
156 /// Test the MP3 file reader
157 
158 void testMP3FilePlayer() {
159  MP3File sfile(CGestalt::dataFolder(), "Piano_B4_096.mp3", true); // convert and play an MP3 file
160 // MP3File sfile("/Users/stp/Code/FMAK/music/Rock/Hard/LZ/02 - The Rain Song.mp3", true);
161  fi.log(); // print snd file info
162  logMsg("Playing sound file...");
163  fi.trigger();
164  runTest(sfile);
165  logMsg("done.");
166 }
167 
168 #endif
169 
170 /// Test the sound file player with rate shift
171 
173  SoundFile * sfile = new SoundFile(CGestalt::dataFolder() + "whistle_mono.aiff");
174  sfile->dump(); // print snd file info
175  Panner pan(*sfile, 0.0); // a panner
176  logMsg("playing sound file...");
177  float rate = 0.8;
178  theIO->setRoot(pan); // make some sound
179  for (int i = 0; i < 4; i++) { // loop to play transpositions
180  sfile->setRate(rate);
181  sfile->trigger();
182  sleepSec(1.4); // sleep for the desired duration
183  sfile->setToEnd();
184  rate += 0.15;
185  }
186  theIO->clearRoot(); // make some silence
187  logMsg("done.");
188  delete sfile;
189 }
190 
191 /// Test the WaveShaper
192 
194  WaveShaper wvs(110, 0); // wave-shape 1 = clipping
195  ADSR adsr(3.0, 1, 1, 0.7, 1);
196  wvs.setScale(adsr);
197  logMsg("Playing WaveShaper 1");
198  adsr.trigger();
199  runTest(wvs, 3);
200  logMsg("done.");
201  WaveShaper wv2(110, 2); // wave-shape 1 = clipping
202  ADSR ads2(3.0, 1, 1, 0.7, 1);
203  wv2.setScale(ads2);
204  logMsg("Playing WaveShaper 2");
205  ads2.trigger();
206  runTest(wv2, 3);
207  logMsg("done.");
208  WaveShaper wv3(110, 1); // wave-shape 1 = clipping
209  ADSR ads3(3.0, 1, 1, 0.7, 1);
210  wv3.setScale(ads3);
211  logMsg("Playing WaveShaper 3");
212  ads3.trigger();
213  runTest(wv3, 3);
214  logMsg("done.");
215 }
216 
217 ///////////////// Instrument tests ////////
218 
219 /// Test basic FM instrument
220 
221 #include <BasicFMInstrument.h>
222 
224  FMInstrument * vox = new FMInstrument;
225  logMsg("Playing simple fm instrument...");
226  float dur = 6.0;
227  float m_freq = 160.0;
228  float * dPtr = & dur;
229  float * fPtr = & m_freq;
230  vox->setParameter(set_duration_f, 1, (void **) &dPtr, "f");
231  vox->setParameter(set_index_f, 1, (void **) &dPtr, "f");
232  vox->setParameter(set_m_freq_f, 1, (void **) &fPtr, "f");
233  vox->play();
234  runTest(*vox, dur);
235  logMsg("done.");
236  delete vox;
237 }
238 
239 /// Test SOS instrument - play 3 different timbres
240 
241 #include <AdditiveInstrument.h>
242 
244  AdditiveInstrument * vox1 = new AdditiveInstrument(48, 1.75f);
245  AdditiveInstrument * vox2 = new AdditiveInstrument(48, 1.75f);
246  AdditiveInstrument * vox3 = new AdditiveInstrument(48, 1.75f);
247  logMsg("Playing 3 SOS instruments...");
248  vox1->playMIDI(1.0f, 1, 30, 127);
249  runTest(*vox1, 1.0f);
250  vox2->playMIDI(1.0f, 1, 30, 127);
251  runTest(*vox2, 1.0f);
252  vox3->playMIDI(1.0f, 1, 30, 127);
253  runTest(*vox3, 1.0f);
254  vox1->playMIDI(1.0f, 1, 30, 127);
255  runTest(*vox1, 1.0f);
256  vox2->playMIDI(1.0f, 1, 30, 127);
257  runTest(*vox2, 1.0f);
258  vox3->playMIDI(1.0f, 1, 30, 127);
259  runTest(*vox3, 1.0f);
260  logMsg("done.");
261  delete vox1;
262  delete vox2;
263  delete vox3;
264 }
265 
268  logMsg("Playing fancy fm instrument...");
269  float dur = 6.0;
270  float * dPtr = & dur;
271  float freq = 220.0;
272  float * fPtr = & freq;
273  vox->setParameter(set_duration_f, 1, (void **) &dPtr, "f");
274  vox->setParameter(set_c_freq_f, 1, (void **) &fPtr, "f");
275  vox->play();
276  runTest(*vox, dur);
277  logMsg("done.");
278  delete vox;
279 }
280 
281 /// Test SoundFile instrument
282 
283 #include <SndFileInstrument.h>
284 
286  SndFileInstrument vox(CGestalt::dataFolder(), "round.aiff");
287  logMsg("Playing sound file instrument...");
288  vox.play();
289  runTest(vox);
290  logMsg("done.");
291 }
292 
293 // Add a sound file to the given UGenVector and Mixer, add a panner on it to the panner UGenVector
294 
295 void addSndtoBank(const char * nam, UGenVector &snds, UGenVector &pans, Mixer &mix) {
296  SoundFile * sfile = new SoundFile(CGestalt::dataFolder() + nam);
297  snds.push_back(sfile); // add strings to the vector of strings
298  Panner * pan = new Panner(*sfile); // create stereo panners on the strings
299  pans.push_back(pan); // add panners to the vector
300  mix.addInput(*pan); // add panners to the mixer
301 }
302 
303 // Create a bank of 64 sample players using the above function
304 // run a loop playing stuttering sound samlpes
305 
307  unsigned numSounds = 64; // # sound files
308  Mixer mix(2); // stereo mix
309  UGenVector snds; // vector of sound files
310  UGenVector pans; // vector of panners
311 
312  for (int i = 0; i < numSounds / 4; i++) { // loop to set up snd file bank
313  addSndtoBank("Columbia-44_1.aiff", snds, pans, mix);
314  addSndtoBank("MKG1a1b.aiff", snds, pans, mix);
315  addSndtoBank("round.aiff", snds, pans, mix);
316  addSndtoBank("sns.aiff", snds, pans, mix);
317  }
318  Stereoverb reverb(mix); // stereo reverb
319  reverb.setRoomSize(0.98); // long reverb time
320  theIO->setRoot(reverb); // send mix to IO
321  logMsg("playing sound file forest...");
322 
323  while (1) { // loop for snd files
324  int numN = iRandM(3, 8); // pick # notes to play
325  int which = iRandM(0, 4); // pick which snd
326  int base = which * numSounds / 4;
327  // pick start point
328  SoundFile * snd = ((SoundFile *)snds[base]);
329  int startp = iRandV(snd->duration());
330  float dela = fRandM(0.05, 0.15); // calc delay
331  int dur = (int)(fRandM(dela, dela * 4.0f) * (float)CGestalt::frameRate()); // calc dur
332 
333  logMsg("n: %d s: %d fr: %d \tdu: %d", numN, which, startp, dur);
334  // note loop
335  for (int i = 0; i < numN; i++) { // loop to create snd file "stutter"
336  snd = ((SoundFile *)snds[which + numN]);
337  snd->setStart(startp);
338  snd->setStop(startp + dur);
339  // set pan to rand
340  ((Panner *)pans[which + numN])->setPosition(fRand1());
341  snd->trigger(); // trigger
342  if (sleepSec(dela)) // sleep
343  goto done; // exit if sleep was interrupted
344  }
345  }
346 done:
347  logMsg("done.");
348  for (int i = 0; i < numSounds; i++) { // loop to create strings/panners
349  delete snds[i];
350  delete pans[i];
351  }
352 }
353 
354 // Play a grain cloud
355 
356 #ifndef CSL_WINDOWS
357 
358 #include <Granulator.h>
359 
361  GrainCloud cloud; // grain cloud
362  GrainPlayer player(& cloud); // grain player
363  // open and read in a file for granulation
364  SoundFile sndFile(CGestalt::dataFolder() + "MKG1a1b.aiff");
365  sndFile.dump();
366 
367  cloud.mSamples = sndFile.mWavetable.buffer(0);
368  cloud.numSamples = sndFile.duration();
369  cloud.mRateBase = 1.0f; // set the grain cloud parameters
370  cloud.mRateRange = 0.8f;
371  cloud.mOffsetBase = 0.5f;
372  cloud.mOffsetRange = 0.5f;
373  cloud.mDurationBase = 0.15f;
374  cloud.mDurationRange = 0.12f;
375  cloud.mDensityBase = 16.0f;
376  cloud.mDensityRange = 10.0f;
377  cloud.mWidthBase = 0.0f;
378  cloud.mWidthRange = 1.0f;
379  cloud.mVolumeBase = 8.0f;
380  cloud.mVolumeRange = 20.5f;
381  cloud.mEnvelopeBase = 0.5f;
382  cloud.mEnvelopeRange = 0.49f;
383  logMsg("playing Granular cloud.");
384  cloud.startThreads(); // start the grain create/reap threads
385  runTest(player, 15);
386  logMsg("done.");
387  cloud.isPlaying = false;
388  sleepSec(0.5);
389 }
390 
391 #endif
392 
393 ///////////////// IFFT tests ////////
394 
395 void test_ifft() {
396  IFFT vox; // use default IFFT parameters
397  vox.setBinMagPhase(2, 0.25, 0); // set a few harmonics
398  vox.setBinMagPhase(4, 0.08, 0);
399  vox.setBinMagPhase(6, 0.04, 0);
400  vox.setBinMagPhase(8, 0.02, 0);
401 // vox.setBinMagPhase(5, 0.1, 0); // 5th bin = 440 Hz?
402  logMsg("playing IFFT...");
403  runTest(vox);
404  logMsg("IFFT done.");
405 }
406 
407 /// do vector cross-fade the long way
408 
410  float dur = 8.0f;
411  IFFT vox1, vox2; // create ifft players
412 
413  vox1.setBinMagPhase(4, 0.25, 0); // set different harmonics
414  vox1.setBinMagPhase(6, 0.25, 0);
415  LineSegment env1(dur, 1, 0.0001);
416  MulOp mul1(vox1, env1); // use a MulOp
417 
418  vox2.setBinMagPhase(5, 0.25, 0); // for the 2nd IFFT
419  vox2.setBinMagPhase(9, 0.25, 0);
420  LineSegment env2(dur, 0.0001, 1);
421  MulOp mul2(vox2, env2);
422 
423  AddOp add(mul1, mul2); // sum the MulOps
424 
425  logMsg("playing IFFT crossfade...");
426  runTest(add, dur);
427  logMsg("IFFT crossfade done.");
428 }
429 
430 //////// RUN_TESTS Function ////////
431 
432 #ifndef USE_JUCE
433 
434 void runTests() {
435 // testNoises();
436 // testString();
437 // testMonoSoundFilePlayer();
438 // testStereoSoundFilePlayer();
439 // testMP3FilePlayer();
440 // testSoundFileTranspose();
441 // testFMInstrument();
442 // testSndFileInstrument();
443 // testFancyFMInstrument();
444  test_ifft();
445 // test_vector_ifft();
446 }
447 
448 #else
449 
450 // test list for Juce GUI
451 
453  "Noise tests", testNoises, "Test noise generators",
454  "Plucked string", testString, "Waves of string arpeggii, stereo with reverb",
455  "String melodies", testStringChorus, "Many random string arpeggii",
456  "Mono snd file player", testMonoFilePlayer, "Test playing a sound file",
457  "Stereo snd file player", testStereoFilePlayer, "Play a stereo sound file",
458 #ifdef USE_MP3
459  "MP3 Snd file player", testMP3FilePlayer, "Play an MP3 file",
460 #endif
461  "Snd file transpose", testSoundFileTranspose, "Demonstrate transposing a sound file",
462  "Sample file bank", testSndFileBank, "Play a large sample bank from sound files",
463  "FM instrument", testFMInstrument, "Play the basic FM instrument",
464  "Fancy FM instrument", testFancyFMInstrument, "FM note with attack chiff and vibrato",
465  "SumOfSines instrument", testSOSInstrument, "Demonstrate the SumOfSines instrument",
466  "Snd file instrument", testSndFileInstrument, "Test the sound file instrument",
467  "WaveShaping synthesis", testWaveShaper, "Play 2 wave-shaper notes with envelopes",
468  "IFFT synthesis", test_ifft, "Make a sound with IFFT synthesis",
469  "Vector IFFT", test_vector_ifft, "Vector synthesis with 2 IFFTs",
470 #ifndef CSL_WINDOWS
471  "Soundfile granulation", testGrainCloud, "Random sound file granulation example",
472 #endif
473  NULL, NULL, NULL
474 };
475 
476 #endif
void logMsg(const char *format,...)
These are the public logging messages.
Definition: CGestalt.cpp:292
#define set_index_f
Definition: Instrument.h:35
float * mSamples
sample buffer pointer
Definition: Granulator.h:70
IO * theIO
float mWidthBase
stereo width
Definition: Granulator.h:63
Inverse FFT.
Definition: Spectral.h:47
virtual void trigger()
reset internal time to restart envelope
Definition: Envelope.cpp:284
float mDurationBase
grain duration base
Definition: Granulator.h:61
void setParameter(unsigned selector, int argc, void **argv, const char *types)
Plug functions.
virtual void setParameter(unsigned selector, int argc, void **argv, const char *types)
Plug functions.
AdditiveInstrument.
void testSndFileBank()
float mVolumeBase
amplitude scale
Definition: Granulator.h:65
float mOffsetRange
offset range
Definition: Granulator.h:58
testStruct srcTestList[]
void testSOSInstrument()
Test SOS instrument - play 3 different timbres.
void testMonoFilePlayer()
Test the sound file player - mono, stereo input files.
float keyToFreq(unsigned midiKey)
MIDI Conversions.
Definition: CGestalt.cpp:483
void startThreads()
method to start-up the create/reap threads
Definition: Granulator.cpp:221
void addSndtoBank(const char *nam, UGenVector &snds, UGenVector &pans, Mixer &mix)
WaveShaper – Wave-shaping oscillator class.
Definition: WaveShaper.h:18
GrainPlayer – low-level granular synthesis generator, uses a list of current grains.
Definition: Granulator.h:88
void playMIDI(float dur, int chan, int key, int vel)
White noise – equal power per frequency.
Definition: Noise.h:45
virtual void play()
Definition: Instrument.cpp:70
void setBinMagPhase(int binNumber, float mag, float phase)
Definition: Spectral.cpp:121
void testStringChorus()
Test a chorus of strings – this demo plays an endless loop of string arpeggii. For each arpeggio...
struct used for the JUCE pop-up menu of tests (see the test files)
Definition: CSL_Types.h:265
float mOffsetBase
starting index offset base
Definition: Granulator.h:57
void testStereoFilePlayer()
A linearly interpolated segment – this has start and end values, and a duration (in seconds)...
Definition: Envelope.h:45
bool coin()
Answer true or false.
Definition: CGestalt.cpp:470
#define set_c_freq_f
Definition: Instrument.h:36
void testGrainCloud()
FMInstrument.
void testSndFileInstrument()
Test SoundFile instrument.
void trigger()
reset internal buffers to re-pluck the string.
float mEnvelopeRange
envelope range
Definition: Granulator.h:68
float fRandM(float minV, float maxV)
min - max (min/max)
Definition: CGestalt.cpp:426
#define set_duration_f
Instrument.h – The CSL pluggable instrument class. See the copyright notice and acknowledgment of au...
Definition: Instrument.h:19
float mWidthRange
stereo width
Definition: Granulator.h:64
void setRoomSize(float size)
Definition: Freeverb.cpp:235
ADSR = 4-segment attack/decay/sustain/release envelope class.
Definition: Envelope.h:153
int iRandV(int val)
Integer rands.
Definition: CGestalt.cpp:452
void testNoises()
Noise tests, WhiteNoise & PinkNoise - using Scalable to protect our ears.
void testWaveShaper()
Test the WaveShaper.
bool sleepSec(float dur)
Definition: CGestalt.cpp:379
std::vector< UnitGenerator * > UGenVector
Definition: CSL_Types.h:241
float mRateBase
grain rate base
Definition: Granulator.h:55
int iRandM(int minV, int maxV)
min - max (min/max)
Definition: CGestalt.cpp:458
float mDensityBase
grain density base
Definition: Granulator.h:59
void runTest(UnitGenerator &vox, double dur)
float mEnvelopeBase
envelope base: 0 = perc, 0.5 = triangle, 1 = reverse perc
Definition: Granulator.h:67
void test_vector_ifft()
do vector cross-fade the long way
MulOp – A BinaryOp that multiplies two UnitGenerators or fixed constants together, sample-by-sample.
Definition: BinaryOp.h:104
FancyFMInstrument - FM with vibrato (with AR-envelope), attack chiff (filtered noise with AR-envelope...
unsigned numSamples
of samples in buffer
Definition: Granulator.h:71
float fRandZ(void)
A variety of useful random-number functions.
Definition: CGestalt.cpp:414
void test_ifft()
float mVolumeRange
amplitude range
Definition: Granulator.h:66
void setRoot(UnitGenerator &root)
set/clear my graph root generator
Definition: CSL_Core.cpp:1405
Mixer – The n-input m-channel mixer class.
Definition: Mixer.h:21
float mDensityRange
grain density range
Definition: Granulator.h:60
void clearRoot()
Definition: CSL_Core.cpp:1410
void testString()
Plucked string simulation.
Sound file player instrument.
float mRateRange
rate random range
Definition: Granulator.h:56
void runTests()
The CSL mono-to-stereo L/R panner class.
Definition: Mixer.h:66
GrainCloud – routine for playing clouds under GUI control. This could be called a cloud or a stream...
Definition: Granulator.h:47
float mDurationRange
grain duration range
Definition: Granulator.h:62
void testFancyFMInstrument()
void addInput(UnitGenerator &inp)
Definition: Mixer.cpp:43
void testFMInstrument()
Test basic FM instrument.
float fRand1(void)
-1 - 1 (one)
Definition: CGestalt.cpp:420
#define set_m_freq_f
Definition: Instrument.h:37
bool isPlaying
whether I'm on or off
Definition: Granulator.h:72
void setScale(UnitGenerator &scale)
set the receiver's scale member to a UGen or a float
Definition: CSL_Core.cpp:1039
AddOp – A BinaryOp that adds two UnitGenerators or fixed constants together.
Definition: BinaryOp.h:85
void testSoundFileTranspose()
Test the sound file player with rate shift.
KarplusString – string model class.
Definition: KarplusString.h:31
int done
Definition: OSC_support.cpp:34
Pink noise – equal power per octave.
Definition: Noise.h:66