TODO: - Prioritized: - Crash when deleting a track on GeneralSynthScreen; couldn't reproduce - Automatically detect clipping in sequencer - Show waveform on vertical axis and mark clipping points --- - Delaylike amplitude envelope - Adjust overall amplitude of MusicSequence (without changing each track individually) - Visually adjust note durations in sequencer - Multiple select with drag and drop for music pattern instances - Copy/paste measure - Merge patterns - Change modifier for duplicating pattern instance from alt to control - Drag and drop in note sequencer - Play measure button - Middle click and drag to pan MusicSequenceEditView - Scrollbar for MusicSequenceEditView --- - Live update track mute/solo while playing, somehow - Improve AudioSequence compositing behavior and performance - Loopable playback on sequencer screen - Button to swap controller start/end values --- - Bug: Controllers window isn't receiving mouse events; going to elements below instead - Slide/portamento notes in sequencer - Implement drag and drop for list view reordering (wave modifiers, etc.) --- - Redesign all SamplerObjects to allow arbitrary chaining of inputs and outputs - Implement better delay filter that samples again or combines samples instead of using a large fixed size buffer - Adapt UI elements to window size (still needed: SequencerScreen, SfxrScreen) - Instrument library files to be shared across multiple MusicSequences - UI for modifying ring modulation waveform - Box outlines on SequencerScreen are slightly cut off due to clipping - SamplerObjectGraphView should respond to relative/absolute toggle and timingMode - Show controller effects on amplitude and frequency curve graphs - Zoom sampler graphs (horizontally and vertically) - Multithread sequencer synthesis --- - Bug: Keyboard events stopped working at once point; couldn't press spacebar to play sound, but control-space functioned normally. Had just opened a new file after editing wave layers or modifiers. Couldn't reproduce. - Bug: Something played wrong when highlighting audio at 5:41 in Throw Rock postmortem E4 - Bug: Clicking the same index in instrument list as a just-deleted instrument has no effect - Crash when trying to edit drum sample at 52:13 in Throw Rock postmortem E4; on relaunch, clicking drumlike instrument didn't show drum panel right away. Uninitialized memory access? - Clicking "New instrument" button should select the new instrument - Edit done button is very fragile; do something to prevent from disappearing by changing screens (prevent screen change or preserve button) - Wanted to apply frequency ramp after delay effect and couldn't - Drag to draw wave/amplitude/frequency graph (alternative to spline, or way to create spline shape) --- - Update UndoStateDelta usage to take advantage of target parameter - Devlog #13: - WaveformView cursor is not visible enough, especially with a busy waveform; change colors and do something else to make it stand out - Integration with tileeditor animations for synchronization - Anti-aliasing: Sawtooth slopes other than 1 - Save confirmation dialog should be hidden before file dialog appears; when a slow file is loaded, it's noticeably still visible after dialog closes - Import MP3 files ---- - Tweak FrequencyCurve_stairstep timing; current implementation doesn't make sense for time measurement. Separate initial delay field, and stairstep's duration refers to its own interval rather than the delay before it. - Set property controller timing relativity - Opening file in SequencerScreen doesn't discard previous rendered audio if it was paused - Synth control UI widget that wraps up slider, stepper, edit text, and hz checkbox (if applicable) - Draw sliders that are referenced by a SynthPropertyController in a different color - Each SynthControls will need binding identifiers for controls, and a way to query boundness and get events about changes - EffectParameterSlider rewiring - Dial controls to adjust slider range (and adjust unbounded parameters) - Right click EffectParameterSlider to toggle to alternate view, showing dials for minimum, maximum, current value, snap checkbox, dial for snap interval, dial for shift-drag ratio, bind to other slider, number of decimal places in edit field - SynthPropertyController should be relative to bound value instead of absolute? - Better UI for AmplitudeEnvelope_pulse cycleCount - Include SynthPropertyController adjustments in time calculations (see TODOs in AudioSampler_generalSynth.c) - Time/value transform modifiers for amplitude and frequency - Implement paste in SynthControls_wave_pcmData - Add edit button to SynthControls_wave_pcmData - Streamline UI for adding wave/amplitude/frequency modifiers; "modified" type shouldn't be visible, and instead always show modifiers button and automatically wrap and unwrap depending on whether modifiers are present or not - Instrument library - Bug: Program crashed when shortening ADSR envelope too much while trying to make throwrock player walk sound (possibly with a parameter going out of range?) Unable to reproduce ------ - Unique IDs for properties - Idea: On disk, object index and property index. At runtime, object index is replaced by runtime-unique identifiers that don't get written to disk, allowing object index to be updated when changes are made. Pass object index to SamplerObject functions, and make property index relative to object. - Implement additional property controller shapes: stairstep, sawtooth, triangle, spline, layered - Bug: AmplitudeEnvelope_pulse sometimes puts extra noise at the end; open zaprecharger2.stemaudio and mess with length slider - "Play as" PianoNoteControl by frequency controls - "Playback volume" slider by amplitude controls - sfxr/bfxr feature parity - freq limit: Truncate ADSR envelope somehow - Missing wave types for parity: - tan: Implement WaveSampler - whistle: Can be done with harmonics, chord modifier, or layer? - breaker: Implement WaveSampler? - holo: Total nonsense - buzz: Implement WaveSampler? - reverse - Hierarchical outline view showing entire synth configuration - Bring main window to front when showing save before quitting prompt (clicking close button while backgrounded is weird) - Synthesizer core improvements: - More efficient delta encoding for undo states - start_encounter_new non-parity during conversion appears to be due to lpf resonance; supersample order wrong and it matters? (or maybe not; still was barely audible with resonance off) - Stereo panning - Reverb filter - API support for continuous audio (varying in pitch/intensity?) - Synthesizer UI improvements: - Improve window management when undoing in GeneralSynthScreen - Move playhead when clicking WaveformView while sound is paused - Control/Command-W to close pop-up windows (shouldn't close main window! Need NSOpenGLShell configuration option) - Expand audio overlay system: Settings button on waveform to apply an offset, show file path, play alongside, play solo, play in left/right channel - Better UI for frequency curve stairsteps, chord modifier notes - Test wave parameters are in a confusing spot; separate from wave sampler controls somehow (separate pop-up view?) - Horizontal scroll and zoom in timeline editor (##required for release) - Share SynthTrackTimelineView waveform drawing code with WaveformView - Hold shift while dragging tracks on timeline to drag slower - Tab order for edit fields (##required for release) - Something onscreen showing cost of synth configuration, either computed from complexity or measured time when evaluating - Draw more graph lines overlaid on function shapes: Amplitude shows % and seconds; frequency shows octave; wave shape shows 0 point and halfway point - Overlays on wave graph as part of synth controls; spline, selected stairstep, editing ADSR parameter, uncombined overtone shapes - Drag stairstep height and width on wave graph - Overlap frequency and amplitude graphs for synchronization of effects (and maybe wave graph in PCM mode; wave graph should be able to show entire selected region) - Show selected track bounds on waveform view - Show individual samples in waveform view when zoomed in enough (toggle to point mode?) - Precise controls for editing spline points - List of general synth setups, with instant switch to compare sounds and waveform shapes - User preferences: - Remember value of hz checkbox - EffectParameterSlider customization - Stepper direction order for tracks - Zoom target for waveform (selection cursor or rollover frame) - Play on undo/redo if "Play on parameter change" box is checked - Automatically append file extension on export - Inherit value of binary/JSON save format from loaded file - Default save format (binary/JSON) - Undo buffer size - Keep redo timelines - Show memory usage - Show onscreen notification confirming when file has been saved (##required for release) - Open multiple documents at once - Edit instrument is transient; document disappears when "edit done" button pressed - Sequencer core improvements: - Seamlessly update music sequence if updated while playing (indicator light showing update is queued on background thread) - Also update while not playing - Profile and optimize synthesis - Parameter control tracks - More efficient delta encoding for undo states - Mid-note instrument variation (slide pitch/timbre, etc.) - Detect clipping in composition (and maybe do something about it) - Sequencer UI improvements: - When "Sync with selection" is checked on SequencerScreen, absorb properties from first note when a pattern is selected - Select region to play in sequencer view as with waveform - Cursor and selection region in pattern view - Mute and solo tracks in sequencer view - Playback cursor on MusicSequenceEditView should dim when paused with space instead of disappearing, if it's going to resume from the same point - Waveform underneath sequence editor; move BPM and time signature left to make room - Always-present piano keyboard underneath pattern editor; move upward to make room - Key transpose - For selected notes, show from/to key signature, with warning icon for signatures that would contain chromatic notes - Assign default key signature (per instrument?) to composition or pattern - "Select chromatic" button? - MIDI keyboard input - Column titles for note list - Multiple beat/measure selection in MusicPatternEditView - Drag note duration vertically, inside MusicPatternEditView - Tab order for edit fields (##required for release) - Better cursors for dragging and selecting (MusicSequenceEditView, MusicPatternEditView) - Visualizer for all notes in playing sequence - Drag and drop in MusicPatternEditView - Separate drag zones for moving and selecting - Pattern name and color assignment - Show onscreen notification confirming when file has been saved (##required for release) - Sfxr improvements: - Edit multitrack bfxr files (##required for release) - Add steppers - Audio editor screen: - Settings dialogs for editing operations (amplify, normalize, center) - Time stretch/pitch shift - https://www.youtube.com/watch?v=PjKlMXhxtTM - Equalizer - Generators - Better interface for cycle count hertz measurement - Implement fade menu item (or remove) - Show (and edit) sample value at cursor - See what fourier transform can do for graphing - https://github.com/slembcke/LiFFT - Option to zoom toward selection cursor instead of mouse cursor in waveform - Multichannel audio support (waveform currently draws only first half for stereo files) - Multi-track editing - Multi-document editing (see two tracks at once, copy/paste/mix between them) - Edit operations from other screens are transient - Record - Command line tool (##required for release): - Convert json <-> binary -> wav/ogg - Apply AudioMath functions - Change pcm format - Testing: - Handling of different channel count, sample rate, and bit depth in all places where audio files can be loaded - Binding of all synth properties, especially when layered or modified (try mute/solo) - All undo/redo operations on GeneralSynthScreen - Check for leaks with valgrind - Stress test with large/complex operations, profile, optimize - Undo in UIEditText - Autosave (##required for release) - Middle-click + drag for all scrolling views - WebAssembly build - DPI awareness on Windows (##required for release) - Figure out why application icon doesn't show up in window title bar on Windows - See SDL_windowswindow.c (WIN_SetWindowIcon) musicdsp.org (old) - Interpolating resample function - Equalizer - Channel masks for all audio functions - Blending? - Mix channels with envelope? - Pitch shift maintaining duration - Reverb/delay - Swap channels? - Gaussian distribution for noise function? (Generate n samples (n = 12?) and add them together) - Convolution (low-pass/high-pass filters and more) (CH6 page 110) - Waveform used for modulating between samplers (example: high frequency square wave generator is turned on and off by lower frequency one; see Explorer sound effects) - Hierarchy: - WaveGenerator (flat, layered, sequenced) - WaveGenerator (if layered or sequenced) - AmplitudeEnvelope (flat, layered, or sequenced) - AmplitudeEnvelope - FrequencyCurve (flat, layered, or sequenced) - FrequencyCurve - WaveSampler (flat or with overtones) - WaveSampler - Music player - UITableView - Highlight row, enter to play from beginning, space to pause/resume - Load MP3, Ogg, Mod, saving list and metadata (name, artist, album, order) for each - Play multiple (show separate queue list? Tool (or button in table) to click to add to queue?) - Receive system drag and drop events References: - 10_CM0268_Audio_FX.pdf - audioEQCookbook.txt Old notes: audiolab goals: - Take raw audio samples and combine them using a nondestructive recipe (command line invocation) - Example: Trim raw padlock sound, pitch down, equalize, combine with bfxr unlock effect = Read and evaluate bfxr files + Generate interesting audio patterns beyond the scope of bfxr - Translate between wav and vorbis - Play MIDI data with musical instrument pack? - Record MIDI input? - Interface for editing recipes; export for command line - As with texturepacker, used in Foresight Fight build process - All-purpose music player - Transforms: Trim, fade (with curve function), mix, pitch shift, equalize, amplify, normalize, pan, resample - Priority: Foresight Fight padlock/bfxr needs - audiobatch executable for list of audiorecipe invocations - Music sequencer: - Low level interface: Compositor that takes a list of synthesizer configurations and timings and outputs PCM data - Higher level: Pattern grid with quantized tones, BPM, list of instruments, small number of parameters exposed - BFXR mixer interface could render to low level representation - Instrument interface between low-level compositor and synth; lists adjustable parameters and implements setting them, rendering audio - Instrument configurations listed in compositor; instrument interfaces owned elsewhere, referenced by compositor, passed configurations to render USER-FACING STUFF: All included samples are in the public domain. Everything you make with this program is owned by you.