Swift - AudioKit AKMidi для AKSequencer - PullRequest
       6

Swift - AudioKit AKMidi для AKSequencer

0 голосов
/ 03 сентября 2018

В настоящее время у меня есть приложение, которое использует AKKeyboard для создания звуков с помощью осциллятора. Всякий раз, когда играю на клавиатуре, я также получаю данные MIDI. Я хотел бы создать AKSequence из MIDI-данных, которые я получаю.

Любые советы или указатели будут с благодарностью, спасибо.

Вот часть моего кода:

var bank = AKOscillatorBank()
var midi: AKMIDI!
let sequencer = AKSequencer()
let sequenceLength = AKDuration(beats: 8.0)

func configureBank() {
    AudioKit.output = bank

    do {
        try AudioKit.start()
    } catch {
        AKLog("AudioKit couldn't be started")
    }

    midi = AudioKit.midi
    midi.addListener(self)
    midi.openInput()
}

// AKKeyboard Protocol methods
func noteOn(note: MIDINoteNumber) {
    let event = AKMIDIEvent(noteOn: note, velocity: 80, channel: 5)
    midi.sendEvent(event)
    bank.play(noteNumber: note, velocity: 100)
}

func noteOff(note: MIDINoteNumber) {
    let event = AKMIDIEvent(noteOff: note, velocity: 0, channel: 5)
    midi.sendEvent(event)
    bank.stop(noteNumber: note)
}

// AKMIDIListener Protocol methods..
func receivedMIDINoteOff(noteNumber: MIDINoteNumber, velocity: MIDIVelocity, channel: MIDIChannel) {
    print("ReceivedMIDINoteOff: \(noteNumber), velocity: \(velocity), channel: \(channel)")
}

1 Ответ

0 голосов
/ 03 сентября 2018

На самом деле вам не нужно создавать последовательность непосредственно из AKMIDIEvents. Просто запросите последовательность currentPosition в последовательности, когда вы вызываете методы noteOn и noteOff в AKKeyboardView, и на этой основе программно добавляете события в дорожку секвенсора.

Процесс в основном идентичен этому (минус последний шаг, конечно): https://stackoverflow.com/a/50071028/2717159

Редактировать - чтобы получить время и длительность заметки и заметки, а также длительность:

// store notes and times in a dictionary:
var noteDict = [MIDINoteNumber: MIDITimeStamp]()

// when you get a noteOn, note the time
noteDict[currentMIDINote] = seq.currentPosition.beats

// when you get a noteOff
let endTime = seq.currentPosition.beats
if let startTime = noteDict[currentMIDINote] {
    let durationInBeats = endTime - startTime
    // use the startTime, duration and currentMIDINote to add event to track
    noteDict[currentMIDINote] = nil
}
...