Музичні інструменти

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

Реалізація цього підходу на C + + вимагає визначення двох взаємоповязаних класів Класи AbstractInstrument і AbstractNote визначать основні можливості обєктів інструментів і нот Типи інструментів і нот, які можуть використовуватися на практиці, будуть визначені пізніше

Лістинг 201 Програма instrumth

#ifndef  INST_H_INCLUDED

#define INST_H_INCLUDED

#include &quotaudioh&quot

class AbstractInstrument {

private:

long _samplingRate

public:

virtual void SamplingRate(long samplingRate) {

_samplingRate = samplingRate

}

virtual long SamplingRate() { return _samplingRate }

public:

virtual ~AbstractInstrument() {}

virtual AbstractNote * NewNote(float pitch, float volume) = 0

}

#endif

Клас AbstractInstrument має тільки одну нетривіальну функцію-

член NewNote Це не повинно дивувати Якщо провести аналогію зі скрипкою

і гармонікою, між якими можна знайти лише невелике подобу, цифрові інструменти теж формують своє звучання різними способами Найчастіше використовуватимутьсясемпли,які зберігають запис інструменту і за бажанням відтворюються Однак для синтезу звуку також можна використовувати складні математичні моделі

Єдина спільна риса всіх інструментальних типів полягає в тому, що вони генерують ноти, напевно, кілька одночасно B звязку з цим будь-який інструментальний клас для створення відповідного нотного обєкта застосовує метод NewNote Особливість його в тому, що ви запитуєте ноту у конкретного інструменту, а потім даєте команду, щоб вона програла в буфер Це можуть бути декілька нот, що програються одним інструментом одночасно

Ноти

Всі ноти мають певні властивості, які виражені в базовому класі AbstractNote Найважливіше полягає в тому, що нота може відтворити себе в «наданий» вами буфер Оскільки зазвичай звучать кілька нот одночасно, а результати відтворення накладаються, краще дотримуватися угоди, відповідно до якого ноти програються шляхом додавання їх вихідної інформації в буфер Це зменшує кількість необхідних операцій копіювання Слід упевнитися, що загальна гучність всіх нот, що програються в один буфер, менше одиниці, в іншому випадку виникнуть переповнення та спотворення

За замовчуванням повторні виклики для однієї і тієї ж ноти продовжують її програвання Метод Restart може використовуватися для повторного запуску (restart) ноти Метод Pitch встановлює необхідну вихідну частоту, наприклад, Pitch (440) використовується для програвання ноти Ля 440 Гц Метод Volume приймає значення між 0 і 1 для установки відносної гучності

Лістинг 202 Опис класу AbstractNote

class AbstractNote {

protected:

AbstractNote () {} / / Визначається, хто може

/ / Створювати обєкти

/ / Цього класу

public:

virtual ~ AbstractNote () {} / / Видаляти можна всім

virtual size_t AddSamples(AudioSample *buffer, size_t samples)

= 0

virtual void Restart () = 0 / / Перезапуск ноти

virtual void EndNote (float) = 0 / / Зупинка

/ / Відтворення ноти

virtual void Pitch (float) = 0, / / ​​Здається висота тону

/ / В герцах

virtual float Pitch () = 0 / / Отримано висота тону

virtual void Volume (float) = 0 / / Встановлюється рівень

(0,0-1,0)

virtual float Volume () = 0 / / Зчитується поточний рівень

}

Оголошення стандартного конструктора AbstractNote () як protected означає, що ви не створите без залучення додаткових коштів обєкт AbstractNote, так як тільки похідні класи можуть викликати конструктор Особливість полягає в тому, що ми просимо інструмент створити для нас ноту Ha практиці нотні класи сильно залежать від даних, що зберігаються в класі інструменту, який самостійно здатний проініціалізувати ноту належним чином

Для простоти використовуються числа з плаваючою точкою для завдання висоти і гучності Арифметика цих чисел зазвичай використовується тільки при створенні ноти, тому їх можна застосовувати навіть на повільних машинах (це практично не впливає на продуктивність) Для ініціалізації нової ноти потрібна невелика кількість операцій з плаваючою крапкою Значну частину часу виконання музичної програми займає підпрограма AddSamples, творці якої звичайно покладаються на швидку целочисленную арифметику або на обчислення з фіксованою точкою

Джерело: Кінтцель Т Керівництво програміста по роботі зі звуком = 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>

*

*