Play the lower piano via a mouse/touch, or a computer keyboard, or an external MIDI instrument,
and see the echo transposed an octave up on the upper piano.
<!DOCTYPE html> <html> <head> <title>Echo</title> <script src="JZZ.js"></script> <script src="JZZ.synth.Tiny.js"></script> <script src="JZZ.input.Kbd.js"></script> </head> <body> <h1>Echo</h1> <div id=piano_out></div> <div id=piano_in></div> <script><!-- JZZ.synth.Tiny.register('Web Audio'); var midi_in = JZZ().openMidiIn(); // default MIDI-In (if available) var midi_out = JZZ().openMidiOut(); // default MIDI-Out var piano_in = JZZ.input.Kbd({ at:'piano_in' }); // lower piano var piano_out = JZZ.input.Kbd({ at:'piano_out', chan:1, active:false }); // upper piano var ascii = JZZ.input.ASCII({ // computer keyboard A:'F#4', Z:'G4', S:'G#4', X:'A4', D:'Bb4', C:'B4', V:'C5', G:'C#5', B:'D5', H:'D#5', N:'E5', M:'F5', K:'F#5', '<':'G5', L:'G#5', '>':'A5', ':':'Bb5' }); var map_to_0 = JZZ.Widget({ _receive: function(msg) { // change channel this.emit(msg.setChannel(0)); }}); var delay = JZZ.Widget({ _receive: function(msg) { // delay, transpose, change channel this.wait(500).emit(msg.setNote(msg.getNote() + 12).setChannel(1)); }}); midi_in.connect(map_to_0); map_to_0.connect(ascii); ascii.connect(piano_in); piano_in.connect(midi_out); piano_in.connect(delay); delay.connect(piano_out); piano_out.connect(midi_out); --></script> </body> </html>