Twists and turns of developing music applications for iOS

Post on 09-Jan-2017

154 views 2 download

Transcript of Twists and turns of developing music applications for iOS

Тонкости разработки музыкальных приложений под 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