just cleaning stuff and preparing for tomorrow
This commit is contained in:
101
src/API.ts
101
src/API.ts
@ -1,8 +1,6 @@
|
||||
import { Editor } from "./main";
|
||||
import { tryEvaluate } from "./Evaluator";
|
||||
import { BasicSynth, PercussionSynth } from "./WebSynth";
|
||||
import { MidiConnection } from "./IO/MidiConnection";
|
||||
import * as Tone from 'tone';
|
||||
// @ts-ignore
|
||||
import { ZZFX, zzfx } from "zzfx";
|
||||
|
||||
@ -11,14 +9,42 @@ export class UserAPI {
|
||||
variables: { [key: string]: any } = {}
|
||||
MidiConnection: MidiConnection = new MidiConnection()
|
||||
|
||||
constructor(public app: Editor) {
|
||||
}
|
||||
constructor(public app: Editor) { }
|
||||
|
||||
// =============================================================
|
||||
// Utility functions
|
||||
// =============================================================
|
||||
|
||||
log = console.log
|
||||
|
||||
rate(rate: number): void {
|
||||
// TODO: Implement this. This function should change the rate at which the global script
|
||||
// is evaluated. This is useful for slowing down the script, or speeding it up. The default
|
||||
// would be 1.0, which is the current rate (very speedy).
|
||||
}
|
||||
r = this.rate
|
||||
|
||||
script(...args: number[]): void {
|
||||
args.forEach(arg => { tryEvaluate(this.app, this.app.universes[
|
||||
this.app.selected_universe].locals[arg]) })
|
||||
}
|
||||
s = this.script
|
||||
|
||||
clearscript(script: number): void {
|
||||
this.app.universes[this.app.selected_universe].locals[script] = {
|
||||
candidate: '', committed: '', evaluations: 0
|
||||
}
|
||||
}
|
||||
cs = this.clearscript
|
||||
|
||||
copyscript(from: number, to: number): void {
|
||||
// Copy a script to another script
|
||||
this.app.universes[this.app.selected_universe].locals[to] =
|
||||
this.app.universes[this.app.selected_universe].locals[from]
|
||||
}
|
||||
cps = this.copyscript
|
||||
|
||||
|
||||
// =============================================================
|
||||
// MIDI related functions
|
||||
// =============================================================
|
||||
@ -57,12 +83,11 @@ export class UserAPI {
|
||||
this.MidiConnection.panic()
|
||||
}
|
||||
|
||||
|
||||
// =============================================================
|
||||
// Variable related functions
|
||||
// =============================================================
|
||||
|
||||
public v(a: number | string, b?: any): any {
|
||||
public variable(a: number | string, b?: any): any {
|
||||
if (typeof a === 'string' && b === undefined) {
|
||||
return this.variables[a]
|
||||
} else {
|
||||
@ -70,21 +95,23 @@ export class UserAPI {
|
||||
return this.variables[a]
|
||||
}
|
||||
}
|
||||
v = this.variable
|
||||
|
||||
public dv(name: string): void {
|
||||
public delete_variable(name: string): void {
|
||||
delete this.variables[name]
|
||||
}
|
||||
dv = this.delete_variable
|
||||
|
||||
public cv(): void {
|
||||
public clear_variables(): void {
|
||||
this.variables = {}
|
||||
}
|
||||
cv = this.clear_variables
|
||||
|
||||
// =============================================================
|
||||
// Small algorithmic functions
|
||||
// =============================================================
|
||||
|
||||
pick<T>(...array: T[]): T { return array[Math.floor(Math.random() * array.length)] }
|
||||
|
||||
seqbeat<T>(...array: T[]): T { return array[this.app.clock.time_position.beat % array.length] }
|
||||
seqbar<T>(...array: T[]): T { return array[this.app.clock.time_position.bar % array.length] }
|
||||
seqpulse<T>(...array: T[]): T { return array[this.app.clock.time_position.pulse % array.length] }
|
||||
@ -101,11 +128,7 @@ export class UserAPI {
|
||||
// Quantification functions
|
||||
// =============================================================
|
||||
|
||||
quantize(value: number, quantization: number[]): number {
|
||||
// Takes a value, and a quantization array, and returns the closest value in the quantization array
|
||||
// Example: quantize(0.7, [0, 0.5, 1]) => 0.5
|
||||
// If the quantization array is empty, return the value
|
||||
|
||||
public quantize(value: number, quantization: number[]): number {
|
||||
if (quantization.length === 0) { return value }
|
||||
let closest = quantization[0]
|
||||
quantization.forEach(q => {
|
||||
@ -113,20 +136,22 @@ export class UserAPI {
|
||||
})
|
||||
return closest
|
||||
}
|
||||
quant = this.quantize
|
||||
|
||||
clamp(value: number, min: number, max: number): number {
|
||||
public clamp(value: number, min: number, max: number): number {
|
||||
return Math.min(Math.max(value, min), max)
|
||||
}
|
||||
cmp = this.clamp
|
||||
|
||||
// =============================================================
|
||||
// Time functions
|
||||
// Transport functions
|
||||
// =============================================================
|
||||
|
||||
bpm(bpm: number) {
|
||||
bpm(bpm: number):void {
|
||||
this.app.clock.bpm = bpm
|
||||
}
|
||||
|
||||
time_signature(numerator: number, denominator: number) {
|
||||
time_signature(numerator: number, denominator: number):void {
|
||||
this.app.clock.time_signature = [ numerator, denominator ]
|
||||
}
|
||||
|
||||
@ -134,13 +159,13 @@ export class UserAPI {
|
||||
// Probability functions
|
||||
// =============================================================
|
||||
|
||||
almostNever() { return Math.random() > 0.9 }
|
||||
sometimes() { return Math.random() > 0.5 }
|
||||
rarely() { return Math.random() > 0.75 }
|
||||
often() { return Math.random() > 0.25 }
|
||||
almostAlways() { return Math.random() > 0.1 }
|
||||
randInt(min: number, max: number) { return Math.floor(Math.random() * (max - min + 1)) + min }
|
||||
dice(sides: number) { return Math.floor(Math.random() * sides) + 1 }
|
||||
public almostNever() { return Math.random() > 0.9 }
|
||||
public sometimes() { return Math.random() > 0.5 }
|
||||
public rarely() { return Math.random() > 0.75 }
|
||||
public often() { return Math.random() > 0.25 }
|
||||
public almostAlways() { return Math.random() > 0.1 }
|
||||
public randInt(min: number, max: number) { return Math.floor(Math.random() * (max - min + 1)) + min }
|
||||
public dice(sides: number) { return Math.floor(Math.random() * sides) + 1 }
|
||||
|
||||
// =============================================================
|
||||
// Iterator functions (for loops, with evaluation count, etc...)
|
||||
@ -156,19 +181,10 @@ export class UserAPI {
|
||||
get e7() { return this.app.universes[this.app.selected_universe].locals[6].evaluations }
|
||||
get e8() { return this.app.universes[this.app.selected_universe].locals[7].evaluations }
|
||||
get e9() { return this.app.universes[this.app.selected_universe].locals[8].evaluations }
|
||||
e(index:number) { return this.app.universes[this.app.selected_universe].locals[index].evaluations }
|
||||
|
||||
|
||||
// Script launcher: can launch any number of scripts
|
||||
script(...args: number[]): void {
|
||||
args.forEach(arg => { tryEvaluate(this.app, this.app.universes[this.app.selected_universe].locals[arg]) })
|
||||
}
|
||||
s = this.script
|
||||
|
||||
// Small ZZFX interface for playing with this synth
|
||||
zzfx(...thing: number[]) {
|
||||
zzfx(...thing);
|
||||
public evaluations_number(index:number): number {
|
||||
return this.app.universes[this.app.selected_universe].locals[index].evaluations
|
||||
}
|
||||
e = this.evaluations_number
|
||||
|
||||
// =============================================================
|
||||
// Time markers
|
||||
@ -177,6 +193,7 @@ export class UserAPI {
|
||||
get bar(): number { return this.app.clock.time_position.bar }
|
||||
get pulse(): number { return this.app.clock.time_position.pulse }
|
||||
get beat(): number { return this.app.clock.time_position.beat }
|
||||
get beats_since_origin(): number { return this.app.clock.beats_since_origin }
|
||||
|
||||
onbeat(...beat: number[]): boolean {
|
||||
return (
|
||||
@ -193,4 +210,12 @@ export class UserAPI {
|
||||
|
||||
return pulse.some(p => this.app.clock.time_position.pulse % p === 0)
|
||||
}
|
||||
}
|
||||
|
||||
// =============================================================
|
||||
// Trivial functions
|
||||
// =============================================================
|
||||
|
||||
// Small ZZFX interface for playing with this synth
|
||||
zzfx = (...thing: number[]) => zzfx(...thing);
|
||||
|
||||
}
|
||||
|
||||
@ -36,7 +36,7 @@ export class Clock {
|
||||
})
|
||||
}
|
||||
|
||||
get pulses_per_beat(): number { return this.ppqn / this.time_signature[1]; }
|
||||
get beats_per_bar(): number { return this.time_signature[0]; }
|
||||
|
||||
start(): void {
|
||||
// Check if the clock is already running
|
||||
|
||||
Reference in New Issue
Block a user