feat!: both native & Go synths are included in the same executables

Closes #200
This commit is contained in:
5684185+vsariola@users.noreply.github.com
2025-07-10 17:46:00 +03:00
parent 13102aa7d6
commit 3163f46447
21 changed files with 106 additions and 83 deletions

View File

@ -1,7 +0,0 @@
//go:build !native
package cmd
import "github.com/vsariola/sointu/vm"
var MainSynther = vm.GoSynther{}

View File

@ -4,12 +4,13 @@ import (
"encoding/json"
"flag"
"fmt"
"github.com/vsariola/sointu/cmd"
"io/ioutil"
"os"
"path/filepath"
"strings"
"github.com/vsariola/sointu/cmd"
"gopkg.in/yaml.v3"
"github.com/vsariola/sointu"
@ -29,12 +30,20 @@ func main() {
wavOut := flag.Bool("w", false, "Output the rendered song as .wav file. By default, saves stereo float32 buffer to disk.")
pcm := flag.Bool("c", false, "Convert audio to 16-bit signed PCM when outputting.")
versionFlag := flag.Bool("v", false, "Print version.")
syntherInt := flag.Int("synth", 0, "Select the synther to use. By default, uses the first one in the list of available synthers.")
flag.Usage = printUsage
flag.Parse()
if *versionFlag {
fmt.Println(version.VersionOrHash)
os.Exit(0)
}
if *syntherInt < 0 || *syntherInt >= len(cmd.Synthers) {
fmt.Fprintf(os.Stderr, "synth index %d is out of range; available synthers:\n", *syntherInt)
for i, s := range cmd.Synthers {
fmt.Fprintf(os.Stderr, " %d: %s\n", i, s.Name())
}
os.Exit(1)
}
if flag.NArg() == 0 || *help {
flag.Usage()
os.Exit(0)
@ -93,7 +102,7 @@ func main() {
return fmt.Errorf("the song could not be parsed as .json (%v) or .yml (%v)", errJSON, errYaml)
}
}
buffer, err := sointu.Play(cmd.MainSynther, song, nil) // render the song to calculate its length
buffer, err := sointu.Play(cmd.Synthers[*syntherInt], song, nil) // render the song to calculate its length
if err != nil {
return fmt.Errorf("sointu.Play failed: %v", err)
}

View File

@ -49,8 +49,8 @@ func main() {
midiContext := cmd.NewMidiContext(broker)
defer midiContext.Close()
midiContext.TryToOpenBy(*defaultMidiInput, *firstMidiInput)
model := tracker.NewModel(broker, cmd.MainSynther, midiContext, recoveryFile)
player := tracker.NewPlayer(broker, cmd.MainSynther)
model := tracker.NewModel(broker, cmd.Synthers, midiContext, recoveryFile)
player := tracker.NewPlayer(broker, cmd.Synthers[0])
detector := tracker.NewDetector(broker)
go detector.Run()

View File

@ -46,8 +46,8 @@ func init() {
recoveryFile = filepath.Join(configDir, "sointu", "sointu-vsti-recovery-"+hex.EncodeToString(randBytes))
}
broker := tracker.NewBroker()
model := tracker.NewModel(broker, cmd.MainSynther, cmd.NewMidiContext(broker), recoveryFile)
player := tracker.NewPlayer(broker, cmd.MainSynther)
model := tracker.NewModel(broker, cmd.Synthers, cmd.NewMidiContext(broker), recoveryFile)
player := tracker.NewPlayer(broker, cmd.Synthers[0])
detector := tracker.NewDetector(broker)
go detector.Run()
@ -63,11 +63,11 @@ func init() {
buf := make(sointu.AudioBuffer, 1024)
var totalFrames int64 = 0
return vst2.Plugin{
UniqueID: PLUGIN_ID,
UniqueID: [4]byte{'S', 'n', 't', 'u'},
Version: version,
InputChannels: 0,
OutputChannels: 2,
Name: PLUGIN_NAME,
Name: "Sointu",
Vendor: "vsariola/sointu",
Category: vst2.PluginCategorySynth,
Flags: vst2.PluginIsSynth,

View File

@ -1,6 +0,0 @@
//go:build native
package main
var PLUGIN_ID = [4]byte{'S', 'n', 't', 'N'}
var PLUGIN_NAME = "Sointu Native"

View File

@ -1,6 +0,0 @@
//go:build !native
package main
var PLUGIN_ID = [4]byte{'S', 'n', 't', 'u'}
var PLUGIN_NAME = "Sointu"

10
cmd/synthers.go Normal file
View File

@ -0,0 +1,10 @@
package cmd
import (
"github.com/vsariola/sointu"
"github.com/vsariola/sointu/vm"
)
var Synthers = []sointu.Synther{
vm.GoSynther{},
}

View File

@ -4,4 +4,6 @@ package cmd
import "github.com/vsariola/sointu/vm/compiler/bridge"
var MainSynther = bridge.NativeSynther{}
func init() {
Synthers = append(Synthers, bridge.NativeSynther{})
}