- From: James Ingram <j.ingram@netcologne.de>
- Date: Tue, 1 Dec 2015 12:32:51 +0100
- To: Chris Wilson <cwilso@google.com>
- Cc: "public-audio-dev@w3.org" <public-audio-dev@w3.org>
> I'd like to just encourage people to discuss it here (or, preferably, > in the GH issue on virtual synths) Shall we move there? I think it might be better to stay here until my software has stabilised a bit more. Then we'll have ironed out the teething troubles. --- > I think it's a fantastically bad idea to redo a standardized albeit > slightly goofy mechanism just to make it simpler I knew that I was doing something risky in defining a separate layer for custom controls, and now see that it was indeed a mistake. A clear case of brain overload... It would be better if software synths always react to ordinary MIDI control messages (so that they can always be controlled easily by standard MIDI hardware). In my defence, I should say that the host is a layer between the hardware and the synth, so the host could adapt incoming messages. But that means that hosts would always have to do unnecessary work. Fortunately, the correction isn't very difficult to make. I'll do it as soon as I've finished this mail. --- > Granted, I remap some [CCs]: > > CC1 ("mod wheel"): controls filter modulation amount > CC2 ("breath controller"): controls filter cutoff > CC7 ("volume") and CC11 ("expression"): controls filter Q > CC5 ("portamento time"), CC15 ("undefined") and CC73 ("sound attack > time"): controls overdrive > ... and so on. (Full list visible at > https://github.com/cwilso/midi-synth/blob/master/js/synth.js#L150-L204.) > > In short, I set up CCs based on what my available keyboards that I > would likely demo on (e.g. my Alesis Vortex), rather than have a whole > separate mapping layer. I'm not personally convinced you CAN come up > with an exhaustive list of "standard" CCs, since many of the MIDI ones > don't even apply for a lot of synthesizers (e.g. the aforementioned > "portamento time"). Agreed. I'm not convinced either. But I still think that a controls declaration is a MUST. Think of it like this: The synth can't have a GUI because the GUI is the responsibility of the host app. Different host applications have different GUIs. One of the possible GUIs looks like your original one, with control labels, knobs and buttons, keyboard etc., and the synth's API has to enable the host to re-create a GUI like that. The synth's API is a non-graphical version of a GUI, that the host app can use as it thinks fit. I think that means that the controls declaration has to contain objects like those I defined for custom controls: (e.g. { name: "osc1 detune", index: 6, defaultValue: 64 } ). Obviously, synth programmers would do well to map their controls as closely as possible to the standard MIDI ones (as you did), but I see no way to legislate on what "close" means. There are (at least) two types of control in your original GUI: continuous controllers (knobs) and pop-up menus (for controlling waveforms). I can't think of anything really equivalent to a pop-up menu in standard MIDI, but the problem could be solved by defining a control like this: { name: "osc1 waveform", index: 19, defaultValue: "sawtooth", items: "sine, square, triangle, sawtooth" } That would define CC19 to be a control that accepts values 0, 1, 2 and 3, with default value 3. Attempting to set a value greater than 3 would be an error. I think we need to define a standard form for each GUI control type. There aren't very many of them, so that shouldn't be too difficult. Note that default values are those that are set when the synth gets an "all controllers off" message: { name: "all controllers off", index: 121 } or { name: "reset", index: 121}. Should all synths *always* implement standard MIDI CC121 to mean "reset all controllers to their default values"? I currently think this comes under the heading of recommending that programmers map their controls as closely as possible to the standard MIDI ones. One can recommend that programmers implement this control, but not insist. Since we are now allowing standard MIDI CCs to be overridden, I think its quite legitimate to do the following: { name: "pitchwheel deviation", index 42, defaultValue: 2 } (42 being arbitrarily chosen here). ---- > Throwing exceptions is a nuclear option. Error handling is a bit of a red herring. Its an implementation detail, not part of the API we are trying to define. Again, I think its a question of who is responsible for the GUI, and I think the GUI is the host's responsibility, not the synth's. If the synth throws an exception, the host can decide what to do with it, depending on the host's requirements. The host can choose to ignore the exception, put up an alert, send the synth an alternative message etc. If the synth decides to handle the error itself (e.g. by ignoring it), then the host has no choice. The synth has no way of knowing what the host might want to do, so it should throw an exception. --- Issue #110 <https://github.com/WebAudio/web-midi-api/issues/110> > Note that supporting GM instruments does not mean that the whole MIDI > standard is implemented. > > The whole MIDI standard meaning CC list, or the whole GM standard > (defined set of CCs, sounds, etc)? Because if you say you "support > GM", I'm pretty sure you need to support all of GM. In *software* synths, I think its important to keep load times down, and only to load the presets (and preset samples) that one actually needs. Of course, one can load a soundfont containing a complete GM sound set, but its going to take a long time. I think the question could be rephrased to make the answer more informative. Maybe "Can this software synth play GM presets?" and if the answer is yes "Can it play preset 17?" etc. The situation is very different for hardware synths. --- I think we are getting somewhere. Many thanks! :-) As I said, I'm now going to get rid of the custom controls layer. best, James
Received on Tuesday, 1 December 2015 11:33:31 UTC