Comments (3)
Personally I'd rather implement initialization code in the class's init and not in the variable declaration:
public class MidiModule: NSObject {
let midiManager = MIDI.IO.Manager(
clientName: "MIDIEventLogger",
model: "LoggerApp",
manufacturer: "elmcapp")
public override init() {
super.init() // must call NSObject init first
do {
midiManager.notificationHandler = { notification, manager in
print("Core MIDI notification:", notification)
}
print("Starting MIDI manager.")
try midiManager.start()
print("Creating virtual input MIDI port.")
let inputTag = "Virtual_MIDI_In"
try midiManager.addInput(
name: "LoggerApp MIDI In",
tag: inputTag,
uniqueID: .userDefaultsManaged(key: inputTag),
receiveHandler: .events { [weak self] events in
// Note: this handler will be called on a background thread
// so call the next line on main if it may result in UI updates
DispatchQueue.main.async {
events.forEach { self?.receivedMIDIEvent($0) }
}
}
)
} catch {
print(error)
}
}
private func receivedMIDIEvent(_ event: MIDI.Event) {
switch event {
case .noteOn(let payload):
print("NoteOn:", payload.note, payload.velocity, payload.channel)
case .noteOff(let payload):
print("NoteOff:", payload.note, payload.velocity, payload.channel)
case .cc(let payload):
print("CC:", payload.controller, payload.value, payload.channel)
case .programChange(let payload):
print("PrgCh:", payload.program, payload.channel)
// etc...
default:
break
}
}
}
from midikit.
Creating a barebones concrete example project is on the to-do list as time allows. The Getting Started Guide explains the basics fairly well.
receivedMIDIEvent
is just a local function to process the incoming MIDI messages, and the receive handler closure is calling it.
Your class is a good start. The manufacturer
would be your company name or app name. You also need to set up the MIDI ports. If it's just a single virtual MIDI input to receive events, that is also explained in the guide and could be done before return newManager
.
This example wouldn't log every message, just the ones handled as you can see. But it's meant to show how to handle individual event types.
Your class may look something like this then:
class MidiModule: NSObject {
let midiManager: MIDI.IO.Manager = {
let newManager = MIDI.IO.Manager(
clientName: "MIDIEventLogger",
model: "LoggerApp",
manufacturer: "elmcapp") { notification, manager in
print("Core MIDI notification:", notification)
}
do {
logger.debug("Starting MIDI manager")
try newManager.start()
logger.debug("Creating virtual input MIDI port")
let inputTag = "Virtual_MIDI_In"
try newManager.addInput(
name: "LoggerApp MIDI In",
tag: inputTag,
uniqueID: .userDefaultsManaged(key: inputTag),
receiveHandler: .events { [weak self] events in
// Note: this handler will be called on a background thread
// so call the next line on main if it may result in UI updates
DispatchQueue.main.async {
events.forEach { self?.receivedMIDIEvent($0) }
}
}
)
} catch {
logger.default(error)
}
return newManager
}()
private func receivedMIDIEvent(_ event: MIDI.Event) {
switch event {
case .noteOn(let payload):
print("NoteOn:", payload.note, payload.velocity, payload.channel)
case .noteOff(let payload):
print("NoteOff:", payload.note, payload.velocity, payload.channel)
case .cc(let payload):
print("CC:", payload.controller, payload.value, payload.channel)
case .programChange(let payload):
print("PrgCh:", payload.program, payload.channel)
// etc...
default:
break
}
}
}
from midikit.
Just tried the current code but I get the following error
Value of type '(MidiModule) -> () -> MidiModule' has no member 'receivedMIDIEvent'
To resolve the issue I had to add lazy.
lazy var midiManager: MIDI.IO.Manager = {
// rest of code
}
from midikit.
Related Issues (20)
- Move bluetooth SwiftUI views/classes into MIDIKit?
- midiManager.endpoints and midiManager.devices.devices only give an empty list `[]` HOT 1
- Example: Wired USB Connection from iOS device to Mac HOT 3
- Expose inits for CoreMIDI packets and packet lists HOT 2
- MIDI 2.0 RPN/NRPN HOT 3
- MIDI Notification - Object `removed` may return empty metadata HOT 1
- MIDI Thru Connections are not supported on this platform due to Core MIDI bugs. HOT 16
- Broken link in docs for Event Filters HOT 3
- MIDIEventLogger example In Advanced Examples folder won't build HOT 13
- `MIDIFile` could use `Hashable` conformance HOT 1
- Crash while parsing MIDI file HOT 1
- Translation of Note On with 0 Velocity to Note Off Should Be Opt-In (Off by Default) HOT 1
- MIDI File parse bug. HOT 4
- `MIDIFile`: Add structure validation
- MTCVideoPlayer project fails to build HOT 1
- Convert `MIDIManager` to global singleton
- MIDIKitSMF: slow parse time for very big SMF files HOT 2
- Docs: "MIDI.File" typo? HOT 3
- ProgramChange midi1RawBytes() HOT 1
- 80-90% CPU Usage For HUITest Client HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from midikit.