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