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>