Documentation ¶
Overview ¶
Package smfreader provides a reader of Standard MIDI Files (SMF).
Usage
import ( "gitlab.com/gomidi/midi/smf/smfreader" . "gitlab.com/gomidi/midi/midimessage/channel" // (Channel Messages) // you may also want to use these // gitlab.com/gomidi/midi/midimessage/meta (Meta Messages) // gitlab.com/gomidi/midi/midimessage/cc (Control Change Messages) // gitlab.com/gomidi/midi/midimessage/syscommon (System Common Messages) // gitlab.com/gomidi/midi/midimessage/sysex (System Exclusive Messages) ) var err error readMIDI := func (rd smf.Reader) { var m midi.Message for { m, err = rd.Read() // at the end smf.ErrFinished will be returned if err != nil { break } // deal with them based on a type switch switch msg := m.(type) { case NoteOn: fmt.Printf( "NoteOn at channel %v: key %v velocity: %v\n", msg.Channel(), // MIDI channels 1-16 correspond to msg.Channel 0-15 msg.Key(), msg.Velocity(), ) case NoteOff: ... } } } smfreader.ReadFile("file.mid", readMIDI) if err != smf.ErrFinished { // real error happened }
Example ¶
package main import ( "bytes" "fmt" "io" "gitlab.com/gomidi/midi" . "gitlab.com/gomidi/midi/midimessage/channel" "gitlab.com/gomidi/midi/midimessage/meta" "gitlab.com/gomidi/midi/smf" "gitlab.com/gomidi/midi/smf/smfreader" "gitlab.com/gomidi/midi/smf/smfwriter" ) func mkMIDI() io.Reader { var bf bytes.Buffer wr := smfwriter.New(&bf) wr.Write(Channel2.Pitchbend(5000)) wr.Write(Channel2.NoteOn(65, 90)) wr.SetDelta(2) wr.Write(Channel2.NoteOff(65)) wr.SetDelta(4) wr.Write(meta.EndOfTrack) return bytes.NewReader(bf.Bytes()) } func main() { fmt.Println() rd := smfreader.New(mkMIDI()) var m midi.Message var err error for { m, err = rd.Read() // at the end, smf.ErrFinished will be returned if err != nil { break } // inspect fmt.Println(rd.Delta(), m) switch v := m.(type) { case NoteOn: fmt.Printf("[%v] NoteOn at channel %v: key %v velocity %v\n", rd.Delta(), v.Channel(), v.Key(), v.Velocity()) case NoteOff: fmt.Printf("[%v] NoteOff at channel %v: key %v\n", rd.Delta(), v.Channel(), v.Key()) } } if err != smf.ErrFinished { panic("error: " + err.Error()) } }
Output: 0 channel.Pitchbend channel 2 value 5000 absValue 13192 0 channel.NoteOn channel 2 key 65 velocity 90 [0] NoteOn at channel 2: key 65 velocity 90 2 channel.NoteOff channel 2 key 65 [2] NoteOff at channel 2: key 65 4 meta.EndOfTrack
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
View Source
var ( // ErrMissing is the error returned, if there is no more data, but tracks are missing ErrMissing = errors.New("incomplete, tracks missing") )
Functions ¶
Types ¶
type Option ¶
type Option func(*reader)
Option is an option for the Reader
func NoteOffVelocity ¶
func NoteOffVelocity() Option
NoteOffVelocity lets the reader differentiate between "fake" noteoff messages (which are in fact noteon messages (typ 9) with velocity of 0) and "real" noteoff messages (typ 8) that have a velocity. The former are returned as NoteOffVelocity messages and keep the given velocity, the later are returned as NoteOff messages without velocity. That means in order to get all noteoff messages, there must be checks for NoteOff and NoteOffVelocity (if this option is set). If this option is not set, both kinds are returned as NoteOff (default).
Click to show internal directories.
Click to hide internal directories.