Beispiel #1
0
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;

}
Beispiel #5
0
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;
}
Beispiel #6
0
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;
}
Beispiel #7
0
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;
}
Beispiel #8
0
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 );
}
Beispiel #10
0
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;
}