gibberish-dsp
Version:
Gibberish is designed to be an optimized API for audio synthesis using per-sample techniques.
215 lines (167 loc) • 5.02 kB
JavaScript
var cm, cmconsole, exampleCode, AudioContext = AudioContext || webkitAudioContext,
isStereo = false
let environment = {}
window.onload = function() {
cm = CodeMirror( document.querySelector('#editor'), {
mode: 'javascript',
value: 'loading...',
keyMap: 'playground',
autofocus: true,
matchBrackets:true
})
cm.setSize( null, '100%' )
cmconsole = CodeMirror( document.querySelector('#main'), {
mode:'javascript',
value:
`// gibberish playground, v0.0.2
// https://github.com/gibber-cc/gibberish.js`,
readOnly:'nocursor',
})
cmconsole.setSize( null, '100%' )
Gibberish.workletPath = '../dist/gibberish_worklet.js'
Gibberish.init().then( ()=> {
Gibberish.export( window )
})
environment.editor = cm
environment.console = cmconsole
window.Environment = environment
Gibberish.oncallback = function( cb ) {
environment.console.setValue( fixCallback( cb.toString() ) )
}
let select = document.querySelector( 'select' ),
files = [
'deepnote.js',
'intro.js',
'introOld.js',
'oscillators.js',
'filtering.js',
'enveloping.js',
'fx_and_busses.js',
'sequencing.js',
'making_ugens.js',
'phasing.js',
'ssd.js',
//'solina.js',
'three03.js',
'fm.js'
]
select.onchange = function( e ) {
loadexample( files[ select.selectedIndex ] )
}
let loadexample = function( filename ) {
var req = new XMLHttpRequest()
req.open( 'GET', './examples/'+filename, true )
req.onload = function() {
var js = req.responseText
window.Environment.editor.setValue( js )
}
req.send()
}
loadexample( 'deepnote.js' )
setupSplit()
}
const setupSplit = function() {
let splitDiv = document.querySelector( '#splitbar' ),
editor = document.querySelector( '#editor' ),
sidebar = document.querySelector( '#console' ),
mousemove, mouseup
mouseup = evt => {
window.removeEventListener( 'mousemove', mousemove )
window.removeEventListener( 'mouseup', mouseup )
}
mousemove = evt => {
let splitPos = evt.clientX
editor.style.width = splitPos + 'px'
sidebar.style.left = splitPos + 'px'
sidebar.style.width = (window.innerWidth - splitPos) + 'px'
}
splitDiv.addEventListener( 'mousedown', evt => {
window.addEventListener( 'mousemove', mousemove )
window.addEventListener( 'mouseup', mouseup )
})
}
const fixCallback = function( cb ) {
const cbarr = cb.split( '\n' )
cbarr.splice(1,1)
cbarr[0] += ') {'
return cbarr.join('\n')
}
CodeMirror.keyMap.playground = {
fallthrough:'default',
'Ctrl-Enter'( cm ) {
try {
var selectedCode = getSelectionCodeColumn( cm, false )
flash( cm, selectedCode.selection )
var func = new Function( selectedCode.code )
func()
} catch (e) {
console.log( e )
return
}
Gibberish.generateCallback()
},
'Alt-Enter'( cm ) {
try {
var selectedCode = getSelectionCodeColumn( cm, true )
flash( cm, selectedCode.selection )
var func = new Function( selectedCode.code )
func()
} catch (e) {
console.log( e )
return
}
Gibberish.generateCallback()
},
'Ctrl-.'( cm ) {
Gibberish.clear()
if( dat !== undefined ) {
dat.GUI.__all__.forEach( v => v.destroy() )
dat.GUI.__all__.length = 0
}
Gibberish.generateCallback()
},
}
var getSelectionCodeColumn = function( cm, findBlock ) {
var pos = cm.getCursor(),
text = null
if( !findBlock ) {
text = cm.getDoc().getSelection()
if ( text === "") {
text = cm.getLine( pos.line )
}else{
pos = { start: cm.getCursor('start'), end: cm.getCursor('end') }
//pos = null
}
}else{
var startline = pos.line,
endline = pos.line,
pos1, pos2, sel
while ( startline > 0 && cm.getLine( startline ) !== "" ) { startline-- }
while ( endline < cm.lineCount() && cm.getLine( endline ) !== "" ) { endline++ }
pos1 = { line: startline, ch: 0 }
pos2 = { line: endline, ch: 0 }
text = cm.getRange( pos1, pos2 )
pos = { start: pos1, end: pos2 }
}
if( pos.start === undefined ) {
var lineNumber = pos.line,
start = 0,
end = text.length
pos = { start:{ line:lineNumber, ch:start }, end:{ line:lineNumber, ch: end } }
}
return { selection: pos, code: text }
}
var flash = function(cm, pos) {
var sel,
cb = function() { sel.clear() }
if (pos !== null) {
if( pos.start ) { // if called from a findBlock keymap
sel = cm.markText( pos.start, pos.end, { className:"CodeMirror-highlight" } );
}else{ // called with single line
sel = cm.markText( { line: pos.line, ch:0 }, { line: pos.line, ch:null }, { className: "CodeMirror-highlight" } )
}
}else{ // called with selected block
sel = cm.markText( cm.getCursor(true), cm.getCursor(false), { className: "CodeMirror-highlight" } );
}
window.setTimeout(cb, 250);
}