Skip to content
Jim Menard edited this page Dec 7, 2020 · 25 revisions

Bugs

The Be staff...went to see the movie "Men in Black." ...The movie makes a point that is somehow appropriate -- It is impossible to completely rid the universe of bugs, but at least you can drive something fast, arm yourself with powerful tools, and look good doing it.

-- [email protected]

Menu Bar Not Accepting Clicks: MacOS Catalina

On macOS all of a sudden (starting in mid-August 2020), when KeyMaster is launched the main menu does not respond to mouse clicks at all UNTIL you switch to another app. So after starting KeyMaster, switch to another app then switch back. This is horrible, but I'm not yet sure how to debug this. I suspect an OS update (I'm on Catalina 10.15.6) because I recompiled and ran multiple older working versions of KeyMaster and the problem still exists.

Missing Features

Start/continue/stop buttons in clock panel

Start/continue/stop trigger actions

remove toggle_clock when do this

Database migration

New Feature Ideas

Innovation is not about saying yes to everything. It's about saying NO to all but the most crucial features.

-- Steve Jobs

  • Mute a connection or an instrument quickly from keyboard, from GUI

  • Duplicate song/patch/connection. Copy patch/connection so you can copy it to another song/patch.

  • Reorder patches and connections.

  • Names for connections: "brass", "bass", etc.

  • Hex / decimal converter.

  • Mark files so you can know, for example, which ones you've played in an evening and which you've not played yet.

  • When go to song or patch, make patch list focus.

  • Sustain latch. First down/up (non-zero/0) turn on sustain. Second pair turns it off. Button and/or keyboard latch, too?

  • Timing tests from input to output to make sure the connection code is fast enough.

  • Let Named Messages send MIDI files or raw data files containing MIDI bytes.

  • A DSL for byte messages

    • Symbolic names, default channels and perhaps velocities, note names, math (bitwise, addition)
  • Info window could bold and italicize text according to markup (Org Mode or Markdown).

  • A logo would be nice.

  • Alternate display that only shows song and patch names and little else? This might be useful during performance.

  • Do I need to handle running bytes in Connection#midi_in? I don't think so; I think PortMidi handles that.

  • Add a "big patch name window" that shows current song and patch in big letters.

  • MIDI to text; output file or text window

Ideas from Midihub (https://blokas.io/midihub/)

  • MIDI generators that are not inputs, such as
    • CC LFO
      • rate, depth, center, waveform, trigger (always running, only when first note played in chord, retriggered for all notes)
    • CC ADSR envelope
      • trigger (always running, 1st note, retrigger every note)
    • main MIDI clock
  • Arpeggiator (rate, direction, velocity changes?, other Hydrasynth options)
  • Note scale remapper
  • Note repeater (needs MIDI clock messages, division, num repeats, fade, octave)
  • Delay (millisecs or tempo if clock)
  • Randomizer
  • Note to chord
  • Velocity scale remapper
  • Multi-CC controller from a single CC (map one CC to multiple ones)
  • Fixed note length
  • Tempo divider
  • Sync delay

I have a feeling these would require something like a struct containing the current state of the channel (notes on, for example). Right now they are stored in the input. Does it make sense to move them to the connection?

Edit

Use Ctrl- (or Cmd-) -Z, -X, -C, -V, -D (undo, cut, copy, paste, duplicate), all for current type (except undo). Command pattern?

Ctrl/Cmd-N for new current obj? Shift Ctrl/Cmd-N for new project.

Connections

  • Volume mapping for note ons and note offs (same one for both)
  • Channel pressure mapping, poly pressure mapping

Controller Filters

  • Map all values 0-127 (allow diff value for each input value)
  • Different scaling/curves

Triggers

  • Trigger on any program change from any source, which would require "wildcard" MIDI messages something like [0xcX, 0xXX]

Editor / GUI

  • Drag and drop to reorder: patch, set list
    • Reordering connections doesn't matter, but no harm in allowing it

MIDI Monitor

Colorize inputs and outputs, different color per connection. Would have to send connection along with input and output message. But then if input had 2 conns we'd have send it to monitor twice.

Maybe input could have the monitor draw a line on both input and output side, or timestamp or something, to say "start of input".

Storage

Perhaps use https://www.sqlite.org/pragma.html#pragma_application_id and https://www.sqlite.org/pragma.html#pragma_user_version to store app id and db version. Could use user_version to do database migrations.

Documentation

  • Clock, and trigger to toggle clock.

  • Per-connection filters. Explain what program change does, for example, and how bank msb/lsb are treated differently than other controllers.

  • Document the GUI. Clicking on things to activate (messages send), double-click to edit.

  • Connection: prog change/bank only sent if both input channel is not "all" and output channel is not "input chanel". If those are all/input then KeyMaster doesn't know what channel to send the program change to.

  • Velocity curves.

  • Zone note names.

  • Song notes and reload features.

  • Messages in triggers are hex.

  • Instrument initialization/editing. On startup if no project is loaded, KeyMaster finds all attached MIDI instruments. When the project is saved, it saves those instruments. When a project is loaded, it loads those instruments and tries to "attach" them to the instruments Keymaster found. If they match (by name and input/output type) then all is well. For every instrument in the database that was not found, we create a new instrument that will be marked as disabled and won't read or write MIDI.

Clone this wiki locally