Post

AudioKit의 MIDIMonitor 란 무엇인가?

AudioKit의 MIDIMonitor 란 무엇인가?

MIDIMonitor.swift 파일은 SwiftUI 기반의 MIDI 모니터 도구입니다. MIDI 장치로부터 수신된 이벤트들을 실시간으로 감지하고 UI로 표시하는 역할을 합니다. AudioKit, SwiftUI, CoreMIDI를 활용하며, 사용자가 MIDI 장치의 입력을 확인하고 디버깅할 수 있도록 돕습니다.

주요 구조 설명

1. MIDIMonitorData 구조체

1
2
3
struct MIDIMonitorData {
  var noteOn, velocity, noteOff, channel, afterTouch, afterTouchNoteNumber, programChange, pitchWheelValue, controllerNumber, controllerValue: Int
}
  • 각종 MIDI 이벤트 값을 저장하는 데이터 구조입니다.
  • @Published로 선언되어 View에서 실시간 바인딩됩니다.

2. MIDIMonitorConductor 클래스

ObservableObject를 채택한 ViewModel 역할의 클래스입니다.

주요 프로퍼티

  • midi: AudioKit의 MIDI 인터페이스 객체
  • data: MIDI 이벤트 데이터
  • isShowingMIDIReceived: MIDI 입력을 수신 중일 때 indicator 표시 여부
  • isToggleOn: CC 값이 127일 때 on 상태 (ex. 토글 스위치 UI용)
  • midiEventType: 이벤트 구분용 열거형

주요 메서드

  • start(): MIDI 입력 포트 열고 리스너 등록
  • stop(): MIDI 포트 닫기

3. MIDI 이벤트 수신 핸들러 (MIDIListener 구현)

AudioKit의 MIDIListener 프로토콜을 구현하여 다음 이벤트들을 처리합니다:

(1) receivedMIDINoteOn / receivedMIDINoteOff

  • 노트 번호, 벨로시티, 채널을 추출해 데이터 갱신
  • 벨로시티가 0일 경우 Note Off처럼 취급하여 isShowingMIDIReceived = false

(2) receivedMIDIController

1
2
3
4
5
if value == 127 {
  self.isToggleOn = true
} else {
  self.isToggleOn = false
}
  • CC 메시지 수신 시 컨트롤러 번호와 값 저장
  • value == 127이면 isToggleOn을 켜서 UI에 표시 (ex. 이펙터 스위치처럼 on/off 토글용)

기타 이벤트

  • Program Change, Pitch Wheel, Aftertouch 등도 모두 개별적으로 처리하여 데이터를 반영

4. MIDIMonitorView

  • MIDIMonitorConductor@StateObject로 사용
  • 수신된 MIDI 이벤트를 ListSection으로 구분하여 표시
  • 상단에 MIDI 입력 상태와 토글 여부를 나타내는 원형 인디케이터(Circle) 표시

인디케이터 예:

1
2
Circle()
  .fill(conductor.isShowingMIDIReceived ? mainTintColor : mainTintColor.opacity(0.2))

특징 및 활용 예시

  • 드럼패드를 누르면 Note On 이벤트 → 인디케이터 반응
  • 노브를 돌리면 CC 메시지 → 컨트롤러 번호와 값 갱신
  • 이펙터 on/off처럼 CC 값이 127 → isToggleOn = true로 빨간 불 표시
This post is licensed under CC BY 4.0 by the author.