# HG changeset patch # User Laurens Holst # Date 1409502027 -7200 # Sun Aug 31 18:20:27 2014 +0200 # Node ID d13be4a7b84707850b6785d71d00c9544b3d44c8 # Parent ddf91753867d09d6372872dc55065bc7d8881954 ideas: Make it not appear as one giant list after markdown formatting. diff --git a/notes/ideas.md b/notes/ideas.md --- a/notes/ideas.md +++ b/notes/ideas.md @@ -4,14 +4,16 @@ General ------- -* Terminology +Terminology + * Control signal flow / chain * Trigger impulse * Control sampling rate (60Hz) * Module cores * Part -* Mode without UI updates to minimise latency +Mode without UI updates to minimise latency + * E.g. pressing STOP key; in stead, it will process MIDI messages * Window pops up informing the user while this mode is enabled * And telling him how to exit @@ -19,33 +21,36 @@ * Avoid using VDP int if alternative timer is available * Interrupt checks if buffer is empty, if not yields -* Patch loading / saving +Patch loading / saving + * Save to spare cartridge FlashROM * Save to disk * Save to Sony HBI-55 / Yamaha UDC-01 Data Memory / PAC * Save to MIDI out (dump) * Save to cloud -* Connect to the cloud through MIDI and a PC host application +Connect to the cloud through MIDI and a PC host application -* Put all core code in bank 1, all UI in bank 2, and shared stuff in bank 0 +Put all core code in bank 1, all UI in bank 2, and shared stuff in bank 0 + * Create core folder to group them * UI should have no need to access the core code -* Organise code into “semantic” segments: SYSTEM CORE FONT UI +Organise code into “semantic” segments: SYSTEM CORE FONT UI -* Deallocate / reallocate all objects when heap is fragmented +Deallocate / reallocate all objects when heap is fragmented -* Add MIDI implementation chart +Add MIDI implementation chart -* Submit v1.0 to synthtopia, sonicstate, gearslutz, createdigitalmusic, etc... - soundonsound.com/forum, djtechtools.com +Submit v1.0 to synthtopia, sonicstate, gearslutz, createdigitalmusic, etc... +soundonsound.com/forum, djtechtools.com Synthesis core -------------- -* Simple module ideas +Simple module ideas + * Mix, does simple 50/50 mix (see wt interp) * Parametrix mix, mixes based on control (-127..127), also useful for panning * S&H / latch, samples a value at trigger (default 127) or gate (default 0) @@ -109,18 +114,21 @@ * Delay, circular buffer with configurable size * Poly index, extracts the note index -* Note per channel mode (poly pitchbend: QuNexus, Seaboard, Linnstrument, etc.) +Note per channel mode (poly pitchbend: QuNexus, Seaboard, Linnstrument, etc.) + * Simply instantiate multiple channels. * May not work for all patches who expect a single input from channel. * Maybe just a separate pitch bend input? (what about aftertouch?) -* Typed links +Typed links + * Signed, unsigned, boolean, trigger, object * Poly, mono (rather a module property, isn’t it?) * Primitive type links are mostly useful for UI * Object type links have null object. -* Poly to mono +Poly to mono + * Indicate polyness on modules with notches in bottom right line * Auto-limit poly based on available resources (at least 1 of each) * Merge modules, merge-or, merge-max, add, average, interval, count, select @@ -130,11 +138,13 @@ * Polyphonic select + note number = arpeggiator * Essentially these are array inputs -* Sound chip modules at the end of the chain! (poly to mono!) +Sound chip modules at the end of the chain! (poly to mono!) + * Requires object links * Do these cross patches? Check settings and require them to match... -* NotePool +NotePool + * Rename to note allocator * Max polyphony, how many voices. Actual polyphony depends on resources. * Allocation, steal notes, priority, reuse, or round robin @@ -148,54 +158,63 @@ * Interval links; if you play notes ABC, release AC, it will play BCD * All of these parameters should ideally be linkable -* How to implement channel reuse? Some thoughts: +How to implement channel reuse? Some thoughts: + * Triggers on voices * Voice priority values * Amplitude as gate, or as priority * Choke groups * Note allocation merge module -* Rather than pushing Notes, store note array on Channel and pull? +Rather than pushing Notes, store note array on Channel and pull? -* Reset All Controllers should not actually reset all. +Reset All Controllers should not actually reset all. + * See http://midi.org/techspecs/rp15.php -* Envelope segment curve selection; linear, log (attack), exp (decay) +Envelope segment curve selection; linear, log (attack), exp (decay) -* Numpad drumpad +Numpad drumpad -* Sysex dump of current patch configuration +Sysex dump of current patch configuration + * Including controller position * “A manufacturer must get a registered ID from the MMA if he wants to define his own SysEx messages, or use the following: Educational Use 0x7D. This ID is for educational or development use only, and should never appear in a commercial design.” -* Add poly pressure array to channel +Add poly pressure array to channel + * Let notes pull from it * Should they take highest between channel and poly pressure? * Can also be done with a module... * Same goes for pitch bend -* When linking module A to B, make sure B is updated before A +When linking module A to B, make sure B is updated before A + * Scan for module B, if A is found swap until B is reached -* Update listeners improvements +Update listeners improvements + * Replace update listeners with linked list on module cores? (like hooks) -* Rather than having channels, have parts which specify which port / channel / - keys they listen to. Basically they filter, allowing you to create splits etc. - The patch is contained inside the part. +Rather than having channels, have parts which specify which port / channel / +keys they listen to. Basically they filter, allowing you to create splits etc. +The patch is contained inside the part. + * Have note pool listeners register themselves on MIDI devices * Port number in addition to channel number -* Extraction modules, connecting to MIDI stream? +Extraction modules, connecting to MIDI stream? + * MIDI aftertouch, CC, etc. Only listen to what you need. * May not perform well... -* Don’t limit number of voice instances +Don’t limit number of voice instances -* Course wavetable interpolation +Course wavetable interpolation + * Slow, but maybe convenient ld a,(bc) @@ -212,14 +231,16 @@ ld (de),a inc l, c, e -* Add note number to Note +Add note number to Note -* (MIDI) Clock module +(MIDI) Clock module + * Provides 8-bit timer and trigger outputs * Separate clock divider module? * Or multiple clocks with integrated divider? Or both? -* Packaging modules allows you to define new modules consisting of others +Packaging modules allows you to define new modules consisting of others + * Name: “Composite module”, “Macro module” (Reaktor), “Patcher module” (Max) * The built-in modules are called primitive modules * Cleans up nicely @@ -228,48 +249,56 @@ * Extra annotation on the inputs specifying the default value * Which can also be a nonconstant... -* Macro bank module +Macro bank module + * Combines 8 configurable controllers with attenuate-adds. -* Key release trigger +Key release trigger -* Random generator source +Random generator source + * Random LFO * Analog drifting * Have ability to hold after note-on -* CPU frequency adjust +CPU frequency adjust + * Frequency table offset (5.4MHz = -6, 7MHz = -12, 10Mhz = -18) * Enable globally or per-chip * With CPU frequency auto detection * Probably fastest to alter the table itself (in RAM, then) -* Add number of notes pressed to Channel +Add number of notes pressed to Channel + * Wolf_: simple example: you know the drill with FM, drive the modulator level too high and you get nasty FM noise. So, how about: you play one note, the registers are 'nice', so you get a clean sound. Next you play two notes, now you drive the modulator level and you get a nasty FM noise. -* Add scale detection to Channel +Add scale detection to Channel + * Distance between the root and the next note output * Wolf_: e.g. a minor chord could have different results compared to a major chord, and different compared to an octave. * Identifying the root * https://en.wikipedia.org/wiki/Root_%28chord%29#Identifying_a_chord.27s_root -* Wavetable ideas +Wavetable ideas + * Saxophone; sample wave for each note (127 waves) * voice; vowels have periods too (a, e, i, u, o) -* Wavetable editor +Wavetable editor + * Supports FFT-based wave interpolation & cutoff * Import samples from waves (e.g. Adventure Kid Waveforms) * Need non-power-of-2 downsampler * See openMSX code, set resampler {fast blip hq} * Also see libsamplerate (openmsx hq resampler is based on it) -* Something about Sub 37 note allocation http://youtu.be/DYzsz2U7RM0?t=4m21s +Something about Sub 37 note allocation http://youtu.be/DYzsz2U7RM0?t=4m21s + * More Sub 37 stuff http://youtu.be/0N4xntZbdW0 * Enveloped http://youtu.be/0N4xntZbdW0?t=6m44s * retrigger, multi-trigger, single-trigger, loop, delay, hold @@ -278,12 +307,14 @@ Devices ------- -* FM architecture +FM architecture + * Operators, have multiplier, ADSR, level, etc. * 2-op / 4-op voices, have gate, frequency, modulator, carrier, algorithm... * FM chip, has 2-op and 4-op inputs, global panning, allocation strategy, etc. -* PSG architecture +PSG architecture + * Tone voices, have frequency, volume, envelope enable, noise enable * Noise source, have frequency (on PSG module, or separate?) * Envelope, have frequency, type (on PSG module, or separate?) @@ -291,32 +322,37 @@ * Envelope/noise input can be null, then tone enables will be ignored * Can we enforce this efficiently? -* PSG rate values are 1 higher than SCC +PSG rate values are 1 higher than SCC -* Introduce Device class which provides common calls for detection, - initialisation, hooking interrupts, providing timers, etc. +Introduce Device class which provides common calls for detection, +initialisation, hooking interrupts, providing timers, etc. -* Sample ADC’s for modulation signal (Philips Music Module MIC: clap!) +Sample ADC’s for modulation signal (Philips Music Module MIC: clap!) + * Envelope follower -* Add SCC+ detection +Add SCC+ detection + +Add PSG2 class to play the envelope -* Add PSG2 class to play the envelope - Saw wave up to 6930Hz, triangle wave up to 3460Hz + * Saw wave up to 6930Hz, triangle wave up to 3460Hz -* MidiSaurus info +MidiSaurus info + * http://www.mccm.hetlab.tk/millennium/milc/midi/topic_6.htm * http://www.mccm.hetlab.tk/millennium/milc/architec/topic_1.htm zegt: * http://www.msx.org/forum/msx-talk/hardware/programming-bit2-midi-saurus * http://www.msx.org/forum/msx-talk/hardware/midi-saurus-data-sheetprogramming-guide * http://www.msx.org/wiki/MIDI-Saurus -* FAC MIDI interface +FAC MIDI interface + * Intel 8251 * 10 OUT 3,0: OUT 3,0: OUT 3,0: OUT 3,64: OUT 3,78: OUT 3,21 * 20 OUT 2,&H90: OUT 2,60: OUT 2,64 -* YIS503IIIR network module +YIS503IIIR network module + * The YM3802 UART has extensive MIDI support * Does it support the MIDI clock rate? * No opto-isolator though @@ -325,7 +361,8 @@ User interface -------------- -* Two-panel editor layout +Two-panel editor layout + * Left 80%: Patch modules overview (3x16 boxes w/name & 1 other thing) * Right 20%: Selected module details (like now) * Moving left / right selects module, up / down selects port @@ -333,99 +370,114 @@ * When selecting port, the connected module(s) is highlighted (bold outline?) * And the port is shown in the box -* Have module categories (LFOs, Waves, etc.) +Have module categories (LFOs, Waves, etc.) + * Have space between module / category identifiers so I can easily insert more -* Output build information along with exception +Output build information along with exception -* Boot-up effect (fade or w/e) +Boot-up effect (fade or w/e) -* Swap out compatible modules (e.g. saw wave / sine wave) +Swap out compatible modules (e.g. saw wave / sine wave) -* Show min/max cycles for each module +Show min/max cycles for each module + * So people can make informed performance decisions * E.g. Select8 is quite a bit faster than Sequence8 * Also provide function to calculate total min/max load -* Detect and indicate feedback loops +Detect and indicate feedback loops + * Feedback is OK, but it causes 1 sample delay so we should be clear about it * In Reaktor, an indicator Z appears on the output when there is feedback -* Option to reorder modules to match dependencies +Option to reorder modules to match dependencies -* Make sure UI doesn’t get starved +Make sure UI doesn’t get starved + * If UI update is still not done after 1s, yield until it does -* Detected devices screen +Detected devices screen + * Detect AY-3-8910 / YM2149 difference (masked course tuning bits return 0) * Allow chip mode selection, SCC/SCC+, OPL1/OPL3/OPL4, etc. -* While editing an input, ability to immediately insert a module (smartly) +While editing an input, ability to immediately insert a module (smartly) -* Keyboard +Keyboard + * Switch layout depending on current mode * Store key presses into circular buffer (ignore when full, if debug: throw) * Use numpad to enter constant values quickly -* Add module selection list shows name + first line of help text +Add module selection list shows name + first line of help text + * Or, help text in a panel to the right -* Fill in dots in module UI to indicate connection? +Fill in dots in module UI to indicate connection? -* In help texts, speak of trigger impulse +In help texts, speak of trigger impulse -* For module help text, have general description, then enumerate parameters +For module help text, have general description, then enumerate parameters -* Oscilloscope view to show value changes over time +Oscilloscope view to show value changes over time -* Channel monitor like here: http://youtu.be/JBnk71WsKtc +Channel monitor like here: http://youtu.be/JBnk71WsKtc + * Keyboard monitor like this: http://youtu.be/2EdRRgxoP-g?t=16m12s -* ADSR / wave viewer like this: http://youtu.be/ou5TMtUtUKI?t=2m55s +ADSR / wave viewer like this: http://youtu.be/ou5TMtUtUKI?t=2m55s -* F1-F5 accesses menus, use CTRL-* for shortcuts +F1-F5 accesses menus, use CTRL-* for shortcuts -* Indicate poly modules by giving them a double (or fatter) border +Indicate poly modules by giving them a double (or fatter) border + * Indicate poly connections by showing double or triple wires -* Selecting a value and pressing ENTER enters link edit mode +Selecting a value and pressing ENTER enters link edit mode + * Link updates immediately to audit (and notice lucky coincidences) * Hold CTRL and move controller to change constant value * Hold SHIFT to enter MIDI learn mode (move controller to select) * Move selection to the controller if available, or constant otherwise * Draw line between input and source (when pressing SHIFT?) -* Selecting a module and pressing ENTER enters module edit mode +Selecting a module and pressing ENTER enters module edit mode + * Pressing LEFT / RIGHT moves the module (w/ constraints?) * Pressing BACKSPACE removes it and fixes all links -* Show help window while in edit mode +Show help window while in edit mode -* Include description with patch for description, tips, credits, etc. +Include description with patch for description, tips, credits, etc. -* Small popup at the bottom showing control changes for a second +Small popup at the bottom showing control changes for a second -* Show memory meter (heap status) +Show memory meter (heap status) -* Show CPU load meter. +Show CPU load meter. + * Employ timers with higher accuracy levels when available. * TurboR timer 0E6H-0E7H (16-bit LE) runs at 255682 Hz (14 Z80 cycles/tick) -* Change BLINK colour depending on selection +Change BLINK colour depending on selection + * For module selection, use orange foreground colour to change outline * For input value selection, use dark blue background * For output value selection, use purple background -* Do colour split at bottom to give a different colour +Do colour split at bottom to give a different colour -* Inspiration +Inspiration + * Arturia Origin https://www.youtube.com/watch?v=IVj0Kah7bas Performance ----------- -* MidiIn_ProcessMessages optimisations: +MidiIn_ProcessMessages optimisations: + * Running status optimisation * After a message has been processed, see if the next byte is no status byte * If so, loop immediately. Aftertouch, CC and bends will like this. @@ -434,12 +486,14 @@ * Bypass MidiIn for nonmidi devices (KeyMidi / AudioMidi) * However for now it’s kept to increase testing coverage -* Embed small modules in the object +Embed small modules in the object + * e.g. Or, ld a,(nn), ld hl,nn, or (hl), ld (nn),a -> 10 bytes in stead of 5 * Listeners needs to adapt to support variable length * Or better, embed the modules into one long stream of code -* Copy code to RAM on turbo r +Copy code to RAM on turbo r -* Memory optimisation +Memory optimisation + * Put all cores in a dedicated mapper page