void CloudsMixer::setup(int nChannels, int sampleRate, int bufferSize, int nBuffers)
{
    size_t size = nChannels * bufferSize * sizeof(float);
    
    musicArgs.buffer = (float*)malloc(size);
    musicArgs.bufferSize = bufferSize;
    musicArgs.nChannels = nChannels;
    memset(musicArgs.buffer, 0, size);
    
    diageticArgs.buffer = (float*)malloc(size);
    diageticArgs.bufferSize = bufferSize;
    diageticArgs.nChannels = nChannels;
    memset(diageticArgs.buffer, 0, size);
    
    size = nChannels*44100*sizeof(float); // 1 second delay line
    delayLine.buffer = (float*)malloc(size);
    delayLine.bufferSize = 44100;
    delayLine.nChannels = nChannels;
    delptr = 0;
    memset(delayLine.buffer, 0, size);
    
    // initialize OF audio streaming
    ofSoundStreamSetup(nChannels, 0, this, sampleRate, bufferSize, nBuffers);
    //ofSoundStreamStart();
    
    ofAddListener(GetCloudsAudioEvents()->fadeAudioDown, this, &CloudsMixer::fadeDown);
    ofAddListener(GetCloudsAudioEvents()->fadeAudioUp, this, &CloudsMixer::fadeUp);
}
示例#2
0
CloudsMixer::CloudsMixer()
{
    musicVol = 1.0;  // RTcmix main volume
    diageticVol = 1.0; // Tonic main volume

    // envelope follower
    attack = 200.0;
    decay = 17640.0;
    followgain = 0.;
    // compressor
    thresh = 0.2; // set lower for a quieter squish point
    ratio = 3.; // set higher for more squish

    showCompressor = false;

    fsig = 0; // no fade
    GetCloudsAudioEvents()->fadeValue = 1.0; // normal gain
    dval = 0.; // delay gain
    famt = 0.025; // fade amount
    GetCloudsAudioEvents()->gain = 0;
}
// selfBegin is called when the system is ready to be shown
// this is a good time to prepare for transitions
// but try to keep it light weight as to not cause stuttering
void CloudsVisualSystemConnectors::selfBegin(){

    // sound
    ofAddListener(GetCloudsAudioEvents()->diageticAudioRequested, this, &CloudsVisualSystemConnectors::audioRequested);
    
//    for (int i = 0; i < 1; i++){
//        if (playSample[i]) {
//            soundTriggers[i].trigger();
//        }
//    }
    
    for(int i =0; i<tonicSamples.size();i++){
        if (tonicSamples[i].playSample) {
            tonicSamples[i].soundTrigger.trigger();
        }
    }
}
示例#4
0
//void CloudsMixer::fillBuffer(float *output, int bufferSize, int nChannels)
void CloudsMixer::audioOut(float * output, int bufferSize, int nChannels )
{
    GetCloudsAudioEvents()->dopull = GetCloudsAudioEvents()->fadeValue > 0;
    // check for buffer size mismatch
    if (bufferSize != musicArgs.bufferSize ||
            bufferSize != diageticArgs.bufferSize) {
        return;
    }

    // check for channels mismatch
    if (nChannels != musicArgs.nChannels ||
            nChannels != diageticArgs.nChannels)
    {
        return;
    }

    size_t size = nChannels*bufferSize*sizeof(float);
    // fill music buffer
    memset(musicArgs.buffer, 0, size);
    ofNotifyEvent(GetCloudsAudioEvents()->musicAudioRequested, musicArgs, this);

    // fill diagetic buffer
    memset(diageticArgs.buffer, 0, size);
    ofNotifyEvent(GetCloudsAudioEvents()->diageticAudioRequested, diageticArgs, this);

    // mix
    for (int i=0; i<bufferSize*nChannels; i++)
    {
        output[i] = (musicArgs.buffer[i]*musicVol*GetCloudsAudioEvents()->fadeValue) + diageticArgs.buffer[i]*diageticVol;

        // read from delay
        if(GetCloudsAudioEvents()->dodelay) {
            output[i]+=delayLine.buffer[(delptr-44099+44100)%44100]*dval;
            delayLine.buffer[delptr%44100] = delayLine.buffer[delptr%44100]*0.8;
        }
        // write into delay
        else {
            delayLine.buffer[delptr%44100] = musicArgs.buffer[i]*musicVol + diageticArgs.buffer[i]*diageticVol;
        }
        delptr++;


        // Luke's Compressor
        float current = abs(output[i]);
        if(current>followgain) {
            followgain = followgain + ((current-followgain)/attack);
        }
        else {
            followgain = followgain + ((current-followgain)/decay);
        }
        if(followgain>thresh) GetCloudsAudioEvents()->gain = 1.0-((followgain-thresh)*ratio);
        else GetCloudsAudioEvents()->gain = 1.0;

        output[i] = output[i]*GetCloudsAudioEvents()->gain*MASTER_GAIN;

        // clip
        if (output[i] > 1) {
            output[i] = 1;
        }
        else if (output[i] < -1) {
            output[i] = -1;
        }
    }

    // figure out when delay turns off
    if(GetCloudsAudioEvents()->dodelay)
    {
        float delsum = 0.;
        for(int i = 0; i<44100; i++)
        {
            delsum += fabs(delayLine.buffer[i]);
        }
        if(delsum<20.) {
            GetCloudsAudioEvents()->dodelay = false;
            dval = 0.;
        }
    }

    // adjust fade
    if(fsig==1) // fading up
    {
        GetCloudsAudioEvents()->fadeValue+=famt;
        if(GetCloudsAudioEvents()->fadeValue>0.999)
        {
            GetCloudsAudioEvents()->fadeValue = 1.0;
            fsig = 0;
            delptr = 0; // reset delay line
        }
    }
    else if(fsig==-1) // fading down
    {
        GetCloudsAudioEvents()->fadeValue-=famt;
        dval+=famt; // fade in delay while fading out audio
        if(dval>1.0) dval = 1.0;
        if(GetCloudsAudioEvents()->fadeValue<0.001)
        {
            GetCloudsAudioEvents()->fadeValue = 0.;
            fsig = 0;
            if(GetCloudsAudioEvents()->setupflush) {
                GetCloudsAudioEvents()->doflush = true;
            }
        }
    }


    /*
    if(showCompressor) {
        for(float i = 0;i<0.5;i=i+0.01)
        {
            if (followgain>i) cout << "•"; else cout << " ";
        }
        cout << " : ";
        for(float i = 0.5;i<1.;i=i+0.01)
        {
            if (gain>i) cout << "•"; else cout << " ";
        }
        cout << endl;
    }
     */


    //cout << followgain << " : " << gain << endl;



}
// this is called when your system is no longer drawing.
// Right after this selfUpdate() and selfDraw() won't be called any more
void CloudsVisualSystemConnectors::selfEnd(){
    volumeControl.value(0);
    ofRemoveListener(GetCloudsAudioEvents()->diageticAudioRequested, this, &CloudsVisualSystemConnectors::audioRequested);    
}
void CloudsVisualSystemMemory::selfEnd()
{
    ofRemoveListener(GetCloudsAudioEvents()->diageticAudioRequested, this, &CloudsVisualSystemMemory::audioRequested);
    
}
void CloudsVisualSystemMemory::selfBegin()
{
     ofAddListener(GetCloudsAudioEvents()->diageticAudioRequested, this, &CloudsVisualSystemMemory::audioRequested);
    generate();
}