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

Всі канали спільно використовують обєкт «карта інструментів», що відповідає за управління набором інструментів, виконуючих конкретне музичний твір

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

БанкСтандарт General MIDI визначає всього два банки інструментів: один для мелодійних інструментів і один для ритмічних (ударних) Розширення стандарту (такі як Yamaha XG) встановлюють додаткові банки Банк вибирається контролерами 0x00 (старші 7 біт) і 0x20 (молодші 7 біт) Слідуючи стандарту Yamaha XG, я визначаю мелодичний банк General MIDI як нульовий а ритмічний банк General MIDI як банк з кодом 0x3F80 (старші 7 біт дорівнюють 0x7F, молодші 7 біт рівні 0) (Стандарт Roland GS також використовує нульовий елемент управління для завдання додаткових інструментів, але робить це дещо іншим способом)

Зауважимо, що відповідно до стандарту General MIDI синтезатор в режимі останнього повинен ігнорувати команди вибору банку

Програма Це необовязково те ж саме, що і інструмент Наприклад, ритмічний банк General MIDI визначає всього одну програму, проте вона містить 47 інструментів B мелодійному банку General MIDI 128 програм, кожна з них відповідає своєму інструменту

Нота B деяких програмах для кожної клавіші використовується свій інструмент Це особливо характерно для програм, що працюють з ударними інструментами (таких як ритмічна програма General MIDI) або зі спецефектами

Повна реалізація стандарту General MIDI зажадала б 175 різних описів інструментів Для простоти клас MidiInstrumentMap в сьогоденні прикладі управляє всього одним інструментом SineWaveInstrument (Див розділ

«Генератор синусоїди» у розділі 21)

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

Лістинг 2226 Карта інструментів MIDI

class MidiInstrumentMap {

private:

AbstractInstrument *_instr

public:

enum {gmMelodyBank = 0, gmRhythmBank = (0x7f&lt&lt7)} MidiInstrumentMap() {

//  _instr = new PluckedStringInstrument

_instr = new SineWaveInstrument

}

~MidiInstrumentMap() { delete _instr } AbstractInstrument *Instrument(int bank, int program, int

note)

void SamplingRate(long s) {

_instr-&gtSamplingRate(s)

}

}

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

Лістинг 2227 Методи роботи з картою інструментів MIDI

AbstractInstrument *MidiInstrumentMap::Instrument(

int bank, int program, int note) {

return _instr

}

Бажано мати можливість переглядати, які інструменти використовуються конкретним музичним твором Представлений нижче фрагмент програми просто виводить імя інструменту при першому його виборі Зауважимо, що тут присутні дві різні таблиці інструментів: одна для ритмічних, інша для мелодійних інструментів General MIDI

Лістинг 2228 Перегляд імені інструменту

{

if((bank == gmRhythmBank)&amp&amp(program==0)) { static bool instrumentPrinted[128] const struct {

int note

const char *name

} instruments[] = {

/ / Назви інструментів см за кодами в табл 226

{35,&quotAcoustic Bass Drum&quot}, {36,&quotBass Drum 1&quot},

{37,&quotSide Stick&quot}, {38,&quotAcoustic Snare&quot}, {39,&quotHand

Clap&quot},

{40,&quotElectric Snare&quot}, {41,&quotLow Floor Tom&quot},

{42,&quotClosed Hi-Hat&quot}, {43,&quotHigh Floor Tom&quot},

{44,&quotPedal Hi-Hat&quot}, {45,&quotLow Tom&quot}, {46,&quotOpen Hi-Hat&quot},

{47,&quotLow-MidTom&quot}, {48,&quotHi-MidTom&quot}, {49,&quotCrashCymbal

1&quot},

{50,&quotHigh Tom&quot}, {51,&quotRide Cymbal 1&quot}, {52,&quotChinese

Cymbal&quot},

{53,&quotRide Bell&quot}, {54,&quotTambourine&quot}, {55,&quotSplash Cymbal&quot},

{56,&quotCowbell&quot}, {5 7,&quotCrashCymbal 2&quot}, {58,&quotVibraslap&quot},

{59,&quotRide Cymbal 2&quot}, {60,&quotHi Bongo&quot}, {61,&quotLow Bongo&quot},

{62,&quotMute Hi Conga&quot}, {63,&quotOpen Hi Conga&quot}, {64,&quotLow

Conga&quot},

{65,&quotHighTimbale&quot}, {66,&quotLowTimbale&quot}, {67,&quotHigh

Agogo&quot},

{68,&quotLow Agogo&quot}, {69,&quotCabasa&quot}, {70,&quotMaracas&quot},

{71,&quotShort Whistle&quot}, {72,&quotLongWhistle&quot}, {73,&quotShort

Guiro&quot},

{74,&quotLong Guiro&quot}, {75,&quotClaves&quot}, {76,&quotHi Wood Block&quot},

{77,&quotLow Wood Block&quot}, {78,&quotMute Cuica&quot}, {79,&quotOpen

Cuica&quot},

{80,&quotMute Triangle&quot}, {81,&quotOpen Triangle&quot}, {0,0}

}

if (instrumentPrinted[note]) {

/ / Інструмент:

cerr &lt&lt &quotInstrument: " int i=0 while((instruments[i]note = 0)

&amp&amp (instruments[i]note = note+1)) {

i++

&quot)\n"

}

}

}

if ((instruments[i]note == 0))

/ / Невідома нота .. ударного інструмента ..

cerr &lt&lt &quotUnknown Percussion\n"

else

cerr &lt&lt instruments[i]name &lt&lt &quot (Note &quot &lt&lt note &lt&lt

instrumentPrinted[note] = true

if (bank == gmMelodyBank) {

static bool instrumentPrinted[128]

const char *instruments[] = {

/ / Назви інструментів по порядку номерів

/ / В табл 225

&quotAcoustic Grand Piano&quot, &quotBright Acoustic Piano&quot, &quotElectric Grand Piano&quot, &quotHonky-tonk Piano&quot, &quotElectric

Piano 1&quot ,

&quotElectric Piano 2&quot, &quotHarpsichord&quot, &quotClavinet&quot, &quotCelesta&quot,

&quotGlockenspiel&quot, &quotMusic Box&quot, &quotVibraphone&quot, &quotMarimba&quot, &quotXylophone&quot, &quotTubular Bells&quot, &quotDulcimer&quot, &quotDrawbar

Organ&quot ,

&quotPercussive Organ&quot, &quotRock Organ&quot, &quotChurch Organ&quot, &quotReed Organ&quot, &quotAccordion&quot, &quotHarmonica&quot, &quotTango

Accordion&quot,

&quotAcoustic Guitar (nylon)&quot, &quotAcoustic Guitar (steel)&quot,

Bass&quot , Bass 1&quot ,

&quotElectric Guitar (jazz)&quot, &quotElectric Guitar (clean)&quot, &quotElectric Guitar (mute)&quot, &quotOverdriven Guitar&quot, &quotDistortion Guitar&quot, &quotGuitar Harmonics&quot, &quotAcoustic

&quotElectric Bass (finger)&quot, &quotElectric Bass (pick)&quot, &quotFretless Bass&quot, &quotSlap Bass 1&quot, &quotSlap Bass 2&quot, &quotSynth

&quotSynth Bass 2&quot, &quotViolin&quot, &quotViola&quot, &quotCello&quot,

&quotContrabass&quot,

&quotTremolo Strings&quot, &quotPizzicato Strings&quot, &quotOrchestral

Harp&quot,

Oohs&quot, &quotTuba&quot,

&quotTimpani&quot, &quotString Ensemble 1&quot, &quotString Ensemble 2&quot, &quotSynthStrings 1&quot, &quotSynthStrings 2&quot, &quotChoir Aahs&quot, &quotVoice

&quotSynth Voice&quot, &quotOrchestra Hit&quot, &quotTrumpet&quot, &quotTrombone&quot, &quotMuted Trumpet&quot, &quotFrench Horn&quot, &quotBrass Section&quot,

&quotSynthBrass 1&quot,

&quotSynthBrass 2&quot, &quotSoprano Sax&quot, &quotAlto Sax&quot, &quotTenor Sax&quot, &quotBaritone Sax&quot, &quotOboe&quot, &quotEnglish Horn&quot, &quotBassoon&quot, &quotClarinet&quot, &quotPiccolo&quot, &quotFlute&quot, &quotRecorder&quot, &quotPan Flute&quot, &quotBlown Bottle&quot, &quotShakuhachi&quot, &quotWhistle&quot, &quotOcarina&quot, &quotLead 1 (square)&quot, &quotLead 2 (sawtooth)&quot, &quotLead 3

(calliope)&quot,

&quotLead 4 (chiff)&quot, &quotLead 5 (charang)&quot, &quotLead 6 (voice)&quot, &quotLead 7 (fifths)&quot, &quotLead 8 (bass+lead)&quot, &quotPad 1 (new

age)&quot,

&quotPad 2 (warm)&quot, &quotPad 3 (polysynth)&quot, &quotPad 4 (choir)&quot, &quotPad 5 (bowed)&quot, &quotPad 6 (metallic)&quot, &quotPad 7 (halo)&quot, &quotPad 8 (sweep)&quot, &quotFX 1 (rain)&quot, &quotFX 2 (soundtrack)&quot, &quotFX 3 (crystal)&quot, &quotFX 4 (atmosphere)&quot, &quotFX 5

(brightness)&quot,

&quotFX 6 (goblins)&quot, &quotFX 7 (echoes)&quot, &quotFX 8 (sci-fi)&quot,

&quotSitar&quot, &quotFiddle&quot,

&quotBanjo&quot, &quotShamisen&quot, &quotKoto&quot, &quotKalimba&quot, &quotBag pipe&quot, &quotShanai&quot, &quotTinkle Bell&quot, &quotAgogo&quot, &quotSteel Drums&quot,

&quotWoodblock&quot,

&quotTaiko Drum&quot, &quotMelodic Tom&quot, &quotSynth Drum&quot, &quotReverse

Cymba1&quot,

&quotGuitar Fret Noise&quot, &quotBreath Noise&quot, &quotSeashore&quot, &quotBird Tweet&quot, &quotTelephone Ring&quot, &quotHelicopter&quot,

&quotApplause&quot, &quotGunshot&quot

}

if(instrumentPrinted[program]) {

/ / Інструмент:

cerr &lt&lt &quotInstrument: &quot &lt&lt instruments[program] cerr &lt&lt &quot (Program &quot &lt&lt program &lt&lt &quot)\n" instrumentPrinted[program] = true

}

}

}

Застереження

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

Найбільш очевидний недолік полягає в тому, що не провадиться підтримка всього діапазону інструментів General MIDI Додавання нових інструментів вимагає розширення обєкта MidiInstrumentMap Один з підходів розробка набору семплів із збереженням їх у файлах і завантаження цих інструментів обєктом «карта інструментів» в міру необхідності Більш творче рішення полягає в вивченні додаткової літератури з синтезу звучання інструментів та розробці індивідуального програмного коду для кожного інструменту

Крім того, є безліч неврахованих деталей: програма, представлена ​​в цьому розділі, не підтримує монофонический / поліфонічний режим, управління висотою звуку, точне налаштування і багато контролери, регулярно використовувані композиторами, що працюють з MIDI

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

*

*