arrow_upward | Ring Effect |
arrow_back | Portamento |
arrow_forward | Wide Vibrato |
arrow_downward | Fall Effect |
arrow_upwardarrow_upwardarrow_upward | Rocket Night |
arrow_forwardarrow_forwardarrow_forward | Pole Position |
arrow_forwardarrow_upwardarrow_backarrow_downward | Black Hole |
arrow_forwardarrow_forwardarrow_backarrow_back | Trick Shot |
arrow_backarrow_backarrow_forwardarrow_forward | Motor Psycho |
arrow_backarrow_forwardarrow_upwardarrow_downward | Rainbow Bell |
arrow_backarrow_forwardarrow_backarrow_forward | Smash Glass |
arrow_upwardarrow_forwardarrow_downwardarrow_back | Shrimp Nado |
arrow_downwardarrow_downwardarrow_downward | Boom Waker |
arrow_downwardarrow_downwardarrow_upwardarrow_upward | One Up |
arrow_backarrow_downwardarrow_forwardarrow_upward | Lightened Sky |
Q (or A) | C key, voice 1 |
2 | C# key, voice 1 |
W (or Z) | D key, voice 1 |
3 | D# key, voice 1 |
... | ... |
Z (or W) | C key, voice 2 |
S | C# key, voice 2 |
.... | ... |
1 | Switch Live/Loop Voice 1 |
A (AZERTY => Q) | Switch Live/Loop Voice 2 |
Tab | Focus on next 7-Segment |
+ | +1 on focused 7-segment |
- | -1 on focused 7-segment |
* | Switch Num Pad fonction (part or memory) |
0 | Stop Memory |
1-9 | Switch Part 1-9 or Start Memory 1-9 according to NumPad Switch position |
Page Up | Turn Modulation right |
Page Down | Turn Modulation left |
arrow_upwardarrow_downwardarrow_backarrow_forward | Expression / Special |
Midi Event | Channel | Values | Action |
---|---|---|---|
Note On/Off | 1 | 0-53 | Voice 2 - Note On/Off |
1 | 54-127 | Voice 1 - Note On/Off | |
2 | 0-127 | Voice 1 - Note On/Off | |
3 | 0-127 | Voice 2 - Note On/Off | |
4 | 0-127 | Voice 3 - Note On/Off | |
10 | 0-127 | Drums - Note On/Off | |
Note On | 5 | 1-9 | Start Memory 1-9 |
5 | 0 | Stop Memory | |
6 | 1-9 | Switch Pattern part 1-9 | |
Program Change | 1,2 | 0-35 | Voice 1 - Instrument Change |
3 | 0-35 | Voice 2 - Instrument Change | |
4 | 0-35 | Voice 3 - Instrument Change | |
Pitch Bend | 1,2 | 0-127 | Voice 1 - Pitch Bend |
3 | 0-127 | Voice 2 - Pitch Bend | |
4 | 0-127 | Voice 3 - Pitch Bend | |
CC Modulation (1) | 1,2 | 0-127 | Voice 1 - Modulation Wheel |
3 | 0-127 | Voice 2 - Modulation Wheel | |
4 | 0-127 | Voice 3 - Modulation Wheel | |
CC Expression (11) CC Vibrato Depth (77) | 1,2 | 0-127 | Voice 1 - Vibrato Amplification |
3 | 0-127 | Voice 2 - Vibrato Amplification | |
4 | 0-127 | Voice 3 - Vibrato Amplification | |
CC Sustain Pedal (64) | 1,2 | 0-127 | Voice 1 - Cut Release |
3 | 0-127 | Voice 2 - Cut Release | |
4 | 0-127 | Voice 3 - Cut Release | |
CC Portamento On/Off Switch (65) CC Portamento CC Control (84) | 1,2 | 0-127 | Voice 1 - Portamento Switch |
3 | 0-127 | Voice 2 - Portamento Switch | |
4 | 0-127 | Voice 3 - Portamento Switch | |
CC General Purpose (80) | 1,2 | 0-127 | Voice 1 - Switch Live/Loop |
3 | 0-127 | Voice 2 - Switch Live/Loop | |
4 | 0-127 | Voice 3 - Switch Live/Loop | |
CC General Purpose (81) | 1,2 | 1-8 | Voice 1 - Set Pattern Number |
3 | 1-12 | Voice 2 - Set Pattern Number | |
4,10 | 1-16 | Voice 3 - Set Pattern Number |
Note : on some softwares / devices, MIDI channels are counted from 0 to 15 and not from 1 to 16.
Channel 4 and Channel 10 both point to the Voice 3 of the Tony-b Machine : simultaneous events are not taken into account.
Event | Action |
---|---|
Directional pad / joystick | Expr/Special buttons |
Button 0 | Switch to Parts or Memories functionalities |
Button 1 | Stop memory |
Button 2 to 10 | Start memory 1 to 9 / Switch Pattern Parts 1 to 9 |
Analog Stick | Modulation Wheel |
It can be convenient to paste values from your favorite spreadsheet.
Action | Available values | Description |
---|---|---|
On (Note On) | from 0 to 127 | Beginning of a note |
Off (Note Off) | from 0 to 127 | Ending of a note that began with same value |
Ins (Instrument) | from 0 to 35 | Changes instrument among the 36 available |
Pit (Pitch Bend) | from -2400 to 2400 | Pitch note up or down. The value is in cent (hundredth of a semitone) |
Por (Portamento) | 0, 1 or 2 | 0 disables portamento, 1 enables it once for next note, 2 enables it permanently |
Vib (Vibrato) | 0, 1, 2, 3 ,or 4 | 0 disables vibrato, 1 is for the standard vibrato, 2, 3 and 4 makes a more or less wide vibrato |
Mod (Modulation) | from 0 to 127 | Turn the Modulation Wheel |
Cut (Cut Release) | 0 or 1 | 1 cut notes immediately at Note Off event (= no release). Default : 0. |
Pla (Playing Mode) | 1 or 2 | 1 = Live, 2 = Loop |
Pat (Pattern) | from 1 to 8, 12 or 16 depending on the voice | Changes the Pattern (Loop Mode only) |
Par (Part) | 10, 11, 20, 21, 30 or 31 | Change pattern part. The first number is the part (1,2 or 3), the second number activates it (1) or deactivates it (0). |
Tem (Tempo) | from 60 to 250 | Change Tempo. |
Time Voice Action Value 0 1 On 60 1 1 Off 60 1 1 On 64 2 1 Off 64 2 1 On 67 3 1 Off 67 3 1 On 72 4 1 Off 72 4 1 On 76 5 1 Off 76 5 1 On 79 6 1 Off 79 6 1 On 84 7 1 Off 84
Time Voice Action Value 0.0 1 On 60 0.6 1 Off 60 0.6 1 On 62 1.0 1 Off 62 1.0 1 On 64 1.4 1 Off 64 1.4 1 On 65 1.8 1 Off 65 1.8 1 On 67 2.0 1 Off 67 2.0 1 On 69 2.9 1 Off 69 2.9 1 On 71 3.0 1 Off 71 3.0 1 On 72 4.0 1 Off 72
Note | Octave | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
-1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
C | 0 | 12 | 24 | 36 | 48 | 60 | 72 | 84 | 96 | 108 | 120 |
C# | 1 | 13 | 25 | 37 | 49 | 61 | 73 | 85 | 97 | 109 | 121 |
D | 2 | 14 | 26 | 38 | 50 | 62 | 74 | 86 | 98 | 110 | 122 |
D# | 3 | 15 | 27 | 39 | 51 | 63 | 75 | 87 | 99 | 111 | 123 |
E | 4 | 16 | 28 | 40 | 52 | 64 | 76 | 88 | 100 | 112 | 124 |
F | 5 | 17 | 29 | 41 | 53 | 65 | 77 | 89 | 101 | 113 | 125 |
F# | 6 | 18 | 30 | 42 | 54 | 66 | 78 | 90 | 102 | 114 | 126 |
G | 7 | 19 | 31 | 43 | 55 | 67 | 79 | 91 | 103 | 115 | 127 |
G# | 8 | 20 | 32 | 44 | 56 | 68 | 80 | 92 | 104 | 116 | |
A | 9 | 21 | 33 | 45 | 57 | 69 | 81 | 93 | 105 | 117 | |
A# | 10 | 22 | 34 | 46 | 58 | 70 | 82 | 94 | 106 | 118 | |
B | 11 | 23 | 35 | 47 | 59 | 71 | 83 | 95 | 107 | 119 |
Very low and very high notes may not be played by the Tony-b Machine.
Important : the WebSocket is first launch your program and then refresh Tony-b Machine page in your browser to make it work.The following examples are coded in Node JS which is probably the simplest way, but you can consider make a script with any language likely to communicate with WebSocket : Java, Python, PHP, C(++)...
Module | Way | Description |
---|---|---|
midi-in | INPUT | Emulates a MIDI Input Device |
control-in | INPUT | Not available yet. Emulates all kinds of input actions. |
beat-out | OUTPUT | Sends the metronome ticking. |
db-out | OUTPUT | Sends the audio output level. |
var server = require('websocket').server;
var http = require('http');
var port = 1337;//use URL https://www.tony-b.org/?ws_ports=1337
var socket = new server({httpServer: http.createServer().listen(port)});
socket.on('request', (request) => {
var connection = request.accept(null, request.origin);
connection.send(JSON.stringify({"on":"midi-in"}));
connection.send(JSON.stringify({"on":"beat-out"}));
});
Module | Command | Parameter Type | Description | Example |
---|---|---|---|---|
midi-in | n | String | Sets the MIDI Device name | {"n":"Custom Virtual MIDI"} |
m | Array of 3 bytes ( see doc) | Sends MIDI Message | {"m":[128,60,127]} | |
beat-out | b | integer | The metronome ticking from 0 (measure 1, beat 1) to 15 (measure 4, beat4) | {"b":12} |
db-out | d | integer | The audio output level from 0 to 100 | {"d":99} |
var server = require('websocket').server;
var http = require('http');
var port = 1337;
var socket = new server({httpServer: http.createServer().listen(port)});
socket.on('request', (request) => {
var connection = request.accept(null, request.origin);
//enable MIDI module
connection.send(JSON.stringify({"on":"midi-in"}));
//name of device
connection.send(JSON.stringify({"n":"Node Program"}));
var i = 0;
setInterval(()=> {
i++;
var channel = 0;
var cmd = 7 + i%2;//note on / note off
var param1 = (i%4) < 2 ? 60 : 72;//midi notes : C5, C6
var param2 = 100;//velocity
//send MIDI message
connection.send(JSON.stringify({"m":[(16*cmd+channel),param1,param2]}));
},200);
});
var server = require('websocket').server;
var http = require('http');
var port = 1337;
var socket = new server({httpServer: http.createServer().listen(port)});
socket.on('request', (request) => {
var connection = request.accept(null, request.origin);
connection.on('message', (message)=>{
let data = JSON.parse(message.utf8Data);
if (data["b"] != null) {
console.log(data["b"]);//display beat from 0 to 15
}
});
connection.send(JSON.stringify({"on":"beat-out"}));
});
var server = require('websocket').server;
var http = require('http');
var port = 1337;
var socket = new server({httpServer: http.createServer().listen(port)});
socket.on('request', (request) => {
var connection = request.accept(null, request.origin);
connection.on('message', (message)=>{
let data = JSON.parse(message.utf8Data);
if (data["d"] != null) {
console.log(data["d"]);//display output audio level from 0 to 100
}
});
connection.send(JSON.stringify({"on":"db-out"}));
});