Клас SineWave

Щоб проілюструвати використання класу AudioAbstract, ми включили в цю книгу простий клас, за допомогою якого можна згенерувати синусоїду будь зазначеної частоти Даний клас показує, як потрібно реалізовувати реальний обробник звуку і, крім того, є прикладом використання загальних методів синтезу звуку

Лістинг 412 Програма sinewaveh

#ifndef SINEWAVE_H_INCLUDED

#define SINEWAVE_H_INCLUDED

#include &quotaudioh&quot

class SineWave: public AudioAbstract {

}

#endif

Лістинг 413 Програма sinewavecpp

#include &quotaudioh&quot

#include &quotsinewaveh&quot

#include &ltcmath&gt

Щоб не ускладнювати цей клас, я обмежився монозвучаніем Врахуйте, що для задіяння того або іншого формату необхідно просто підмінити

відповідне повідомлення MinMaxXxxxx Оскільки обєкт класу завжди буде першим у ланцюжку, мені навіть не доведеться викликати батьківські методи AudioAbstract :: MinMaxXxxxx

Лістинг 414 Члени класу SineWave

protected:

void MinMaxChannels(int *min, int *max, int *preferred) {

*min = *max = *preferred = 1

}

Основне завдання, що стоїть перед нами при розробці класу SineWave, така ж, що і при розробці будь-якого модуля обробки звуку, підмінити метод GetSamples так, щоб результатом його застосування були аудіодані B нашому класі SineWave це дуже просто При ініціалізації обєкту класу SineWave будується таблиця вибірок для хвилі частотою 1 Гц Вибираючи з цієї таблиці значення з кроком, рівним необхідній частоті, ви отримуєте на виході відповідні дані Основним завданням методу GetSamples є ретельні обчислення, необхідні для того, щоб при послідовних викликах поверталися дані, взяті з правильно зазначеної області

Лістинг 414 Члени класу SineWave (продовження)

protected:

size_t GetSamples(AudioSample *buff, size_t bytesWanted)

Лістинг 415 Реалізація класу SineWave

size_t SineWave::GetSamples(AudioSample *buff, size_t samplesWanted)

{

AudioSample *p = buff long samplesCopied = 0 while((samplesWanted &gt 1) ) {

*p = sine[pos]

pos += frequency

if (pos &gt length) pos = length

samplesWanted – samplesCopied ++ p++

}

return samplesCopied

}

B наведеному вище фрагменті коду використовуються чотири змінні, які повинні бути оголошені і відповідним чином проініціалізовані Загальна ініціалізація виконується за допомогою методу Init, що викликається з конструкторів

Лістинг 414 Члени класу SineWave (продовження)

private:

AudioSample * sine / / Таблиця моментальних значень синусоїди

int length / / Довжина вищезгаданої таблиці

int pos / / Поточне положення в таблиці

int frequency / / Необхідна частота вихідного сигналу,

public:

void Frequency(int f) { frequency = f }

private:

void Init(void) {

sine = (AudioSample *)0

length=0 pos=0 frequency=1

}

public:

SineWave(void):AudioAbstract() { Init() } SineWave(int f):AudioAbstract() {

Init() Frequency(f)

}

~SineWave(void) {

if (sine) delete [] sine

}

Ініціалізація таблиці труднощів не викликає Оскільки ця операція проводиться всього один раз і швидкість її виконання не є критичною, я використовую стандартні бібліотечні операції з плаваючою крапкою

Лістинг 414 Члени класу SineWave (продовження)

private:

void BuildTable(long rate)

Лістинг 415 Реалізація класу SineWave (продовження)

void SineWave::BuildTable(long rate) {

if (sine) {delete [] sine}

length = rate

sine = new AudioSample[length]

double scale = 20*(314159265358)/

static_cast&ltdouble&gt(length)

for (int i=0 i&ltlength i++) {

sine[i] = int(32767 * sin(static_cast&ltdouble&gt(i)*scale)

)

}

}

Своєчасна ініціалізація таблиці є непростим завданням B Зокрема, ця таблиця не може бути инициализирована доти, поки не відома частота дискретизації Простіше всього зробити це, підмінивши метод SamplingRate B пропонованому нами варіанті таблиця значень перераховуватиметься кожен раз при зміні частоти дискретизації

Лістинг 414 Члени класу SineWave (продовження)

public:

void SamplingRate(long rate) { AudioAbstract::SamplingRate(rate) BuildTable(rate)

}

Глава 5 Обєкти-програвачі

Джерело: Кінтцель Т Керівництво програміста по роботі зі звуком = A Programmers Guide to Sound: Пер з англ М: ДМК Пресс, 2000 432 с, іл (Серія «Для програмістів»)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*