observ-midi
Version:
Observe and write to midi stream as a single value, struct, array or grid.
278 lines (212 loc) • 4.84 kB
JavaScript
var Through = require('through')
var test = require('tape')
var ObservMidi = require('../')
var ArrayGrid = require('array-grid')
test('value', function(t){
var output = []
var duplexPort = Through(function(data){
output.push(data)
})
var obs = ObservMidi(duplexPort, '144/0')
var changes = []
obs(function(value){
changes.push(value)
})
duplexPort.queue([144, 0, 100])
duplexPort.queue([144, 0, 70])
duplexPort.queue([144, 0, 0])
obs.output.set([0, 127]) // value stack: top most outputted
obs.output.set(50)
obs.output.set(50)
obs.output.set(0)
t.same(output, [
[144, 0, 127],
[144, 0, 50],
[144, 0, 0]
])
t.same(changes, [
100, 70, 0
])
t.end()
})
test('value - 2 value midi', function(t){
var output = []
var duplexPort = Through(function(data){
output.push(data)
})
var obs = ObservMidi(duplexPort, '123')
var changes = []
obs(function(value){
changes.push(value)
})
duplexPort.queue([123, 100, undefined])
duplexPort.queue([123, 70, undefined])
duplexPort.queue([123, 0, undefined])
obs.output.set([0, 127]) // value stack: top most outputted
obs.output.set(50)
obs.output.set(50)
obs.output.set(0)
t.same(output, [
[123, 127],
[123, 50],
[123, 0]
])
t.same(changes, [
100, 70, 0
])
t.end()
})
test('value - 1 value midi', function(t){
var output = []
var duplexPort = Through(function(data){
output.push(data)
})
var obs = ObservMidi(duplexPort, '123')
var changes = []
obs(function(value){
changes.push(value)
})
duplexPort.queue([123, undefined, undefined])
t.same(changes, [
undefined
])
t.end()
})
test('varhash', function(t){
var output = []
var duplexPort = Through(function(data){
output.push(data)
})
var obs = ObservMidi(duplexPort)
var changes = []
obs(function(value){
changes.push(value)
})
duplexPort.queue([144, 0, 100])
duplexPort.queue([144, 1, 70])
duplexPort.queue([144, 2, 40])
obs.output.put('144/0', 127)
obs.output.put('144/1', 100)
t.same(output, [
[144, 0, 127],
[144, 1, 100]
])
t.same(changes, [
{'144/0': 100},
{'144/0': 100, '144/1': 70},
{'144/0': 100, '144/1': 70, '144/2': 40}
])
t.end()
})
test('struct', function(t){
var output = []
var duplexPort = Through(function(data){
output.push(data)
})
var obs = ObservMidi(duplexPort, {
'a': '144/0',
'b': '144/1',
'c': '144/2'
})
var changes = []
obs(function(value){
changes.push(value)
})
duplexPort.queue([144, 0, 100])
duplexPort.queue([144, 1, 70])
duplexPort.queue([144, 2, 40])
obs.a.output.set(127)
obs.b.output.set(100)
obs.c.output.set(90)
t.same(output, [
[144, 0, 127],
[144, 1, 100],
[144, 2, 90]
])
t.same(changes, [
{'a': 100, 'b': null, 'c': null},
{'a': 100, 'b': 70, 'c': null},
{'a': 100, 'b': 70, 'c': 40}
])
t.end()
})
test('array', function(t){
var output = []
var duplexPort = Through(function(data){
output.push(data)
})
var obs = ObservMidi(duplexPort, ['144/0', '144/1', '144/2'])
var changes = []
obs(function(value){
changes.push(value)
})
duplexPort.queue([144, 0, 100])
duplexPort.queue([144, 1, 70])
duplexPort.queue([144, 2, 40])
obs.output.put(0, 127)
obs.output.put(1, 100)
obs.output.put(2, 90)
t.same(output, [
[144, 0, 127],
[144, 1, 100],
[144, 2, 90]
])
t.same(changes, [
[100],
[100, 70],
[100, 70, 40]
])
t.end()
})
test('grid', function(t){
var output = []
var duplexPort = Through(function(data){
output.push(data)
})
var mapping = ArrayGrid(['144/0', '144/1', '144/2', '144/3'], [2,2])
var obs = ObservMidi(duplexPort, mapping)
var changes = []
obs(function(value){
changes.push(value)
})
duplexPort.queue([144, 0, 100])
duplexPort.queue([144, 1, 70])
duplexPort.queue([144, 2, 40])
duplexPort.queue([144, 3, 30])
var newOutput = ArrayGrid([], [2,2])
newOutput.set(0,0, 127)
newOutput.set(0,1, 100)
newOutput.set(1,0, 90)
newOutput.set(1,1, 20)
obs.output.set(newOutput)
t.same(output, [
[144, 0, 127],
[144, 1, 100],
[144, 2, 90],
[144, 3, 20]
])
t.equal(changes.length, 4)
t.equal(obs().get(0,0), 100)
t.equal(obs().get(0,1), 70)
t.equal(obs().get(1,0), 40)
t.equal(obs().get(1,1), 30)
// SWITCH
changes = []
output = []
duplexPort.emit('switch')
t.equal(changes.length, 1)
//t.same(changes[0]._diff, [
// [ 0, 0, null ], [ 0, 1, null ], [ 1, 0, null ], [ 1, 1, null ]
//])
t.notOk(obs().get(0,0))
t.notOk(obs().get(0,1))
t.notOk(obs().get(1,0))
t.notOk(obs().get(1,1))
t.same(output, [
[144, 0, 127],
[144, 1, 100],
[144, 2, 90],
[144, 3, 20]
])
t.end()
})