Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Изучение MIDI

7
15 февраля 2011 года
@pixo $oft
3.4K / / 20.09.2006
Появилась надобность реализовать сабж.Для начала надо было хотя бы немного ознакомиться с предметом(звуком почти не занимался,разве что звуковые файлы воспроизводил .wav да .mp3).Посмотрел в MSDN соответствующий раздел,понял,что есть 3 уровня реализации.1й мне не подходит точно,а вот 2й или даже 3й–вполне
Однако,времени с утра было немного,посему только это и успел.На работе,когда появилось время,ознакомился поплотнее,и понял,что не хватает главного…А именно,как вообще звук представлять-то?!Функции информации,открытия,воспроизведения и проч. нашёл,но всех их хватает на «lpMIDIData*-указатель на буфер с данными,а дальше как хотите,так и формируйте их:p».Т.е. никакой инфы по кодированию,максимум «этой функцией можно сформировать буфер,а этой–воспроизвести».Перерыл весь раздел,посвящённый этому делу,но абсолютно ничего не нашёл
Странно,очень странно…Подскажите,пожалуйста,годный источник–наверняка кто-то этим занимался
19K
17 февраля 2011 года
Alegun
269 / / 10.09.2010
Цитата: @pixo $oft
Подскажите,пожалуйста,годный источник–наверняка кто-то этим занимался

Пытался залить на сайт готовый (правда Делфийский) примерчик, но пока ёк...
Извн. придётся на пальцах, может поможет паскалька?

Код:
Код ноты(октава): подставляй код и нота зазвучит.
До(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;
7
17 февраля 2011 года
@pixo $oft
3.4K / / 20.09.2006
Ооо,спасибо,дружище!Коды нот очень даже нужны,ну и принцип их формирования тоже.Правда,это только малая толика всего,но…
А где можно почитать более расширенную версию этого дела?

P.S.Как увидел в теме про новый движок слово MIDIkeyboard,сразу почему-то подумал об этом:)
41K
19 февраля 2011 года
kisssko
108 / / 28.10.2010
Ознакомиться с миди-командами и их концепцией в целом можно здесь (это первая часть, что то вроде введения), и здесь (собственно, описание команд).
Там довольно детально всё описано, да и в целом материал очень интересный и полезный к изучению.
Ну а самый простой способ эти миди-команды посылать -- это используя функцию 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";                 */


Так же приведу список нот перкуссии.
Это именно номера нот, но играют они различными ударными на одной тональности.
При этом канал должен быть то ли 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";          */
8.2K
19 февраля 2011 года
bagie2
299 / / 26.10.2008
я тоже когда то прикалывался с MIDI на фасме правда.
[ATTACH]4943[/ATTACH]
(в архиве дока есть еще)
7
19 февраля 2011 года
@pixo $oft
3.4K / / 20.09.2006
Спасибо за ответ:) По поводу инструментов–это стандартный набор или их можно как-то перечислить,узнать точное название и всё такое?
За подсказки тоже спасибо,думаю,они мне пригодятся(хотя проект достаточно простой)
1.8K
20 февраля 2011 года
LM(AL/M)
332 / / 20.12.2005
набор инструментов стандартный
19K
25 февраля 2011 года
Alegun
269 / / 10.09.2010
Цитата: @pixo $oft
По поводу инструментов–это стандартный набор или их можно как-то перечислить,узнать точное название и всё такое?

Насколько мне известно, инструменты распологаются по Банкам инструментов, приведённый выше список относится к стандартному банку. На некоторых системах он может быть и другой. Узнать инструмент наверное можно (Колобок ведь как-то узнаёт) но скорей всего придётся просто перечислять названия в массиве и по номеру строки выводить название инструмента самостоятельно. (заработала прикреплялка файлов к мессаге, поэтому спешу пристегнуть исходники MIDI клавиатуры на С++, вдруг она ещё актуальна?)

7
07 марта 2011 года
@pixo $oft
3.4K / / 20.09.2006
Кое-что накатал.Правда,времени особо нет,поэтому и примерчик получился слабоват.На самом деле воспроизведением в нём и не пахнет:)–только вывод информации о MIDI-устройствах в системе.Хотелось бы посмотреть,что выводит у вас(особенно если есть ещё какие-то устройства,кроме программного синтезатора)
Простор для доработки там ещё есть.Как минимум,стоит добавить полный,красиво оформленный вывод для возможностей устройств вывода(я выводил только те же поля структуры,что и для устройств ввода),ну и паузу по окончании можно добавить,чтоб не приходилось из командной строки запускать

Единственное что–столкнулся с проблемой вывода цифр.Использовал для преобразования wsprintf,но она как-то странно работает.Вызывал её Invoke'ом,но она порой вместо слов пихает двойные слова.Поэтому пришлось заменить на цепочку Push/Call.Буду благодарен,если кто-то укажет,как сделать через Invoke
41K
09 марта 2011 года
kisssko
108 / / 28.10.2010
Цитата: @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


Инфу о 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
7
09 марта 2011 года
@pixo $oft
3.4K / / 20.09.2006
Спасибо за пост,но вы,по ходу,мой архив не открывали.Там и исходник,в котором все эти функции используются и выводдят информацию,и собственно приложение(если у кого нет возможности/лень компилировать)

А что такое «[4205704] ... ok»?Единственное,что мне в голову приходит–так был реализован вывод версии.Ещё непонятно,зачем ok
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог