forked from mmckegg/loop-drop-app
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
103 lines (82 loc) · 2.39 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
var electron = require('electron')
var insertCss = require('insert-css')
var fs = require('fs')
var join = require('path').join
var Observ = require('observ')
var Property = require('observ-default')
var watch = require('observ/watch')
var FileObject = require('lib/file-object')
var VirtualDom = require('virtual-dom')
var MainLoop = require('main-loop')
var noDrop = require('lib/no-drop')
var applyKeyboardTempo = require('lib/keyboard-tempo')
var renderNode = require('lib/render-node')
var MidiStream = require('web-midi')
var PeriodicWaves = require('lib/periodic-waves')
// apply css styles
insertCss(require('./styles'))
electron.webFrame.setZoomLevelLimits(1, 1)
// midi ports
var midiPorts = Observ()
midiPorts.open = MidiStream
midiPorts.openInput = MidiStream.openInput
midiPorts.openOutput = MidiStream.openOutput
MidiStream.watchPortNames(function (ports) {
midiPorts.set(ports)
})
// create root context
var audioContext = new global.AudioContext()
var nodes = require('./nodes')
var rootContext = window.rootContext = {
fs: fs,
audio: audioContext,
periodicWaves: PeriodicWaves(audioContext),
midiPorts: midiPorts,
nodes: nodes.objectLookup,
nodeInfo: nodes,
zoom: Property(1.1)
}
watch(rootContext.zoom, function (value) {
electron.webFrame.setZoomFactor(value || 1)
})
noDrop(document)
require('lib/context-menu')
document.addEventListener('DOMContentLoaded', function (event) {
electron.ipcRenderer.send('loaded')
})
electron.ipcRenderer.on('load-project', function (e, path) {
// load project and initialize view
var projectPath = join(path, 'project.json')
var projectFile = FileObject(rootContext)
projectFile.onLoad(function () {
document.body.appendChild(createRootElement(projectFile.node))
window.currentProject = projectFile.node
})
ensureProject(projectPath, function (err) {
if (err) throw err
projectFile.load(projectPath)
})
})
function createRootElement (project) {
var renderer = MainLoop(project, renderNode, VirtualDom)
project(update)
project.resolved(update)
applyKeyboardTempo(project)
return renderer.target
// scoped
function update () {
// render!
renderer.update(project)
}
}
function ensureProject (path, cb) {
rootContext.fs.exists(path, function (exists) {
if (exists) {
cb()
} else {
rootContext.fs.writeFile(path, JSON.stringify({
node: 'project'
}), cb)
}
})
}