Enhance FM synthesis + cleaning code architecture
This commit is contained in:
@@ -1,11 +1,16 @@
|
||||
import type { TileState } from '../types/tiles'
|
||||
import { getDefaultEngineValues, getDefaultEffectValues } from '../config/effects'
|
||||
import { getDefaultEngineValues, getDefaultEffectValues } from '../config/parameters'
|
||||
import { getDefaultLFOValues } from '../stores/settings'
|
||||
|
||||
export interface FMPatchConfig {
|
||||
algorithm: number
|
||||
feedback: number
|
||||
lfoRates: [number, number, number, number]
|
||||
pitchLFO: {
|
||||
waveform: number
|
||||
depth: number
|
||||
baseRate: number
|
||||
}
|
||||
}
|
||||
|
||||
export function generateRandomFMPatch(complexity: number = 1): FMPatchConfig {
|
||||
@@ -32,7 +37,13 @@ export function generateRandomFMPatch(complexity: number = 1): FMPatchConfig {
|
||||
0.25 + Math.random() * 0.9
|
||||
]
|
||||
|
||||
return { algorithm, feedback, lfoRates }
|
||||
const pitchLFO = {
|
||||
waveform: Math.floor(Math.random() * 4),
|
||||
depth: Math.random() < 0.4 ? 0.03 + Math.random() * 0.22 : 0,
|
||||
baseRate: 0.1 + Math.random() * 9.9
|
||||
}
|
||||
|
||||
return { algorithm, feedback, lfoRates, pitchLFO }
|
||||
}
|
||||
|
||||
export function createFMTileState(patch: FMPatchConfig): TileState {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { SAMPLE_RATES } from '../config/effects'
|
||||
import { SAMPLE_RATES } from '../config/parameters'
|
||||
import { getAlgorithmName } from '../config/fmAlgorithms'
|
||||
|
||||
export function getComplexityLabel(index: number): string {
|
||||
|
||||
8
src/utils/index.ts
Normal file
8
src/utils/index.ts
Normal file
@@ -0,0 +1,8 @@
|
||||
export { generateTileGrid, generateRandomFormula } from './bytebeatFormulas'
|
||||
export { generateFMTileGrid, generateRandomFMPatch, createFMTileState, parseFMPatch } from './fmPatches'
|
||||
export { createTileState, createTileStateFromCurrent, loadTileParams, saveTileParams, cloneTileState, randomizeTileParams } from './tileState'
|
||||
export { getTileId, getTileFromGrid, isCustomTileFocused, isTileFocused } from './tileHelpers'
|
||||
export { generateWaveformData, drawWaveform } from './waveformGenerator'
|
||||
export { generateFMWaveformData } from './fmWaveformGenerator'
|
||||
export { getComplexityLabel, getBitDepthLabel, getSampleRateLabel, getAlgorithmLabel } from './formatters'
|
||||
export type { FocusedTile } from './tileHelpers'
|
||||
@@ -1,7 +1,8 @@
|
||||
import type { TileState } from '../types/tiles'
|
||||
import { engineSettings, effectSettings, lfoSettings, getDefaultLFOValues } from '../stores/settings'
|
||||
import { getDefaultEngineValues, getDefaultEffectValues, ENGINE_CONTROLS, EFFECTS } from '../config/effects'
|
||||
import { getDefaultLFOValues } from '../stores/settings'
|
||||
import { getDefaultEngineValues, getDefaultEffectValues, ENGINE_CONTROLS, EFFECTS } from '../config/parameters'
|
||||
import type { LFOSettings } from '../stores/settings'
|
||||
import { parameterManager } from '../services/ParameterManager'
|
||||
|
||||
export function createTileState(
|
||||
formula: string,
|
||||
@@ -20,35 +21,18 @@ export function createTileState(
|
||||
export function createTileStateFromCurrent(formula: string): TileState {
|
||||
return {
|
||||
formula,
|
||||
engineParams: { ...engineSettings.get() },
|
||||
effectParams: { ...effectSettings.get() },
|
||||
lfoConfigs: JSON.parse(JSON.stringify(lfoSettings.get()))
|
||||
engineParams: { ...parameterManager.getEngineParams() },
|
||||
effectParams: { ...parameterManager.getEffectParams() },
|
||||
lfoConfigs: JSON.parse(JSON.stringify(parameterManager.getLFOConfigs()))
|
||||
}
|
||||
}
|
||||
|
||||
export function loadTileParams(tile: TileState): void {
|
||||
Object.entries(tile.engineParams).forEach(([key, value]) => {
|
||||
engineSettings.setKey(key as keyof ReturnType<typeof getDefaultEngineValues>, value)
|
||||
})
|
||||
|
||||
Object.entries(tile.effectParams).forEach(([key, value]) => {
|
||||
effectSettings.setKey(key as never, value as never)
|
||||
})
|
||||
|
||||
if (tile.lfoConfigs) {
|
||||
Object.entries(tile.lfoConfigs).forEach(([key, value]) => {
|
||||
lfoSettings.setKey(key as keyof LFOSettings, value)
|
||||
})
|
||||
}
|
||||
parameterManager.loadTileParams(tile)
|
||||
}
|
||||
|
||||
export function saveTileParams(tile: TileState): TileState {
|
||||
return {
|
||||
...tile,
|
||||
engineParams: { ...engineSettings.get() },
|
||||
effectParams: { ...effectSettings.get() },
|
||||
lfoConfigs: JSON.parse(JSON.stringify(lfoSettings.get()))
|
||||
}
|
||||
return parameterManager.saveTileParams(tile)
|
||||
}
|
||||
|
||||
export function cloneTileState(tile: TileState): TileState {
|
||||
|
||||
Reference in New Issue
Block a user