1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
|
/* -*- 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>
#include "base/BaseTypes.h"
using namespace sv;
/**
* 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(double 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() {
double hpw = m_pulseWidth / 2.0;
for (int i = 0; i < m_frameCount; ++i) {
for (int c = 0; c < m_channelCount; ++c) {
double s = 0.0;
if (c == 0) {
double phase = (i * m_sinFreq * 2.0 * M_PI) / m_sampleRate;
s = sin(phase);
} else if (c == 1) {
int pulseNo = int((i * m_pulseFreq) / m_sampleRate);
int index = int(round((i * m_pulseFreq) -
(m_sampleRate * pulseNo)));
if (index < m_pulseWidth) {
s = 1.0 - fabs(hpw - index) / hpw;
if (pulseNo % 2) s = -s;
}
} else {
s = c / 20.0;
}
m_data[i * m_channelCount + c] = float(s);
}
}
}
float *getInterleavedData() const {
return m_data;
}
sv_frame_t getFrameCount() const {
return m_frameCount;
}
int getChannelCount() const {
return m_channelCount;
}
sv_samplerate_t getSampleRate () const {
return m_sampleRate;
}
double getDuration() const { // seconds
return m_duration;
}
private:
float *m_data;
sv_frame_t m_frameCount;
int m_channelCount;
double m_duration;
sv_samplerate_t m_sampleRate;
double m_sinFreq;
double m_pulseFreq;
double m_pulseWidth;
};
#endif
|