UNPKG

gibber.core.lib

Version:

small set of core objects and functions for gibber

89 lines (63 loc) 2.68 kB
// XXX Need to create automata in the AWP thread so that the evolve method can // be easily sequenced. Or is there some way to simply add a method to the AWP instance? module.exports = function( Gibber ) { const Pattern = Gibber.Pattern const numberToBinaryArray = num => { let str = Number( num ).toString( 2 ) while( str.length < 8 ) { str = '0' + str } // need to use parseFloat and round due to fpe return str.split('').map( parseFloat ).map( Math.round ) } const Automata = function( __rule=30, __axiom='00011000', evolutionSpeed=1, playbackSpeed ) { const axiom = typeof __axiom === 'string' ? __axiom : Number( __axiom ).toString( 2 ), rule = numberToBinaryArray( __rule ) let currentState = axiom.split('').map( parseFloat ).map( Math.round ), nextState = currentState.slice( 0 ), pattern = Gibber.Pattern( ...currentState ) pattern.time = playbackSpeed === undefined ? 1 / currentState.length : playbackSpeed pattern.currentState = currentState pattern.nextState = nextState pattern.output = { time: pattern.time, shouldExecute: 0 } pattern.addFilter( ( args, ptrn ) => { let val = args[ 0 ] ptrn.output.time = Gibberish.Clock.time( ptrn.time ) ptrn.output.shouldExecute = val args[ 0 ] = ptrn.output return args }) const width = currentState.length pattern.evolve = ()=> { this.currentState = this.nextState.slice( 0 ) for( let i = 0; i < width; i++ ) { let sum = '' sum += i > 0 ? this.currentState[ i - 1 ] : this.currentState[ this.currentState.length - 1 ] sum += this.currentState[ i ] sum += i < width - 1 ? this.currentState[ i + 1 ] : this.currentState[ 0 ] this.nextState[ i ] = rule[ 7 - Number( '0b'+sum ) ] } this.set( this.nextState ) } pattern.evolve = pattern.evolve.bind( pattern ) pattern.evolve.sequencers = [] pattern.evolve.seq = function( values, timings, number=0, delay=0 ) { let prevSeq = pattern.evolve.sequencers[ number ] //if( prevSeq !== undefined ) { //removeSeq( obj, prevSeq ) //} const s = Gibber.Seq({ values, timings, target:pattern, key:'evolve'}) s.start( Gibber.Clock.time( delay ) ) pattern.evolve.sequencers[ number ] = pattern.evolve[ number ] = s //pattern.__sequencers.push( s ) // return object for method chaining return pattern } //Gibber.addSequencingToMethod( pattern, 'evolve' ) //Gibber.addSequencing( pattern, 'evolve', 1 ) pattern.evolve.seq( 1, evolutionSpeed ) //Gibber.Utility.future( ()=> pattern.evolve.seq( 1, evolutionSpeed ), evolutionSpeed ) return pattern } return Automata }