Skip to content
Snippets Groups Projects
Select Git revision
  • master default protected
  • v1.6.3
  • v1.6.2
  • v1.6.1
  • v1.6.0
  • v1.5.0
  • v1.4.1
  • v1.4.0
  • v1.3.9
  • v1.3.8
  • v1.3.7
  • v1.3.6
  • v1.3.5
  • v1.3.4
  • v1.3.3
  • v1.3.2
  • v1.3.1
  • v1.3.0
  • v1.2.23
  • v1.2.22
  • v1.2.21
21 results

globals.go

globals.go 1.91 KiB
package smf

import (
	"fmt"
	"io"
	"strings"

	"gitlab.com/gomidi/midi/smf/smfwriter"
	"gitlab.com/gomidi/muskel/items"
	"gitlab.com/gomidi/muskel/score"
)

const DEBUG_TEST = false

//var DEBUG bool = false

func WriteSMFTo(s *score.Score, wr io.Writer, filegroup string, options ...smfwriter.Option) error {
	numTracks := uint16(2) // first track is for time signatures, second track is for tempo changes

	if items.DEBUG {
		fmt.Printf("WriteSMFTo filegroup %v\n", filegroup)
	}

	for trackName := range s.Unrolled {

		//for _, track := range s.Tracks {
		//for name, col := range s.Columns {
		track, err := s.GetTrack(trackName)

		if err != nil {
			return fmt.Errorf("could not find track %q", trackName)
		}
		// fmt.Printf("track %q midichannel: %v\n", track.Name, track.MIDIChannel)
		if track.MIDIChannel >= 0 && (filegroup == "*" || track.FileGroup == filegroup) {
			numTracks++
		}
	}

	if DEBUG_TEST {
		options = append(options, smfwriter.Debug(debugLog{}))
	}

	sw := newSMF(s, filegroup, newWriter(wr, numTracks, 960, options...))
	return sw.write()

}

// WriteFile writes the score to the given SMF file
func WriteFile(s *score.Score, midifile string, options ...smfwriter.Option) (err error) {
	if items.DEBUG {
		fmt.Printf("WriteFile(%q) called\n", midifile)
	}
	defer func() {
		if !items.DEBUG {
			if r := recover(); r != nil {
				err = fmt.Errorf("%v", r)
			}
		}
	}()

	hasPlaceholder := strings.Index(midifile, "%s") > -1

	if !hasPlaceholder {
		return writeSMFToFile(s, midifile, "*", options...)
	}

	var fileGroups = map[string]string{}
	for _, track := range s.Tracks {
		fileGroups[track.FileGroup] = fmt.Sprintf(midifile, track.FileGroup)
	}

	if items.DEBUG {
		fmt.Printf("filegroups: %#v\n", fileGroups)
	}

	var errs errors

	for grp, fl := range fileGroups {
		err := writeSMFToFile(s, fl, grp, options...)
		if err != nil {
			errs = append(errs, err)
		}
	}

	if len(errs) == 0 {
		return nil
	}

	return errs
}