This commit is contained in:
Erwin Coumans
2017-04-27 09:01:16 -07:00
6 changed files with 63 additions and 50 deletions

Binary file not shown.

View File

@@ -41,11 +41,12 @@ public:
m_soundSource->setOscillatorAmplitude(0,1); m_soundSource->setOscillatorAmplitude(0,1);
m_soundSource->setOscillatorAmplitude(1,1); m_soundSource->setOscillatorAmplitude(1,1);
m_soundEngine.addSoundSource(m_soundSource); m_soundEngine.addSoundSource(m_soundSource);
m_soundSource->startSound();
} }
virtual void exitPhysics() virtual void exitPhysics()
{ {
m_soundSource->stopSound();
m_soundEngine.exit(); m_soundEngine.exit();
} }
@@ -93,6 +94,7 @@ public:
m_soundSource->startSound(); m_soundSource->startSound();
} }
else else
{ {

View File

@@ -3,7 +3,7 @@
//http://github.com/thestk/stk //http://github.com/thestk/stk
//! ADSR envelope states. //! ADSR envelope states.
#include <stdio.h>
enum enum
{ {
@@ -40,7 +40,6 @@ double b3ADSR::tick()
m_value = m_target; m_value = m_target;
m_target = m_sustainLevel; m_target = m_sustainLevel;
m_state = ADSR_DECAY; m_state = ADSR_DECAY;
printf("ADSR_ATTACK->ADSR_DECAY\n");
} }
break; break;
@@ -52,7 +51,6 @@ double b3ADSR::tick()
{ {
m_value = m_sustainLevel; m_value = m_sustainLevel;
m_state = ADSR_SUSTAIN; m_state = ADSR_SUSTAIN;
printf("ADSR_DECAY->ADSR_SUSTAIN\n");
} }
} }
else else
@@ -62,7 +60,6 @@ double b3ADSR::tick()
{ {
m_value = m_sustainLevel; m_value = m_sustainLevel;
m_state = ADSR_SUSTAIN; m_state = ADSR_SUSTAIN;
printf("ADSR_DECAY->ADSR_SUSTAIN\n");
} }
} }
break; break;
@@ -73,7 +70,6 @@ double b3ADSR::tick()
{ {
m_value = 0.0; m_value = 0.0;
m_state = ADSR_IDLE; m_state = ADSR_IDLE;
printf("ADSR_RELEASE->ADSR_IDLE\n");
} }
} }
@@ -90,13 +86,11 @@ void b3ADSR::keyOn()
if (m_target <= 0.0) if (m_target <= 0.0)
m_target = 1.0; m_target = 1.0;
m_state = ADSR_ATTACK; m_state = ADSR_ATTACK;
printf("keyOn::ADSR_ATTACK\n");
} }
void b3ADSR::keyOff() void b3ADSR::keyOff()
{ {
m_target = 0.0; m_target = 0.0;
m_state = ADSR_RELEASE; m_state = ADSR_RELEASE;
printf("keyOff::ADSR_RELEASE\n");
} }

View File

