twists and turns of developing music applications for ios
TRANSCRIPT
Тонкости разработки музыкальных приложений под iOS
Павел ХасановАлександр Пархимович
О компании Gismart
Разработчик музыкальных приложений под Android и iOS Паблишер музыкальных приложений
2
Про что доклад?
• Использование Midi в игровом проекте;• Core Audio;• Core Midi;• Audiobus
MIDI - Musical Instrument Digital Interface• Известен с начала 80-х• Создан для совместимости различных муз.
инструментов
4
Структура Midi файла
Игра Piano Maestro
6
Синхронизация визуальных эл-тов и музыки
• Мелодия
• Синхротрек
7
Игровые фичи
• ускорение\замедление;• смена инструмента;• управление сложностью.
8
Core AudioCore Audio - это низкоуровневый АРІ,
предоставленный Apple для работы с цифровым звуком в системах Mac OS и iOS. Соrе Audio позволяет писать приложения, которые напрямую работают с несжатыми звуковыми данными, применять к ним эффекты, микшировать с другими звуковыми потоками и либо выводить результат в динамики, либо преобразовывать его в сжатый формат, который затем можно сохранить в виде файла или отправить по сети
Цель использования Core Audio - обеспечить высокое качество и производительность аудиосистемы.
Core AudioОсновные компоненты Core Audio:
• Аудио Блоки (Audio Unit);• Аудио очереди (Audio Queue);• Граф.
Аудио Блоки
Аудио БлокиАудиоблоки делятся на пять основных категории: • RemoteIO;• Эффекты; • Миксер/Сплиттер;• Конвертер формата; • Музыкальное устройство.
Audio Graph
• Слабая документация;• Специфичная предметная область.
Core Midi Core MIDI framework предоставляет интерфейсы для обмена данными с MIDI устройствами, в том числе с клавиатурами и синтезаторами.
Подключение Midi Keyboard
MIDIClientRef client;MIDIClientCreate(CFSTR("NNAudio MIDI Handler"), MIDINotifyProc, nil, &client);MIDIInputPortCreate(client, CFSTR("Input port"), MIDIReadProc, nil, &inPort);
unsigned long sourceCount = MIDIGetNumberOfSources();for (int i = 0; i < sourceCount; i++) {
MIDIEndpointRef src = MIDIGetSource(i);CFStringRef endpointName = NULL;OSStatus nameErr = MIDIObjectGetStringProperty(src,
kMIDIPropertyName, &endpointName); ...
MIDIPortConnectSource(inPort, src, NULL);}
Структура Midi Message
typedef struct MIDINoteMessage{
UInt8 channel;UInt8 note;UInt8 velocity;UInt8 releaseVelocity; // was "reserved". 0 is the correct
value when you don't know.Float32 duration;
} MIDINoteMessage;
Проигрывание Midi• MusicPlayer;• Последовательная обработка
MIDINoteMessage.
Audiobus
AudiobusЛегкая интеграция:
AudioComponentDescription desc = { kAudioUnitType_RemoteInstrument,'iasp','man', 0,0 }; self.audiobusController = [[ABAudiobusController alloc] initWithApiKey:apiKey]; self.output = [[ABSenderPort alloc] initWithName:outputName title:titleName audioComponentDescription:desc audioUnit:unit]; [self.audiobusController addSenderPort:self.output];
Спасибо за внимание!
www.gismart.com