コード例 #1
0
ファイル: AbcFile.cpp プロジェクト: JeffHask/CS327Project4
SoundFile* AbcFile::createSoundFile() {
    SoundFile * soundFile = new SoundFile();
    soundFile->setBitDepth(bitRate);
    soundFile->setSampleRate(sampleRate);
    soundFile->setNumberOfChannels((int)instruments.size());
    int samplesPerCount = (int)ceil(60.0*sampleRate/tempo);
    for(int i = 0; i < instruments.size(); i++) {
        SoundFile * otherChannels = new SoundFile();
        otherChannels->setBitDepth(bitRate);
        otherChannels->setSampleRate(sampleRate);
        otherChannels->setNumberOfChannels((int)instruments.size());
        SoundGenerator::SoundBuilder builder;
        builder.setAttack(instruments[i]->getAttack()).setDecay(instruments[i]->getDecay()).setRelease(instruments[i]->getRelease()).setDuration((instruments[i]->findTotalCount() * 60 / tempo)).setSampleRate(sampleRate).setSustain(instruments[i]->getSustain());
        int numSamples = 0;
        for(int j = 0; j < instruments[i]->getScore().size(); j++) {
            SoundFile * tempFile = new SoundFile();
            tempFile->setBitDepth(bitRate);
            tempFile->setSampleRate(sampleRate);
            SoundGenerator soundGenerator = builder.setDuration((instruments[i]->getScore()[j]->getCount() * 60 / tempo)).setBitDepth(bitRate).build();
            tempFile->setNumberOfChannels((int)instruments.size());
            int waveForm = instruments[i]->getWaveform();
            if(waveForm == 1) {
                numSamples +=sineWave(instruments[i]->getScore()[j],samplesPerCount,tempFile);
            } else if(waveForm == 2) {
                numSamples +=sawtoothWave(instruments[i]->getScore()[j],samplesPerCount,tempFile);
            } else if (waveForm == 3) {
                numSamples +=triangleWave(instruments[i]->getScore()[j],samplesPerCount,tempFile);
            } else {
                numSamples +=pulseWave(instruments[i]->getScore()[j],samplesPerCount,tempFile);
            }
            soundGenerator.handleEnvelop(tempFile);
            if(i == 0) {
                *soundFile += tempFile;
            } else {
                *otherChannels += tempFile;
            }
        }
        for (int k = numSamples + 1; k < getMaxSamples(instruments); ++k) {
            SampleLine *sampleLine = new SampleLine();
            sampleLine->addNewChannel(0);
            if(i == 0) {
                soundFile->addSample(sampleLine);
            } else {
                otherChannels->addSample(sampleLine);
            }
        }
        if(std::find(mute.begin(),mute.end(),i) != mute.end()) {
            if(i == 0) {
                *soundFile * 0;
            } else {
                *otherChannels * 0;
            }
        }
        if(i != 0) {
            *soundFile | otherChannels;
        }
    }

    return soundFile;
}
コード例 #2
0
int Grid::getIntervalValue(int i, int count, int start, int end) {
	int range = (end - start);
	int interval = range / (count-1);
	//ofLog() << "range: " << range << " interval: " << interval;
	int index;
	if (count == 2) {
		index = ABS(i%2);
	}
	else {
		index = triangleWave(ABS(i), (count-1));
	}
	return start+interval*index;
}