Git Product home page Git Product logo

Comments (3)

orchetect avatar orchetect commented on June 24, 2024 1

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.

orchetect avatar orchetect commented on June 24, 2024

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.

elmcapp avatar elmcapp commented on June 24, 2024

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)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.