This is an initial commit so this is a work in progress we don't need This project is a basic additive synthesizer built using Golang with a graphical user interface (GUI). The synthesizer features:
- Two oscillators with selectable waveforms (sine, square, triangle, sawtooth)
- Three filters (e.g., low-pass, high-pass, bandpass)
- Two Low-Frequency Oscillators (LFOs) for modulation
- MIDI input support for real-time control
- A simple GUI for user interaction (using Fyne)
synthesizer/
├── cmd/
│ └── synth/
│ └── main.go
├── pkg/
│ ├── audio/
│ │ └── output.go
│ ├── midi/
│ │ └── input.go
│ ├── synth/
│ │ ├── engine.go // Added engine.go
│ │ ├── oscillator.go
│ │ ├── waveform.go
│ │ ├── filter.go
│ │ ├── lfo.go
│ │ ├── voice.go
│ │ └── envelope.go
│ └── util/
│ ├── constants.go
│ └── config.go
├── go.mod
├── go.sum
└── README.md
Provides real-time audio streaming capabilities.
Install via:
go get github.com/gordonklaus/portaudio
Allows interaction with MIDI devices.
Install viawith GUI:
go get github.com/rakyll/portmidi
A cross-platform GUI toolkit for Go.
Install via:
go get fyne.io/fyne/v2
To install all dependencies, run:
go get github.com/gordonklaus/portaudio
go get github.com/rakyll/portmidi
go get fyne.io/fyne/v2
Initializes the synthesizer components, sets up MIDI input, audio output, and the GUI, starts main event loop.
Manages the GUI application lifecycle, including initializing the GUI window and components, running the main GUI event loop, and interfacing MIDI input with engine for real-time control
Defines the GUI components (buttons, sliders, etc.) and binds the GUI controls to synthesizer parameters.
Contains event handlers for GUI interactions. Updates synthesizer parameters based on user input.
Handles audio output streaming via PortAudio.
Handles MIDI input from external devices using PortMIDI.
Defines oscillator components and methods to update parameters like frequency and waveform in real-time.
The central synthesizer engine manages voices, global parameters, and updates parameters based on input from the GUI or MIDI.
Manages individual synthesizer voices, including the signal chain from oscillators, filters, and envelopes.
Stores constant values used throughout the application.
Holds configuration settings, including any GUI-related settings.
This project is licensed under the GPL3 License.