Програвач MIDI

B деякій мірі всі представлені мною класи читання аудіофайлів є інтерпретаторами Клас WaveRead, наприклад, інтерпретує заголовок та інформацію про стиснення для формування потоку значень AudioSample

Інструкції, які повинен інтерпретувати програвач MIDI, гораз-

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

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

B процесі відтворення використовується кілька обєктів Найбільш очевидним з них є обєкт MidiRead, використовуваний іншими частинами програми Він відповідає на звернення до GetSamples

При відповіді на ці запити обєкт MidiRead переглядає список подій

і передає запити до обєктів каналів справжньому серцю процесу програвання-

ведення Мій програвач MIDI складається з 16 синтезаторів, один для кожного каналу Обєкт MidiRead зберігає партитуру MIDI і використовує її для управління каналами, що відповідають за створення і керування нотними обєктами, які насправді і формують звук Кожен канал обєднує свої вихідні ноти, а обєкт MidiRead складає вихідну інформацію всіх каналів для отримання кінцевого звуку

Канали спільно використовують ряд ресурсів Обєкти каналів повинні в кінцевому рахунку отримати обєкти інструментів (дивися главу 21) і використовувати їх для створення нот Я створив один обєкт MidiInstrumentMap, який стежить за

безліччю обєктів інструментів, і обєкт MidiTuningMap, який знає,

як перетворювати значення нот MIDI в абсолютні значення висоти

Лістинг 2216 Програма midih

#ifndef MIDI_H_INCLUDED

#define MIDI_H_INCLUDED

#include &quotaudioh&quot

#include &quotinstrumth&quot

#include &quotsampledh&quot

#include &quotpluckedh&quot

#include &ltiostream&gt

#include &ltcmath&gt

bool IsMidiFile(istream &ampfile)

class MidiRead

class MidiRead: public AudioAbstract {

private:

/ / Інформація про програється пісні

MidiInstrumentMap *_instrumentMap MidiTuningMap *_tuningMap MidiChannelAbstract *_channel[16]

public:

MidiInstrumentMap *InstrumentMap() { return _instrumentMap } MidiTuningMap *TuningMap() { return _tuningMap }

private:

int _fileType / / Тип файлу Standard MIDI

int _numberTracks / / Кількість доріжок

int _timeFormat / / Формат кодування часу

unsigned long _samplesRemaining

/ / Кількість відліків

/ / До наступної події

private:

/ / Загальна інформація

void ReadTracks () / / Читаємо файл в память void ReadHeader () / / Читаємо файл в память

void PostProcess () / / Постобработка потоку подій

istream & _stream / / Читати файл

public:

MidiRead(istream &ampinput = cin)

~MidiRead()

protected:

void MinMaxSamplingRate{long *min, long *max, long *preferred)

{

*min = *max = *preferred = 11025

}

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

*min = *max = *preferred = 1

}

size_t GetSamples(AudioSample *buffer, size_t numSamples)

}

#endif

Лістинг 2217 Програма midicpp

#include &ltcstring&gt

#include &ltistream&gt

#include &ltcstdio&gt

#include &ltcmath&gt

#include &quotaudioh&quot

#include &quotinstrumth&quot

#include &quotsampledh&quot

#include &quotpluckedh&quot

#include &quotmidih&quot

/ / Читання файлу

MidiRead::MidiRead(istream &amps):AudioAbstract(), _stream(s) {

/ / Формат файлу: MIDI

cerr &lt&lt &quotFile Format: MIDI\n"

_currentEvent = _events = 0

for(int i=0i&lt16i++) _channel[i] = 0

_instrumentMap = new MidiInstrumentMap

_tuningMap = new MidiTuningMap

}

MidiRead::~MidiRead() {

MidiEvent *pEvent, *pNext = _events

while (pNext) {/ / Стираємо список подій

pEvent = pNext

pNext = pEvent-&gtnext

delete pEvent

}

for (int i = 0 i <16; i + +) {/ / Видаляємо об'єкти каналів.

if (_channel[i])

delete _channel[i]

}

delete _instrumentMap / / Видаляємо карту інструментів

delete _tuningMap / / Видаляємо карту настройки

}

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

*

*