@@ -20,10 +20,10 @@ b3ReadWavFile::b3ReadWavFile()
} }
b3ReadWavFile::~b3ReadWavFile() b3ReadWavFile::~b3ReadWavFile()
{ {
if (fd_)
fclose(fd_);
} }
void b3ReadWavFile::normalize(double peak) void b3ReadWavFile::normalize(double peak)
{ {
int i; int i;
@@ -105,7 +105,8 @@ bool b3ReadWavFile::getWavInfo(const char *fileName)
return false; return false;
char header[12]; char header[12];
if (fread(&header, 4, 3, fd_) != 3) goto error; if (fread(&header, 4, 3, fd_) != 3)
return false;
bool res = false; bool res = false;
if (!strncmp(header, "RIFF", 4) && if (!strncmp(header, "RIFF", 4) &&
@@ -116,22 +117,28 @@ bool b3ReadWavFile::getWavInfo(const char *fileName)
// Find "format" chunk ... it must come before the "data" chunk. // Find "format" chunk ... it must come before the "data" chunk.
char id[4]; char id[4];
int chunkSize; int chunkSize;
if (fread(&id, 4, 1, fd_) != 1) goto error; if (fread(&id, 4, 1, fd_) != 1)
return false;
while (strncmp(id, "fmt ", 4)) while (strncmp(id, "fmt ", 4))
{ {
if (fread(&chunkSize, 4, 1, fd_) != 1) goto error; if (fread(&chunkSize, 4, 1, fd_) != 1)
return false;
if (!m_machineIsLittleEndian) if (!m_machineIsLittleEndian)
{ {
b3Swap32((unsigned char *)&chunkSize); b3Swap32((unsigned char *)&chunkSize);
} }
if (fseek(fd_, chunkSize, SEEK_CUR) == -1) goto error; if (fseek(fd_, chunkSize, SEEK_CUR) == -1)
if (fread(&id, 4, 1, fd_) != 1) goto error; return false;
if (fread(&id, 4, 1, fd_) != 1)
return false;
} }
// Check that the data is not compressed. // Check that the data is not compressed.
unsigned short format_tag; unsigned short format_tag;
if (fread(&chunkSize, 4, 1, fd_) != 1) goto error; // Read fmt chunk size. if (fread(&chunkSize, 4, 1, fd_) != 1)
if (fread(&format_tag, 2, 1, fd_) != 1) goto error; return false; // Read fmt chunk size.
if (fread(&format_tag, 2, 1, fd_) != 1)
return false;
if (!m_machineIsLittleEndian) if (!m_machineIsLittleEndian)
{ {
b3Swap16((unsigned char *)&format_tag); b3Swap16((unsigned char *)&format_tag);
@@ -140,21 +147,27 @@ bool b3ReadWavFile::getWavInfo(const char *fileName)
if (format_tag == 0xFFFE) if (format_tag == 0xFFFE)
{ // WAVE_FORMAT_EXTENSIBLE { // WAVE_FORMAT_EXTENSIBLE
dataOffset_ = ftell(fd_); dataOffset_ = ftell(fd_);
if (fseek(fd_, 14, SEEK_CUR) == -1) goto error; if (fseek(fd_, 14, SEEK_CUR) == -1)
return false;
unsigned short extSize; unsigned short extSize;
if (fread(&extSize, 2, 1, fd_) != 1) goto error; if (fread(&extSize, 2, 1, fd_) != 1)
return false;
if (!m_machineIsLittleEndian) if (!m_machineIsLittleEndian)
{ {
b3Swap16((unsigned char *)&extSize); b3Swap16((unsigned char *)&extSize);
} }
if (extSize == 0) goto error; if (extSize == 0)
if (fseek(fd_, 6, SEEK_CUR) == -1) goto error; return false;
if (fread(&format_tag, 2, 1, fd_) != 1) goto error; if (fseek(fd_, 6, SEEK_CUR) == -1)
return false;
if (fread(&format_tag, 2, 1, fd_) != 1)
return false;
if (!m_machineIsLittleEndian) if (!m_machineIsLittleEndian)
{ {
b3Swap16((unsigned char *)&format_tag); b3Swap16((unsigned char *)&format_tag);
} }
if (fseek(fd_, dataOffset_, SEEK_SET) == -1) goto error; if (fseek(fd_, dataOffset_, SEEK_SET) == -1)
return false;
} }
if (format_tag != 1 && format_tag != 3) if (format_tag != 1 && format_tag != 3)
{ // PCM = 1, FLOAT = 3 { // PCM = 1, FLOAT = 3
@@ -164,7 +177,8 @@ bool b3ReadWavFile::getWavInfo(const char *fileName)
// Get number of channels from the header. // Get number of channels from the header.
short int temp; short int temp;
if (fread(&temp, 2, 1, fd_) != 1) goto error; if (fread(&temp, 2, 1, fd_) != 1)
return false;
if (!m_machineIsLittleEndian) if (!m_machineIsLittleEndian)
{ {
b3Swap16((unsigned char *)&temp); b3Swap16((unsigned char *)&temp);
@@ -173,7 +187,8 @@ bool b3ReadWavFile::getWavInfo(const char *fileName)
// Get file sample rate from the header. // Get file sample rate from the header.
int srate; int srate;
if (fread(&srate, 4, 1, fd_) != 1) goto error; if (fread(&srate, 4, 1, fd_) != 1)
return false;
if (!m_machineIsLittleEndian) if (!m_machineIsLittleEndian)
{ {
b3Swap32((unsigned char *)&srate); b3Swap32((unsigned char *)&srate);
@@ -182,8 +197,10 @@ bool b3ReadWavFile::getWavInfo(const char *fileName)
// Determine the data type. // Determine the data type.
dataType_ = 0; dataType_ = 0;
if (fseek(fd_, 6, SEEK_CUR) == -1) goto error; // Locate bits_per_sample info. if (fseek(fd_, 6, SEEK_CUR) == -1)
if (fread(&temp, 2, 1, fd_) != 1) goto error; return false; // Locate bits_per_sample info.
if (fread(&temp, 2, 1, fd_) != 1)
return false;
if (!m_machineIsLittleEndian) if (!m_machineIsLittleEndian)
{ {
b3Swap16((unsigned char *)&temp); b3Swap16((unsigned char *)&temp);
@@ -213,26 +230,32 @@ bool b3ReadWavFile::getWavInfo(const char *fileName)
} }
// Jump over any remaining part of the "fmt" chunk. // Jump over any remaining part of the "fmt" chunk.
if (fseek(fd_, chunkSize - 16, SEEK_CUR) == -1) goto error; if (fseek(fd_, chunkSize - 16, SEEK_CUR) == -1)
return false;
// Find "data" chunk ... it must come after the "fmt" chunk. // Find "data" chunk ... it must come after the "fmt" chunk.
if (fread(&id, 4, 1, fd_) != 1) goto error; if (fread(&id, 4, 1, fd_) != 1)
return false;
while (strncmp(id, "data", 4)) while (strncmp(id, "data", 4))
{ {
if (fread(&chunkSize, 4, 1, fd_) != 1) goto error; if (fread(&chunkSize, 4, 1, fd_) != 1)
return false;
if (!m_machineIsLittleEndian) if (!m_machineIsLittleEndian)
{ {
b3Swap32((unsigned char *)&chunkSize); b3Swap32((unsigned char *)&chunkSize);
} }
chunkSize += chunkSize % 2; // chunk sizes must be even chunkSize += chunkSize % 2; // chunk sizes must be even
if (fseek(fd_, chunkSize, SEEK_CUR) == -1) goto error; if (fseek(fd_, chunkSize, SEEK_CUR) == -1)
if (fread(&id, 4, 1, fd_) != 1) goto error; return false;
if (fread(&id, 4, 1, fd_) != 1)
return false;
} }
// Get length of data from the header. // Get length of data from the header.
int bytes; int bytes;
if (fread(&bytes, 4, 1, fd_) != 1) goto error; if (fread(&bytes, 4, 1, fd_) != 1)
return false;
if (!m_machineIsLittleEndian) if (!m_machineIsLittleEndian)
{ {
b3Swap32((unsigned char *)&bytes); b3Swap32((unsigned char *)&bytes);
@@ -248,16 +271,8 @@ bool b3ReadWavFile::getWavInfo(const char *fileName)
} }
wavFile_ = true; wavFile_ = true;
return true; return true;
error:
if (fd_)
fclose(fd_);
// oStream_ << "FileRead: error reading WAV file (" << fileName << ").";
return false;
} }
bool b3ReadWavFile::read(unsigned long startFrame, bool doNormalize) bool b3ReadWavFile::read(unsigned long startFrame, bool doNormalize)
{ {
// Make sure we have an open file. // Make sure we have an open file.

View File

@@ -103,6 +103,7 @@ bool b3SoundSource::computeSamples(double* sampleBuffer, int numSamples, double
{ {
int frame = 0; int frame = 0;
double data = m_data->m_oscillators[osc].m_amplitude * m_data->m_wavFile.tick(frame,&m_data->m_oscillators[osc].m_wavTicker); double data = m_data->m_oscillators[osc].m_amplitude * m_data->m_wavFile.tick(frame,&m_data->m_oscillators[osc].m_wavTicker);
samples[osc] += data; samples[osc] += data;
} }

View File

@@ -153,14 +153,15 @@ bool b3WriteWavFile::setWavFile(std::string fileName, int sampleRate, int numCha
char data[4] = {'d', 'a', 't', 'a'}; char data[4] = {'d', 'a', 't', 'a'};
int dataSize = 0; int dataSize = 0;
if (fwrite(&hdr, 1, bytesToWrite, m_data->m_file) != bytesToWrite) goto error; if (fwrite(&hdr, 1, bytesToWrite, m_data->m_file) != bytesToWrite)
if (fwrite(&data, 4, 1, m_data->m_file) != 1) goto error; return false;
if (fwrite(&dataSize, 4, 1, m_data->m_file) != 1) goto error; if (fwrite(&data, 4, 1, m_data->m_file) != 1)
return false;
if (fwrite(&dataSize, 4, 1, m_data->m_file) != 1)
return false;
return true; return true;
error:
return false;
} }
void b3WriteWavFile::closeWavFile() void b3WriteWavFile::closeWavFile()