feat(tracker): oscilloscope and LUFS / true peak detection

In addition to the oscilloscope and loudness/peak detections, this
commit refactors all the channels between components (i.e.
ModelMessages and PlayerMessages) etc. into a new class Broker. This
was done because now we have one more goroutine running: a Detector,
where the loudness / true peak detection is done in another thread.
The different threads/components are only aware of the Broker and
communicate through it. Currently, it's just a collection of
channels, so it's many-to-one communication, but in the future,
we could change Broker to have many-to-one-to-many communication.

Related to #61
This commit is contained in:
5684185+vsariola@users.noreply.github.com
2024-11-02 15:04:19 +02:00
parent 86c65939bb
commit ec222bd67d
16 changed files with 945 additions and 174 deletions

View File

@ -47,7 +47,10 @@ func main() {
midiContext := gomidi.NewContext()
defer midiContext.Close()
midiContext.TryToOpenBy(*defaultMidiInput, *firstMidiInput)
model, player := tracker.NewModelPlayer(cmd.MainSynther, midiContext, recoveryFile)
broker := tracker.NewBroker()
model, player := tracker.NewModelPlayer(broker, cmd.MainSynther, midiContext, recoveryFile)
detector := tracker.NewDetector(broker)
go detector.Run()
if a := flag.Args(); len(a) > 0 {
f, err := os.Open(a[0])

View File

@ -72,7 +72,10 @@ func init() {
rand.Read(randBytes)
recoveryFile = filepath.Join(configDir, "sointu", "sointu-vsti-recovery-"+hex.EncodeToString(randBytes))
}
model, player := tracker.NewModelPlayer(cmd.MainSynther, NullMIDIContext{}, recoveryFile)
broker := tracker.NewBroker()
model, player := tracker.NewModelPlayer(broker, cmd.MainSynther, NullMIDIContext{}, recoveryFile)
detector := tracker.NewDetector(broker)
go detector.Run()
t := gioui.NewTracker(model)
model.InstrEnlarged().Bool().Set(true)