Enhance FM synthesis + cleaning code architecture

This commit is contained in:
2025-10-06 13:48:14 +02:00
parent 324cf9d2ed
commit ff5add97e8
38 changed files with 893 additions and 548 deletions

View File

@@ -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 {

View File

@@ -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
View 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'

View File

@@ -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 {