-
-
Notifications
You must be signed in to change notification settings - Fork 118
Home
This page may grow to include more information but, for now, its sole purpose is to gather suggestions for enhancements which I hate to see linger in the "Issues" section.
Work on v3 has started in the develop branch. It will be a major overhaul. Here is the list of stuff planned for this version:
-
Add a way to forward inbound messages on an
Input
object to anOutput
(to behave like a physical MIDI THRU port). This could be expanded to a more elaborate filtering and routing system (example) -
Add
filter
option to allow listening to only a subset of events (e.g. specific controller change or NRPN messages, discussed in PR #88) -
Make sure it works with TypeScript in various scenarios (Issue #82) and add proper type definitions to DefinitelyTyped (perhaps using dts-gen)
-
AddgetNoteState()
method toInputChannel
so it it is possible to check if a note is currently playing or not. This allows to check for chords when a noteon message is received. -
Properly handle when a laptop's lid is closed then reopened (Issue #140) -
As suggested by users, allow sending MSB and LSB at once when sending control change messages (Issue #57). This would have to be done for CC messages 0-31 which all have a matching LSB. -
Rewrite the NRPN parsing mechanism in InputChannel. I do not think it works correctly. Here are starting points: -
AllowsendSysex()
to acceptUint8Array
(Issue #124, forum thread) or perhaps to accept aMessage
object that can be built from aUint8Array
(this needs to be carefully examined) -
Add aMessage
object -
Add the ability to set default values for attack velocity, release velocity, etc. ( see forum discussion) -
* Various utility methods should probably be stashed in aUtils
class (e.g. getCcNameByNumber(), etc.) -
* Add convenience method to convert float and 7 bit:to7bit()
andtoNormalized()
-
Add the ability to individually transposeInput
,Output
,InputChannel
andOutputChannel
. -
AddInputChannel
andOutputChannel
objects (Issue #20) -
Use ES6+ modern syntax and add default export so library can be imported withimport
(Issues #49 and #89) -
Move to Rollup for packaging the library (Issue #61) -
Drop support for Bower (Issue #60) -
Extend a proper event library to allow for modern event support (probably djipevents). -
Implement portstatechange
events (connected
anddisconnected
) -
MakeWebMidi
a singleton (see example here) -
WebMidi should dispatch 'enabled' and 'disabled' event -
Check that disable() really does disable everything -
Add methods for channel mode messages -
Implement[this will automatically work when browsers add support for it but will show a warning in the console until then).clear()
method (Issue #52) -
Added the new (software) parameter for[this will automatically work when browsers add support for it).requestMIDIAccess
-
Emit events for all channel mode messages -
AddstatusByte
anddataBytes
properties to the event triggered when receiving messages (#109) -
Deprecate the ability to send on all channels (default behaviour). This clogs up the MIDI stream and I do not really see a good use case for it. -
Create aNote
object withduration
andvelocity
property -
Add official support for Node.js (Issue #15) -
Allow specifying different note durations and velocities in(this is now possible withplayNote()
when using arrays (Issue #75 and #90).Note
objects). -
Complete test suite for all objects -
AddsendRaw()
method accepting either list of integers orUint8Array
. -
Allowsend()
to acceptUint8Array
-
Should parameters (e.g. velocity) be specified as 7bit value (0-127) or normalized value (0-1) ? See forum discussion and GitHub Discussion. This applies to:
-
Output.setKeyAftertouch()
- pressure -
Output.setChannelAftertouch()
- aftertouch -
Output.setPitchBend()
- bend -
Output.playNote()
- attack, release -
Output.sendNoteOn()
- attack Note()
setPitchBendRange() and setModulationRange () already use 0-127 for LSB/MSB
-
-
What should be the default channel value for listening and sending? I think listening on all channels will help beginners and doesn't risk clogging the system. Sending to all channels by default is kinda weird, though.
-
Should all values be zero-indexed (MIDI channels, bank numbers, etc.)
Enhancements for the website and documentation
-
Add discussion forum -
Evaluate moving to GitHub Discussions from Vanilla Forums (see this forum post) -
Add several usage examples:
- Vanilla JS
- React/Next.js/Svelte/etc.
- How to interface with other MIDI software on macOS, Windows and Linux
- Typescript (with example that includes import and bundling).
- Electron/NW.js
-
The examples' source should be available in the
examples
folder of the repo -
Add 2.x -> 3.x migration guide
-
Add a CONTRIBUTING.md file
-
Include the ability to add MIDI event listeners at the WebMidi.js level (Issue #138)
-
Add a
stopAllNotes()
method -
Calculate time values and make them directly available for
songposition
andtimecode
message -
Make Istanbul (nyc) break down the coverage stats by test file.
-
Add the ability to send grouped messages for CC events (and potentially others)
-
Add support for MIDI Polyphonic Expressions.
-
Add explicit support for Universal System Exclusive Messages
-
This would include a
sendIdentityRequest()
method to the output object (perhaps with agetIdentity()
companion method that waits for the response) (Issue #117) -
This could also include the capability to query device for make/model (similar to jzz-midi-gear)
-
Implement show control protocol subset
-
-
Add ability to inject Jazz-Plugin code for browsers with no native Web MIDI API support.
-
Add the option to create sysex plugins for various devices forum thread
-
Add continuous integration tool
-
Add ability to read/write MIDI files
-
Add site to js.org (i.e. webmidi.js.org)
-
Solid timing, midi clock, sync, transport functionality
-
Helper functions that help to deal with sysex checksum from specific manufacturer (Roland checksum etc)
-
Add explicit support for Sample Dump Format (see discussion on forum)
-
Allow third-party developers to develop modules that facilitate encoding and decoding of device-specific sysex messages (see forum discussion)
-
Add timing capabilities such as syncing with Tone.js or being able to schedule events using musical notes.
-
Add the ability to export a MIDI file (perhaps with another lib such as MidiWriterJS or Jazz-Soft
-
SMF Support
-
Piano roll
-
Check if something specific needs to be done to support Electron (this discussion).
-
Consider usage of pipelining operator for patching webmidi function calls to a sequence: (https://github.com/tc39/proposal-pipeline-operator/blob/master/README.md#introduction) (https://babeljs.io/blog/2019/01/21/7.3.0#smart-pipeline-operator-9179-https-githubcom-babel-babel-pull-9179)
-
Consider using middleware approach for making the app pluggable (https://github.com/unbug/js-middleware)