ideas: Make it not appear as one giant list after markdown formatting.
1 files changed, 144 insertions(+), 90 deletions(-)

M notes/ideas.md
M notes/ideas.md +144 -90
@@ 4,14 4,16 @@ Ideas
 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 @@ General
     * 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 @@ Synthesis core
   * 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 @@ Synthesis core
   * 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 @@ Synthesis core
   * 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.” <http://www.midi.org/techspecs/manid.php>
 
-* 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 @@ Synthesis core
       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 @@ Synthesis core
   * 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 @@ Synthesis core
 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 @@ Devices
     * 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 @@ Devices
 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 @@ User interface
   * 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 @@ Performance
   * 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