diff --git a/app/index.js b/app/index.js index ca07f0b..98d9eb9 100644 --- a/app/index.js +++ b/app/index.js @@ -19,7 +19,8 @@ renderer.shadowMap.enabled = true; document.body.appendChild(renderer.domElement); var geometry = new THREE.BoxGeometry(1, 2, 1); -var material = new THREE.MeshBasicMaterial({ color: 0x00ff00 }); +var color = new THREE.Color(0x00ff00); +var material = new THREE.MeshBasicMaterial({ color: color.getHex() }); var cube = new THREE.Mesh(geometry, material); cube.castShadow = true; @@ -39,13 +40,12 @@ function onWindowResize(){ } - - var spotLight = new THREE.SpotLight(0xffffff); spotLight.castShadow = true; scene.add(spotLight); +var settleCubeScale = 1; var render = function() { requestAnimationFrame(render); @@ -53,11 +53,9 @@ var render = function() { cube.rotation.x += 0.02; cube.rotation.y += 0.03; - if (cube.scale.x > 1){ - cube.scale.x -= 0.04; - cube.scale.y -= 0.04; - cube.scale.z -= 0.04; - } + cube.scale.x -= (cube.scale.x - settleCubeScale) * .5; + cube.scale.y -= (cube.scale.y - settleCubeScale) * .5; + cube.scale.z -= (cube.scale.z - settleCubeScale) * .5; renderer.render(scene, camera); }; @@ -66,10 +64,20 @@ render(); //var colors = ['0x00ff00', '0xff0000']; -ipc.on('beat', function(){ - cube.scale.set(1.5, 1.5, 1.5); +ipc.on('oxygen:pitch', function (e, data) { + settleCubeScale = data.value/127*3 + 0.1; +}); - renderer.render(scene, camera); - //material.color = colors[0]; - //colors.push(colors.shift()); +ipc.on('oxygen:modulate', function (e, data) { + // color.g = data.value/127; + // console.log(color.g, color.getHexString()); + material.color.g = data.value/127; +}); + +ipc.on('oxygen:keydown', function (data){ + cube.scale.set(settleCubeScale * 1.5, settleCubeScale * 1.5, settleCubeScale * 1.5); +}); + +ipc.on('beat', function(){ + cube.scale.set(settleCubeScale + 1.5, settleCubeScale + 1.5, settleCubeScale + 1.5); }); diff --git a/lib/oxygen.js b/lib/oxygen.js new file mode 100644 index 0000000..823a9cf --- /dev/null +++ b/lib/oxygen.js @@ -0,0 +1,37 @@ +var midi = require('midi'); + +// Set up a new input. +var input = new midi.input(); + +input.ignoreTypes(true, false, true); + +var type = { + 191: 'controls', + 224: 'pitch', + 176: 'modulate', + 144: 'keydown', + 128: 'keyup' +}; + +var numPorts = input.getPortCount(); +var port = -1; +for (var i = 0; i < numPorts; ++i) { + if (input.getPortName(i) === 'Oxygen 25') { + port = i; + break; + } +} + +if (port > -1) { + input.openPort(port); +} + +module.exports = { + subscribe: function(handle){ + input.on('message', function(deltaTime, message){ + if (message[0] in type) { + handle('oxygen:' + type[message[0]], {key: message[1], value: message[2]}); + } + }); + } +} diff --git a/main.js b/main.js index 3b73c36..d8fcead 100644 --- a/main.js +++ b/main.js @@ -1,7 +1,11 @@ 'use strict'; -const beats = require('./lib/beats'); +const inputs = { + 'beats': require('./lib/beats'), + 'oxygen': require('./lib/oxygen') +}; + const electron = require('electron'); const app = electron.app; const BrowserWindow = electron.BrowserWindow; @@ -26,8 +30,10 @@ function createWindow () { }); // Subscribe to midi clock events - beats.subscribe(function(){ - mainWindow.webContents.send('beat'); + Object.keys(inputs).forEach(function (i) { + inputs[i].subscribe(function(message, data){ + mainWindow.webContents.send(message, data); + }); }); } diff --git a/tests/midi-input-test.js b/tests/midi-input-test.js new file mode 100644 index 0000000..cb14542 --- /dev/null +++ b/tests/midi-input-test.js @@ -0,0 +1,24 @@ +var midi = require('../node_modules/midi/'); +var input = new midi.input(); + +var deviceName = process.argv[2] + +var numPorts = input.getPortCount(); +var port = -1; +for (var i = 0; i < numPorts; ++i) { + if (input.getPortName(i) === deviceName) { + port = i; + break; + } +} + +if (port > -1) { + input.on('message', function(deltaTime, message) { + console.log(message); + }); + input.openPort(port); +} +else { + console.error('Couldn\'t find ' + deviceName + '.'); + process.exit(0); +} diff --git a/tests/midi-output-test.js b/tests/midi-output-test.js new file mode 100644 index 0000000..65d5bf6 --- /dev/null +++ b/tests/midi-output-test.js @@ -0,0 +1,14 @@ +var m = require('./node_modules/midi/'); +var output = new m.output(); +var portCount = output.getPortCount(); + +var messageInterval; + +for (var i = 0; i < portCount; ++i) { + if (output.getPortName(i) === 'Node MIDI Consumer') { + output.openPort(i); + output.sendMessage([250]); + messageInterval = setInterval(function () {output.sendMessage([248]);}, 1000); + break; + } +}