Chris@756: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@756: Chris@756: /* Chris@756: Sonic Visualiser Chris@756: An audio file viewer and annotation editor. Chris@756: Centre for Digital Music, Queen Mary, University of London. Chris@756: This file copyright 2013 Chris Cannam. Chris@756: Chris@756: This program is free software; you can redistribute it and/or Chris@756: modify it under the terms of the GNU General Public License as Chris@756: published by the Free Software Foundation; either version 2 of the Chris@756: License, or (at your option) any later version. See the file Chris@756: COPYING included with this distribution for more information. Chris@756: */ Chris@756: Chris@756: #ifndef AUDIO_TEST_DATA_H Chris@756: #define AUDIO_TEST_DATA_H Chris@756: Chris@756: #include Chris@756: Chris@756: /** Chris@756: * Class that generates a single fixed test pattern to a given sample Chris@756: * rate and number of channels. Chris@756: * Chris@756: * The test pattern is two seconds long and consists of: Chris@756: * Chris@756: * -- in channel 0, a 600Hz sinusoid with peak amplitude 1.0 Chris@756: * Chris@756: * -- in channel 1, four triangular forms with peaks at +1.0, -1.0, Chris@756: * +1.0, -1.0 respectively, of 10ms width, starting at 0.0, 0.5, Chris@756: * 1.0 and 1.5 seconds; silence elsewhere Chris@756: * Chris@756: * -- in subsequent channels, a flat DC offset at +(channelNo / 20.0) Chris@756: */ Chris@756: class AudioTestData Chris@756: { Chris@756: public: Chris@756: AudioTestData(float rate, int channels) : Chris@756: m_channelCount(channels), Chris@756: m_duration(2.0), Chris@756: m_sampleRate(rate), Chris@756: m_sinFreq(600.0), Chris@756: m_pulseFreq(2) Chris@756: { Chris@756: m_frameCount = lrint(m_duration * m_sampleRate); Chris@756: m_data = new float[m_frameCount * m_channelCount]; Chris@756: m_pulseWidth = 0.01 * m_sampleRate; Chris@756: generate(); Chris@756: } Chris@756: Chris@756: ~AudioTestData() { Chris@756: delete[] m_data; Chris@756: } Chris@756: Chris@756: void generate() { Chris@756: Chris@756: float hpw = m_pulseWidth / 2.0; Chris@756: Chris@756: for (int i = 0; i < m_frameCount; ++i) { Chris@756: for (int c = 0; c < m_channelCount; ++c) { Chris@756: Chris@756: float s = 0.f; Chris@756: Chris@756: if (c == 0) { Chris@756: Chris@756: float phase = (i * m_sinFreq * 2.f * M_PI) / m_sampleRate; Chris@756: s = sinf(phase); Chris@756: Chris@756: } else if (c == 1) { Chris@756: Chris@756: int pulseNo = int((i * m_pulseFreq) / m_sampleRate); Chris@756: int index = (i * m_pulseFreq) - (m_sampleRate * pulseNo); Chris@756: if (index < m_pulseWidth) { Chris@756: s = 1.0 - fabsf(hpw - index) / hpw; Chris@756: if (pulseNo % 2) s = -s; Chris@756: } Chris@756: Chris@756: } else { Chris@756: Chris@756: s = c / 20.0; Chris@756: } Chris@756: Chris@756: m_data[i * m_channelCount + c] = s; Chris@756: } Chris@756: } Chris@756: } Chris@756: Chris@756: float *getInterleavedData() const { Chris@756: return m_data; Chris@756: } Chris@756: Chris@756: int getFrameCount() const { Chris@756: return m_frameCount; Chris@756: } Chris@756: Chris@756: int getChannelCount() const { Chris@756: return m_channelCount; Chris@756: } Chris@756: Chris@756: float getSampleRate () const { Chris@756: return m_sampleRate; Chris@756: } Chris@756: Chris@756: float getDuration() const { // seconds Chris@756: return m_duration; Chris@756: } Chris@756: Chris@756: private: Chris@756: float *m_data; Chris@756: int m_frameCount; Chris@756: int m_channelCount; Chris@756: float m_duration; Chris@756: float m_sampleRate; Chris@756: float m_sinFreq; Chris@756: float m_pulseFreq; Chris@756: float m_pulseWidth; Chris@756: }; Chris@756: Chris@756: #endif Chris@756: