Код ноты(октава): подставляй код и нота зазвучит.
До(1):24,До#(1):25,Ре(1):26,Ре#(1):27,Ми(1):28,Фа(1):29
Фа#(1):2A,Соль(1):2B,Соль#(1):2C,Ля(1):2D,Ля#(1):2E,Си(1):2F,
До(2):30,До#(2):31,Ре(2):32,Ре#(2):33,Ми(2):34,Фа(2):35,
Фа#(2):36,Соль(2):37,Соль#(2):38,Ля(2):39,Ля#(2):3A,Си(2):3B,
До(3):3C,До#(3):3D,Ре(3):3E,Ре#(3):3F,Ми(3):40,Фа(3):41,
Фа#(3):42,Соль(3):43,Соль#(3):44,Ля(3):45,Ля#(3):46,Си(3):47,
До(4):48,До#(4):49,Ре(4):4A,Ре#(4):4B,Ми(4):4C,Фа(4):4D,
Фа#(4):4E,Соль(4):4F,Соль#(4):50,Ля(4):51,Ля#(4):52,Си(4):53,
До(5):54,До#(5):55,Ре(5):56,Ре#(5):57,Ми(5):58,Фа(5):59,
Фа#(5):5A,Соль(5):5B,Соль#(5):5C,Ля(5):5D,Ля#(5):5E,Си(5):5F,До(6):60.
uses
mmSystem, System, SysUtils, Controls;
var
Note : cardinal;
MidiOut: hMidiOut;
Открываем синтезатор при создании
procedure OpenMIDImap;
begin
MidiOutOpen(@MidiOut, MIDI_MAPPER, Handle, 0, CALLBACK_WINDOW);
end;
Извлечение самих нот
нажимаем
begin
Note := StrToInt('$007F' + 'Код ноты' + '90');
midiOutShortMsg(MidiOut, StrToInt('$0000' + 'номер инструм. 0..79' + 'C0'));
midiOutShortMsg(MidiOut, Note);
end;
Отпускаем
begin
Note := StrToInt('$007F' + 'Код ноты' + '80');
MidiOutShortMsg(MidiOut, Note);
end;
Закрываем синтезатор при дестрое
procedure CloseMIDImap;
begin
midiOutShortMsg(MidiOut, $00007BB0);
midiOutClose(MidiOut);
end;
Изучение MIDI
Однако,времени с утра было немного,посему только это и успел.На работе,когда появилось время,ознакомился поплотнее,и понял,что не хватает главного…А именно,как вообще звук представлять-то?!Функции информации,открытия,воспроизведения и проч. нашёл,но всех их хватает на «lpMIDIData*-указатель на буфер с данными,а дальше как хотите,так и формируйте их:p».Т.е. никакой инфы по кодированию,максимум «этой функцией можно сформировать буфер,а этой–воспроизвести».Перерыл весь раздел,посвящённый этому делу,но абсолютно ничего не нашёл
Странно,очень странно…Подскажите,пожалуйста,годный источник–наверняка кто-то этим занимался
Цитата: @pixo $oft
Подскажите,пожалуйста,годный источник–наверняка кто-то этим занимался
Пытался залить на сайт готовый (правда Делфийский) примерчик, но пока ёк...
Извн. придётся на пальцах, может поможет паскалька?
Код:
А где можно почитать более расширенную версию этого дела?
P.S.Как увидел в теме про новый движок слово MIDIkeyboard,сразу почему-то подумал об этом:)
здесь (это первая часть, что то вроде введения), и здесь (собственно, описание команд).
Там довольно детально всё описано, да и в целом материал очень интересный и полезный к изучению.
Ну а самый простой способ эти миди-команды посылать -- это используя функцию midiOutShortMsg(), как уже было показано в примере выше.
Однако, немного забегая вперёд, поясню:
Стандартные (которых подавляющее большинство) миди-сообщения состоят из 3-х байт.
Команды в миди-сообщениях имеют старший бит установленный в 1, при этом в параметрах команды старший бит всегда сброшен в 0.
Ну а для удобства работы с функцией midiOutShortMsg(), на С полезно использовать вот такой макрос:
С его помощью формируется миди-ссобщение, для передачи его функции midiOutShortMsg()
в качестве параметра.
Так же в дополнение приведу список инструментов.
Так же приведу список нот перкуссии.
Это именно номера нот, но играют они различными ударными на одной тональности.
При этом канал должен быть то ли 10, то ли 15 (не помню уже).
Инструмент же лучше выбрать №1, иначе возможны глюки.
Ознакомиться с миди-командами и их концепцией в целом можно
Там довольно детально всё описано, да и в целом материал очень интересный и полезный к изучению.
Ну а самый простой способ эти миди-команды посылать -- это используя функцию midiOutShortMsg(), как уже было показано в примере выше.
Однако, немного забегая вперёд, поясню:
Стандартные (которых подавляющее большинство) миди-сообщения состоят из 3-х байт.
Команды в миди-сообщениях имеют старший бит установленный в 1, при этом в параметрах команды старший бит всегда сброшен в 0.
Ну а для удобства работы с функцией midiOutShortMsg(), на С полезно использовать вот такой макрос:
Код:
#define MIDI_CMD(bEv,bPar1,bPar2) (((bEv)&0xFF)|(((bPar1)&0xFF)<<8)|(((bPar2)&0xFF)<<16))
С его помощью формируется миди-ссобщение, для передачи его функции midiOutShortMsg()
в качестве параметра.
Так же в дополнение приведу список инструментов.
Код:
/* Instruments */
/* 1 "Acoustic Grand Piano", */
/* 2 "Bright Acoustic Piano", */
/* 3 "Electric Grand Piano", */
/* 4 "Honky-tonk Piano", */
/* 5 "Electric Piano 1", */
/* 6 "Electric Piano 2", */
/* 7 "Harpsichord", */
/* 8 "Clavi", */
/* 9 "Celesta", */
/* 10 "Glockenspiel", */
/* 11 "Music Box", */
/* 12 "Vibraphone", */
/* 13 "Marimba", */
/* 14 "Xylophone", */
/* 15 "Tubular Bells", */
/* 16 "Dulcimer", */
/* 17 "Drawbar Organ", */
/* 18 "Percussive Organ", */
/* 19 "Rock Organ", */
/* 20 "Church Organ", */
/* 21 "Reed Organ", */
/* 22 "Accordion", */
/* 23 "Harmonica", */
/* 24 "Tango Accordion", */
/* 25 "Acoustic Guitar (nylon)", */
/* 26 "Acoustic Guitar (steel)", */
/* 27 "Electric Guitar (jazz)", */
/* 28 "Electric Guitar (clean)", */
/* 29 "Electric Guitar (muted)", */
/* 30 "Overdriven Guitar", */
/* 31 "Distortion Guitar", */
/* 32 "Guitar harmonics", */
/* 33 "Acoustic Bass", */
/* 34 "Electric Bass (finger)", */
/* 35 "Electric Bass (pick)", */
/* 36 "Fretless Bass", */
/* 37 "Slap Bass 1", */
/* 38 "Slap Bass 2", */
/* 39 "Synth Bass 1", */
/* 40 "Synth Bass 2", */
/* 41 "Violin", */
/* 42 "Viola", */
/* 43 "Cello", */
/* 44 "Contrabass", */
/* 45 "Tremolo Strings", */
/* 46 "Pizzicato Strings", */
/* 47 "Orchestral Harp", */
/* 48 "Timpani", */
/* 49 "String Ensemble 1", */
/* 50 "String Ensemble 2", */
/* 51 "SynthStrings 1", */
/* 52 "SynthStrings 2", */
/* 53 "Choir Aahs", */
/* 54 "Voice Oohs", */
/* 55 "Synth Voice", */
/* 56 "Orchestra Hit", */
/* 57 "Trumpet", */
/* 58 "Trombone", */
/* 59 "Tuba", */
/* 60 "Muted Trumpet", */
/* 61 "French Horn", */
/* 62 "Brass Section", */
/* 63 "SynthBrass 1", */
/* 64 "SynthBrass 2", */
/* 65 "Soprano Sax", */
/* 66 "Alto Sax", */
/* 67 "Tenor Sax", */
/* 68 "Baritone Sax", */
/* 69 "Oboe", */
/* 70 "English Horn", */
/* 71 "Bassoon", */
/* 72 "Clarinet", */
/* 73 "Piccolo", */
/* 74 "Flute", */
/* 75 "Recorder", */
/* 76 "Pan Flute", */
/* 77 "Blown Bottle", */
/* 78 "Shakuhachi", */
/* 79 "Whistle", */
/* 80 "Ocarina", */
/* 81 "Lead 1 (square)", */
/* 82 "Lead 2 (sawtooth)", */
/* 83 "Lead 3 (calliope)", */
/* 84 "Lead 4 (chiff)", */
/* 85 "Lead 5 (charang)", */
/* 86 "Lead 6 (voice)", */
/* 87 "Lead 7 (fifths)", */
/* 88 "Lead 8 (bass + lead)", */
/* 89 "Pad 1 (new age)", */
/* 90 "Pad 2 (warm)", */
/* 91 "Pad 3 (polysynth)", */
/* 92 "Pad 4 (choir)", */
/* 93 "Pad 5 (bowed)", */
/* 94 "Pad 6 (metallic)", */
/* 95 "Pad 7 (halo)", */
/* 96 "Pad 8 (sweep)", */
/* 97 "FX 1 (rain)", */
/* 98 "FX 2 (soundtrack)", */
/* 99 "FX 3 (crystal)", */
/* 100 "FX 4 (atmosphere)", */
/* 101 "FX 5 (brightness)", */
/* 102 "FX 6 (goblins)", */
/* 103 "FX 7 (echoes)", */
/* 104 "FX 8 (sci-fi)", */
/* 105 "Sitar", */
/* 106 "Banjo", */
/* 107 "Shamisen", */
/* 108 "Koto", */
/* 109 "Kalimba", */
/* 110 "Bag pipe", */
/* 111 "Fiddle", */
/* 112 "Shanai", */
/* 113 "Tinkle Bell", */
/* 114 "Agogo", */
/* 115 "Steel Drums", */
/* 116 "Woodblock", */
/* 117 "Taiko Drum", */
/* 118 "Melodic Tom", */
/* 119 "Synth Drum", */
/* 120 "Reverse Cymbal", */
/* 121 "Guitar Fret Noise", */
/* 122 "Breath Noise", */
/* 123 "Seashore", */
/* 124 "Bird Tweet", */
/* 125 "Telephone Ring", */
/* 126 "Helicopter", */
/* 127 "Applause", */
/* 128 "Gunshot"; */
/* 1 "Acoustic Grand Piano", */
/* 2 "Bright Acoustic Piano", */
/* 3 "Electric Grand Piano", */
/* 4 "Honky-tonk Piano", */
/* 5 "Electric Piano 1", */
/* 6 "Electric Piano 2", */
/* 7 "Harpsichord", */
/* 8 "Clavi", */
/* 9 "Celesta", */
/* 10 "Glockenspiel", */
/* 11 "Music Box", */
/* 12 "Vibraphone", */
/* 13 "Marimba", */
/* 14 "Xylophone", */
/* 15 "Tubular Bells", */
/* 16 "Dulcimer", */
/* 17 "Drawbar Organ", */
/* 18 "Percussive Organ", */
/* 19 "Rock Organ", */
/* 20 "Church Organ", */
/* 21 "Reed Organ", */
/* 22 "Accordion", */
/* 23 "Harmonica", */
/* 24 "Tango Accordion", */
/* 25 "Acoustic Guitar (nylon)", */
/* 26 "Acoustic Guitar (steel)", */
/* 27 "Electric Guitar (jazz)", */
/* 28 "Electric Guitar (clean)", */
/* 29 "Electric Guitar (muted)", */
/* 30 "Overdriven Guitar", */
/* 31 "Distortion Guitar", */
/* 32 "Guitar harmonics", */
/* 33 "Acoustic Bass", */
/* 34 "Electric Bass (finger)", */
/* 35 "Electric Bass (pick)", */
/* 36 "Fretless Bass", */
/* 37 "Slap Bass 1", */
/* 38 "Slap Bass 2", */
/* 39 "Synth Bass 1", */
/* 40 "Synth Bass 2", */
/* 41 "Violin", */
/* 42 "Viola", */
/* 43 "Cello", */
/* 44 "Contrabass", */
/* 45 "Tremolo Strings", */
/* 46 "Pizzicato Strings", */
/* 47 "Orchestral Harp", */
/* 48 "Timpani", */
/* 49 "String Ensemble 1", */
/* 50 "String Ensemble 2", */
/* 51 "SynthStrings 1", */
/* 52 "SynthStrings 2", */
/* 53 "Choir Aahs", */
/* 54 "Voice Oohs", */
/* 55 "Synth Voice", */
/* 56 "Orchestra Hit", */
/* 57 "Trumpet", */
/* 58 "Trombone", */
/* 59 "Tuba", */
/* 60 "Muted Trumpet", */
/* 61 "French Horn", */
/* 62 "Brass Section", */
/* 63 "SynthBrass 1", */
/* 64 "SynthBrass 2", */
/* 65 "Soprano Sax", */
/* 66 "Alto Sax", */
/* 67 "Tenor Sax", */
/* 68 "Baritone Sax", */
/* 69 "Oboe", */
/* 70 "English Horn", */
/* 71 "Bassoon", */
/* 72 "Clarinet", */
/* 73 "Piccolo", */
/* 74 "Flute", */
/* 75 "Recorder", */
/* 76 "Pan Flute", */
/* 77 "Blown Bottle", */
/* 78 "Shakuhachi", */
/* 79 "Whistle", */
/* 80 "Ocarina", */
/* 81 "Lead 1 (square)", */
/* 82 "Lead 2 (sawtooth)", */
/* 83 "Lead 3 (calliope)", */
/* 84 "Lead 4 (chiff)", */
/* 85 "Lead 5 (charang)", */
/* 86 "Lead 6 (voice)", */
/* 87 "Lead 7 (fifths)", */
/* 88 "Lead 8 (bass + lead)", */
/* 89 "Pad 1 (new age)", */
/* 90 "Pad 2 (warm)", */
/* 91 "Pad 3 (polysynth)", */
/* 92 "Pad 4 (choir)", */
/* 93 "Pad 5 (bowed)", */
/* 94 "Pad 6 (metallic)", */
/* 95 "Pad 7 (halo)", */
/* 96 "Pad 8 (sweep)", */
/* 97 "FX 1 (rain)", */
/* 98 "FX 2 (soundtrack)", */
/* 99 "FX 3 (crystal)", */
/* 100 "FX 4 (atmosphere)", */
/* 101 "FX 5 (brightness)", */
/* 102 "FX 6 (goblins)", */
/* 103 "FX 7 (echoes)", */
/* 104 "FX 8 (sci-fi)", */
/* 105 "Sitar", */
/* 106 "Banjo", */
/* 107 "Shamisen", */
/* 108 "Koto", */
/* 109 "Kalimba", */
/* 110 "Bag pipe", */
/* 111 "Fiddle", */
/* 112 "Shanai", */
/* 113 "Tinkle Bell", */
/* 114 "Agogo", */
/* 115 "Steel Drums", */
/* 116 "Woodblock", */
/* 117 "Taiko Drum", */
/* 118 "Melodic Tom", */
/* 119 "Synth Drum", */
/* 120 "Reverse Cymbal", */
/* 121 "Guitar Fret Noise", */
/* 122 "Breath Noise", */
/* 123 "Seashore", */
/* 124 "Bird Tweet", */
/* 125 "Telephone Ring", */
/* 126 "Helicopter", */
/* 127 "Applause", */
/* 128 "Gunshot"; */
Так же приведу список нот перкуссии.
Это именно номера нот, но играют они различными ударными на одной тональности.
При этом канал должен быть то ли 10, то ли 15 (не помню уже).
Инструмент же лучше выбрать №1, иначе возможны глюки.
Код:
/* Percussion notes */
/* 35 "Acoustic Bass Drum", */
/* 36 "Bass Drum 1", */
/* 37 "Side Stick", */
/* 38 "Acoustic Snare", */
/* 39 "Hand Clap", */
/* 40 "Electric Snare", */
/* 41 "Low Floor Tom", */
/* 42 "Closed Hi Hat", */
/* 43 "High Floor Tom", */
/* 44 "Pedal Hi-Hat", */
/* 45 "Low Tom", */
/* 46 "Open Hi-Hat", */
/* 47 "Low-Mid Tom", */
/* 48 "Hi-Mid Tom", */
/* 49 "Crash Cymbal 1", */
/* 50 "High Tom", */
/* 51 "Ride Cymbal 1", */
/* 52 "Chinese Cymbal", */
/* 53 "Ride Bell", */
/* 54 "Tambourine ", */
/* 55 "Splash Cymbal", */
/* 56 "Cowbell", */
/* 57 "Crash Cymbal 2", */
/* 58 "Vibraslap", */
/* 59 "Ride Cymbal 2", */
/* 60 "Hi Bongo", */
/* 61 "Low Bongo", */
/* 62 "Mute Hi Conga", */
/* 63 "Open Hi Conga", */
/* 64 "Low Conga", */
/* 65 "High Timbale", */
/* 66 "Low Timbale", */
/* 67 "High Agogo", */
/* 68 "Low Agogo", */
/* 69 "Cabasa", */
/* 70 "Maracas", */
/* 71 "Short Whistle", */
/* 72 "Long Whistle", */
/* 73 "Short Guiro", */
/* 74 "Long Guiro", */
/* 75 "Claves", */
/* 76 "Hi Wood Block", */
/* 77 "Low Wood Block", */
/* 78 "Mute Cuica", */
/* 79 "Open Cuica", */
/* 80 "Mute Triangle", */
/* 81 "Open Triangle"; */
/* 35 "Acoustic Bass Drum", */
/* 36 "Bass Drum 1", */
/* 37 "Side Stick", */
/* 38 "Acoustic Snare", */
/* 39 "Hand Clap", */
/* 40 "Electric Snare", */
/* 41 "Low Floor Tom", */
/* 42 "Closed Hi Hat", */
/* 43 "High Floor Tom", */
/* 44 "Pedal Hi-Hat", */
/* 45 "Low Tom", */
/* 46 "Open Hi-Hat", */
/* 47 "Low-Mid Tom", */
/* 48 "Hi-Mid Tom", */
/* 49 "Crash Cymbal 1", */
/* 50 "High Tom", */
/* 51 "Ride Cymbal 1", */
/* 52 "Chinese Cymbal", */
/* 53 "Ride Bell", */
/* 54 "Tambourine ", */
/* 55 "Splash Cymbal", */
/* 56 "Cowbell", */
/* 57 "Crash Cymbal 2", */
/* 58 "Vibraslap", */
/* 59 "Ride Cymbal 2", */
/* 60 "Hi Bongo", */
/* 61 "Low Bongo", */
/* 62 "Mute Hi Conga", */
/* 63 "Open Hi Conga", */
/* 64 "Low Conga", */
/* 65 "High Timbale", */
/* 66 "Low Timbale", */
/* 67 "High Agogo", */
/* 68 "Low Agogo", */
/* 69 "Cabasa", */
/* 70 "Maracas", */
/* 71 "Short Whistle", */
/* 72 "Long Whistle", */
/* 73 "Short Guiro", */
/* 74 "Long Guiro", */
/* 75 "Claves", */
/* 76 "Hi Wood Block", */
/* 77 "Low Wood Block", */
/* 78 "Mute Cuica", */
/* 79 "Open Cuica", */
/* 80 "Mute Triangle", */
/* 81 "Open Triangle"; */
[ATTACH]4943[/ATTACH]
(в архиве дока есть еще)
За подсказки тоже спасибо,думаю,они мне пригодятся(хотя проект достаточно простой)
набор инструментов стандартный
Цитата: @pixo $oft
По поводу инструментов–это стандартный набор или их можно как-то перечислить,узнать точное название и всё такое?
Насколько мне известно, инструменты распологаются по Банкам инструментов, приведённый выше список относится к стандартному банку. На некоторых системах он может быть и другой. Узнать инструмент наверное можно (Колобок ведь как-то узнаёт) но скорей всего придётся просто перечислять названия в массиве и по номеру строки выводить название инструмента самостоятельно. (заработала прикреплялка файлов к мессаге, поэтому спешу пристегнуть исходники MIDI клавиатуры на С++, вдруг она ещё актуальна?)
Простор для доработки там ещё есть.Как минимум,стоит добавить полный,красиво оформленный вывод для возможностей устройств вывода(я выводил только те же поля структуры,что и для устройств ввода),ну и паузу по окончании можно добавить,чтоб не приходилось из командной строки запускать
Единственное что–столкнулся с проблемой вывода цифр.Использовал для преобразования wsprintf,но она как-то странно работает.Вызывал её Invoke'ом,но она порой вместо слов пихает двойные слова.Поэтому пришлось заменить на цепочку Push/Call.Буду благодарен,если кто-то укажет,как сделать через Invoke
Цитата: @pixo $oft
Хотелось бы посмотреть,что выводит у вас
У меня моя поделка (к сожалению исходник не сохранился) выводит вот что:
Код:
Total MIDI devices: 1
Using MIDI device: (0) [4205704] ... ok
Manufacturer ID: 1, Product ID: 102
Product Name: Программный синтезатор звуковой
Technology: Software synthesizer
+Supports volume control
+Supports separate left and right volume control
Poly-voices: 48, Maximum Notes: 48
Using MIDI device: (0) [4205704] ... ok
Manufacturer ID: 1, Product ID: 102
Product Name: Программный синтезатор звуковой
Technology: Software synthesizer
+Supports volume control
+Supports separate left and right volume control
Poly-voices: 48, Maximum Notes: 48
Инфу о MIDI-устройстве получаем функцией midiOutGetDevCaps.
А, собственно, какую именно инфу выдаёт эта функция, можно посмотреть в описании структуры MIDIOUTCAPS.
Что касается нескольких устройств, просто вызываем функцию midiOutGetNumDevs, которая возвращает количество MIDI-устройств.
И потом по порядку для каждого (начиная с 0) вызываем midiOutGetDevCaps.
Так же, в качестве DeviceID, можно задать -1 -- это MIDI-Mapper.
Код:
Вот что про него выводится:
Total MIDI devices: 1
Using MIDI device: (-1) [4205704] ... ok
Manufacturer ID: 1, Product ID: 1
Product Name: Устройство переназначения MIDI
Technology: Microsoft MIDI mapper
+Supports volume control
+Supports separate left and right volume control
+Provides direct streams support
Poly-voices: 0, Maximum Notes: 0
Total MIDI devices: 1
Using MIDI device: (-1) [4205704] ... ok
Manufacturer ID: 1, Product ID: 1
Product Name: Устройство переназначения MIDI
Technology: Microsoft MIDI mapper
+Supports volume control
+Supports separate left and right volume control
+Provides direct streams support
Poly-voices: 0, Maximum Notes: 0
А что такое «[4205704] ... ok»?Единственное,что мне в голову приходит–так был реализован вывод версии.Ещё непонятно,зачем ok