added endpoint '/midi' and updated docs
This commit is contained in:
parent
0be1f3568a
commit
a1bf1137ca
5 changed files with 79 additions and 21 deletions
14
README.md
14
README.md
|
@ -34,7 +34,7 @@ control your MODEP pedalboard(s) via http requests
|
||||||
| /pedals/`id` | get the current pedalboard's pedal by `id` | set values of current pedalboard's pedal by `id` |
|
| /pedals/`id` | get the current pedalboard's pedal by `id` | set values of current pedalboard's pedal by `id` |
|
||||||
|
|
||||||
**note:**
|
**note:**
|
||||||
to set a value for a pedal POST arguments **must** contain the parameters `id` and `value` where `id` is the id of one of the pedal's controls.
|
POST arguments **must** contain the parameters `id` and `value` where `id` is the id of one of the pedal's controls.
|
||||||
|
|
||||||
**example - turn bypass on/off:**
|
**example - turn bypass on/off:**
|
||||||
`curl localhost:3000/pedals/1`
|
`curl localhost:3000/pedals/1`
|
||||||
|
@ -49,5 +49,13 @@ in this case the pedal's bypass is turned on and has the id "8"; now let's turn
|
||||||
### bypass
|
### bypass
|
||||||
| url | GET | POST |
|
| url | GET | POST |
|
||||||
| - | - | - |
|
| - | - | - |
|
||||||
| /bypass | | toggle full bypass (switch to default pedalboard / back to last used pedalboard) |
|
| /bypass | | toggle full bypass (switch to default pedalboard / back to last used pedalboard) |
|
||||||
| /bypass/`id` | | toggle bypass of a pedal by `id` |
|
| /bypass/`id` | | toggle bypass of a pedal by `id` |
|
||||||
|
|
||||||
|
### midi
|
||||||
|
| url | GET | POST |
|
||||||
|
| - | - | - |
|
||||||
|
| /midi | | send a midi message via `oscsend` defined by the POST arguments to the osc host |
|
||||||
|
|
||||||
|
**note:**
|
||||||
|
POST arguments **must** contain the parameters `controller`, `channel` and `value` where `id`.
|
|
@ -2,6 +2,7 @@ const logger = require('./logger.js');
|
||||||
const util = require('./util.js');
|
const util = require('./util.js');
|
||||||
const constants = require('./constants.js');
|
const constants = require('./constants.js');
|
||||||
const modep = require('./modep.js');
|
const modep = require('./modep.js');
|
||||||
|
const osc = require('./osc.js');
|
||||||
const info = require('./info.js');
|
const info = require('./info.js');
|
||||||
|
|
||||||
const endpoints = new Map();
|
const endpoints = new Map();
|
||||||
|
@ -65,6 +66,11 @@ async function setupEndpoints() {
|
||||||
undefined,
|
undefined,
|
||||||
{ method: modep.toggleBypass }
|
{ method: modep.toggleBypass }
|
||||||
);
|
);
|
||||||
|
setEndpoint(
|
||||||
|
constants.API_MIDI,
|
||||||
|
undefined,
|
||||||
|
{ method: osc.sendByRequest}
|
||||||
|
)
|
||||||
logger.debug('setting up ' + endpoints.size + ' endpoints took ' + util.timeDiff(timestamp) + 'ms');
|
logger.debug('setting up ' + endpoints.size + ' endpoints took ' + util.timeDiff(timestamp) + 'ms');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@ const BANKS = '/banks';
|
||||||
const PEDALBOARDS = '/pedalboards';
|
const PEDALBOARDS = '/pedalboards';
|
||||||
const PEDALS = '/pedals';
|
const PEDALS = '/pedals';
|
||||||
const BYPASS = '/bypass';
|
const BYPASS = '/bypass';
|
||||||
|
const MIDI = '/midi';
|
||||||
|
|
||||||
exports.VARIABLE_ID = VARIABLE_ID;
|
exports.VARIABLE_ID = VARIABLE_ID;
|
||||||
|
|
||||||
|
@ -25,6 +26,7 @@ exports.API_PEDALS = PEDALS;
|
||||||
exports.API_PEDAL_BY_ID = PEDALS + '/' + VARIABLE_ID;
|
exports.API_PEDAL_BY_ID = PEDALS + '/' + VARIABLE_ID;
|
||||||
exports.API_BYPASS = BYPASS;
|
exports.API_BYPASS = BYPASS;
|
||||||
exports.API_BYPASS_BY_ID = BYPASS + '/' + VARIABLE_ID;
|
exports.API_BYPASS_BY_ID = BYPASS + '/' + VARIABLE_ID;
|
||||||
|
exports.API_MIDI = MIDI;
|
||||||
|
|
||||||
exports.CACHE_INFO = "info";
|
exports.CACHE_INFO = "info";
|
||||||
exports.CACHE_BANKS = "banks";
|
exports.CACHE_BANKS = "banks";
|
||||||
|
|
|
@ -5,6 +5,7 @@ const logger = require('./logger.js');
|
||||||
const cache = require('./cache.js');
|
const cache = require('./cache.js');
|
||||||
const commands = require('./commands.js');
|
const commands = require('./commands.js');
|
||||||
const blinky = require('./blinky.js');
|
const blinky = require('./blinky.js');
|
||||||
|
const osc = require('./osc.js');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const ttl2jsonld = require('@frogcat/ttl2jsonld').parse;
|
const ttl2jsonld = require('@frogcat/ttl2jsonld').parse;
|
||||||
|
@ -327,24 +328,8 @@ function setControlByRequest(pedalId, requestParams) {
|
||||||
async function setControl(control, value) {
|
async function setControl(control, value) {
|
||||||
if (control === undefined || control.midi === undefined) {
|
if (control === undefined || control.midi === undefined) {
|
||||||
throw new Error('control \'' + control.name + '\' with id \'' + control.id + '\' has no midi bindings');
|
throw new Error('control \'' + control.name + '\' with id \'' + control.id + '\' has no midi bindings');
|
||||||
} if (value === undefined || isNaN(value) || value < 0) {
|
|
||||||
value = 0;
|
|
||||||
} else if (value > 127) {
|
|
||||||
value = 127;
|
|
||||||
}
|
|
||||||
let cmd = 'oscsend';
|
|
||||||
let args = [
|
|
||||||
config.osc.host, config.osc.port,
|
|
||||||
config.osc.address,
|
|
||||||
'm',
|
|
||||||
'00' + util.toHex(value) + '0' + util.toHex(control.midi.controller) + 'b' + util.toHex(control.midi.channel)
|
|
||||||
];
|
|
||||||
try {
|
|
||||||
await commands.execute(cmd, args);
|
|
||||||
control.value = value;
|
|
||||||
} catch (err) {
|
|
||||||
throw new Error(err);
|
|
||||||
}
|
}
|
||||||
|
control.value = await osc.send(control.midi.controller, control.midi.channel, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
function setPedalboardById(pedalboardId) {
|
function setPedalboardById(pedalboardId) {
|
||||||
|
|
57
libs/osc.js
Normal file
57
libs/osc.js
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
const logger = require('./logger.js');
|
||||||
|
const util = require('./util.js');
|
||||||
|
const commands = require('./commands.js');
|
||||||
|
const config = require('../config.json').osc;
|
||||||
|
|
||||||
|
const CMD = 'oscsend';
|
||||||
|
|
||||||
|
async function send(controller, channel, value) {
|
||||||
|
if (controller == undefined || channel === undefined) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (value === undefined || isNaN(value) || value < 0) {
|
||||||
|
value = 0;
|
||||||
|
} else if (value > 127) {
|
||||||
|
value = 127;
|
||||||
|
}
|
||||||
|
logger.debug('sending value \'' + value + '\' to controller \'' + controller + '\' on channel \'' + channel + '\'...');
|
||||||
|
let args = [
|
||||||
|
config.host, config.port,
|
||||||
|
config.address,
|
||||||
|
'm',
|
||||||
|
'00' + util.toHex(value) + '0' + util.toHex(controller) + 'b' + util.toHex(channel)
|
||||||
|
];
|
||||||
|
try {
|
||||||
|
await commands.execute(CMD, args);
|
||||||
|
} catch (err) {
|
||||||
|
throw new Error(err);
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function sendByRequest(id, args) {
|
||||||
|
if (args === undefined) {
|
||||||
|
throw new Error('no arguments defined');
|
||||||
|
}
|
||||||
|
const controller = args.get('controller');
|
||||||
|
if (controller === undefined) {
|
||||||
|
throw new Error('missing argument \'controller\'');
|
||||||
|
}
|
||||||
|
const channel = args.get('channel');
|
||||||
|
if (channel === undefined) {
|
||||||
|
throw new Error('missing argument \'channel\'');
|
||||||
|
} let value = args.get('value');
|
||||||
|
if (value === undefined) {
|
||||||
|
throw new Error('missing argument \'value\'');
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return JSON.stringify({ status: 'ok', controller: controller, channel: channel, value: await send(controller, channel, value) });
|
||||||
|
} catch (err) {
|
||||||
|
return JSON.stringify({ status: 'error', error: err });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
send,
|
||||||
|
sendByRequest
|
||||||
|
}
|
Loading…
Reference in a new issue