WaveTable* WaveTable::clone() { WaveTable* out = new WaveTable( tableLength, _frequency ); out->_accumulator = _accumulator; out->cloneTable( this ); return out; }
void process(short *data) { /* for (unsigned int i=0; i<size; ++i) { (*in)[i] = (float)(data[i] / 32767.0f); } // moog.Process(size,*in,NULL,out,NULL,NULL); lfo.Process(size,lfo_s); for (unsigned int i=0; i<size; ++i) lfo_s[i]=(lfo_s[i]*0.5+0.5); osc.Process(size,osc_s); for (unsigned int i=0; i<size; ++i) osc_s[i]=osc_s[i]*4040*lfo_s[i]+440; osc2.ProcessFM(size,osc2_s,osc_s); for (unsigned int i=0; i<size; ++i) ring_s[i]=osc2_s[i]*(*in)[i]; if (mix>0) (*in).MulMix(ring_s,mix); moog.Process(size,*in,NULL,out,NULL,NULL); for (unsigned int i=0; i<size; ++i) { data[i] = (short)((*out)[i] * 32767.0f); } */ lfo.Process(size,lfo_s); for (unsigned int i=0; i<size; ++i) lfo2_s[i]=pitch2+(lfo_s[i]*0.5+0.5)*200; for (unsigned int i=0; i<size; ++i) lfo3_s[i]=pitch3+(lfo_s[i]*0.5+0.5)*200; for (unsigned int i=0; i<size; ++i) lfo_s[i]=pitch1+(lfo_s[i]*0.5+0.5)*200; osc.ProcessFM(size,osc_s,lfo_s); osc2.ProcessFM(size,osc2_s,lfo2_s); osc3.ProcessFM(size,osc3_s,lfo3_s); // osc2.Process(size,osc2_s); // osc3.Process(size,osc3_s); moog.Process(size,osc2_s,NULL,&osc2_s,NULL,NULL); for (unsigned int i=0; i<size; ++i) { data[i] = (short)((osc_s[i]/3+ osc2_s[i]/3+ osc3_s[i]/3 )*32767.0f*volume); } }
void init(unsigned int s) { size=s; in = new Sample(size); out = new Sample(size); f1=f2=f3=0; moog.SetCutoff(0.2); moog.SetResonance(0.4); WaveTable::WriteWaves(); lfo.SetOctave(0); //lfo.Trigger(0,0.1,0.1,1); lfo.SetType(WaveTable::REVSAW); osc.SetOctave(0); osc2.SetOctave(0); osc3.SetOctave(0); osc2.SetType(WaveTable::NOISE); lfo.SetFineFreq(10); lfo_s.Allocate(size); lfo2_s.Allocate(size); lfo3_s.Allocate(size); osc_s.Allocate(size); osc2_s.Allocate(size); osc3_s.Allocate(size); ring_s.Allocate(size); osc.SetFineFreq(400); }
void set_param(int which,int amount) { /* if (which==0) moog.SetCutoff(amount/100.0f); else if (which==1) moog.SetResonance(amount/100.0f*0.5); else { mix=(amount-10)/100.0f; if (mix<0) mix=0; } */ float l=(100-amount)*2; if (which==3) { lfo.SetFineFreq(l*l*0.00005); moog.SetCutoff(l*0.05*0.4); } if (which==0) pitch1=(amount/100.0f)*200; if (which==1) pitch2=(amount/100.0f)*100; if (which==2) pitch3=(amount/100.0f)*150; // if (which==0) osc.SetFineFreq((amount/100.0f)*10); // if (which==1) osc2.SetFineFreq((amount/100.0f)*4); // if (which==2) osc3.SetFineFreq((amount/100.0f)*4); if (which==4) volume=amount/100.0f; }
TEST( WaveTable, Accumulator ) { int length = randomInt( 2, 256 ); float frequency = randomFloat( 20, 880 ); WaveTable* table = new WaveTable( length, frequency ); EXPECT_EQ( 0.0, table->getAccumulator() ) << "expected WaveTable accumulator to be 0.0 upon construction"; for ( int i = 0; i < randomInt( 1, 100 ); ++i ) { SAMPLE_TYPE value = randomSample( 0.0, ( SAMPLE_TYPE ) length ); table->setAccumulator( value ); EXPECT_EQ( value, table->getAccumulator() ) << "expected WaveTable accumulator to be " << value << " after setter, got " << table->getAccumulator() << " instead"; } delete table; }
TEST( WaveTable, HasContent ) { int length = randomInt( 2, 256 ); float frequency = randomFloat( 20, 880 ); WaveTable* table = new WaveTable( length, frequency ); ASSERT_FALSE( table->hasContent() ) << "expected WaveTable to have no content upon construction"; SAMPLE_TYPE* buffer = table->getBuffer(); for ( int i = 0; i < length; ++i ) buffer[ i ] = randomSample( -1.0, 1.0 ); ASSERT_TRUE( table->hasContent() ) << "expected WaveTable to report to have content after assignment of sample values in buffer"; delete table; }
TEST( WaveTable, Constructor ) { int length = randomInt( 2, 256 ); float frequency = randomFloat( 20, 880 ); WaveTable* table = new WaveTable( length, frequency ); EXPECT_EQ( length, table->tableLength ) << "expected WaveTable length to equal the value given in the constructor"; EXPECT_EQ( frequency, table->getFrequency() ) << "expected WaveTable frequency to equal the value given in the constructor"; EXPECT_EQ( 0.0, table->getAccumulator() ) << "expected WaveTable accumulator to be 0.0 upon construction"; ASSERT_FALSE( table->hasContent() ) << "expected WaveTable to have no content upon construction, but it did"; delete table; }
TEST( WaveTable, Frequency ) { int length = randomInt( 2, 256 ); float frequency = randomFloat( 20, 880 ); WaveTable* table = new WaveTable( length, frequency ); EXPECT_EQ( frequency, table->getFrequency() ) << "expected WaveTable frequency to equal the value given in the constructor"; float frequency2 = frequency; while ( frequency2 == frequency ) frequency2 = randomFloat( 20, 880 ); table->setFrequency( frequency2 ); EXPECT_EQ( frequency2, table->getFrequency() ) << "expected WaveTable frequency to equal to last set value"; delete table; }
void JavaUtilities::cacheTable( jint tableLength, jint waveformType, jdoubleArray aBuffer ) { WaveTable* table = new WaveTable( tableLength, waveformType ); SAMPLE_TYPE* buffer = table->getBuffer(); // get a pointer to the Java array jdouble* c_array; c_array = JavaBridge::getEnvironment()->GetDoubleArrayElements( aBuffer, 0 ); // exception checking if ( c_array == NULL ) return; // copy buffer contents for ( int i = 0; i < tableLength; i++ ) buffer[ i ] = ( SAMPLE_TYPE ) c_array[ i ]; // release the memory so Java can have it again JavaBridge::getEnvironment()->ReleaseDoubleArrayElements( aBuffer, c_array, 0 ); // store the table inside the pool TablePool::setTable( table, waveformType ); }
TEST( WaveTable, Clone ) { int length = randomInt( 2, 256 ); float frequency = randomFloat( 20, 880 ); WaveTable* table = new WaveTable( length, frequency ); table->setAccumulator( randomSample( 0.0, ( SAMPLE_TYPE ) length )); // randomly create content if ( randomBool() ) { for ( int i = 0; i < length; ++i ) table->getBuffer()[ i ] = randomSample( -1.0, 1.0 ); } // create clone and validate its properties against the source table WaveTable* clone = table->clone(); EXPECT_EQ( table->tableLength, clone->tableLength ) << "expected cloned WaveTables length to equal the source WaveTables"; EXPECT_EQ( table->getFrequency(), clone->getFrequency() ) << "expected cloned WaveTable frequency to equal the source WaveTables"; EXPECT_EQ( table->getAccumulator(), clone->getAccumulator() ) << "expected cloned WaveTable accumulator to equal the source WaveTables"; EXPECT_EQ( table->hasContent(), table->hasContent() ) << "expected cloned WaveTable hasContent value to equal the source WaveTables"; if ( table->hasContent() ) { for ( int i = 0; i < length; ++i ) { EXPECT_EQ( table->getBuffer()[ i ], clone->getBuffer()[ i ]) << "expected cloned WaveTable buffer to have equal buffer contents, but it didn't"; } } delete table; delete clone; }