playlist-data-engine 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +352 -0
- package/dist/__vite-browser-external-DYxpcVy9.js +4 -0
- package/dist/constants/DefaultClasses.d.ts +46 -0
- package/dist/constants/DefaultClasses.d.ts.map +1 -0
- package/dist/constants/DefaultEnchantments.d.ts +337 -0
- package/dist/constants/DefaultEnchantments.d.ts.map +1 -0
- package/dist/constants/DefaultEnemies.d.ts +83 -0
- package/dist/constants/DefaultEnemies.d.ts.map +1 -0
- package/dist/constants/DefaultEquipment.d.ts +23 -0
- package/dist/constants/DefaultEquipment.d.ts.map +1 -0
- package/dist/constants/DefaultFeatures.d.ts +22 -0
- package/dist/constants/DefaultFeatures.d.ts.map +1 -0
- package/dist/constants/DefaultRaces.d.ts +102 -0
- package/dist/constants/DefaultRaces.d.ts.map +1 -0
- package/dist/constants/DefaultSkills.d.ts +26 -0
- package/dist/constants/DefaultSkills.d.ts.map +1 -0
- package/dist/constants/DefaultSpells.d.ts +41 -0
- package/dist/constants/DefaultSpells.d.ts.map +1 -0
- package/dist/constants/EncounterBalance.d.ts +208 -0
- package/dist/constants/EncounterBalance.d.ts.map +1 -0
- package/dist/constants/EnemyEquipment.d.ts +71 -0
- package/dist/constants/EnemyEquipment.d.ts.map +1 -0
- package/dist/constants/EnemyRarity.d.ts +79 -0
- package/dist/constants/EnemyRarity.d.ts.map +1 -0
- package/dist/constants/EnemyTemplates/Construct.d.ts +63 -0
- package/dist/constants/EnemyTemplates/Construct.d.ts.map +1 -0
- package/dist/constants/EnemyTemplates/Dragon.d.ts +68 -0
- package/dist/constants/EnemyTemplates/Dragon.d.ts.map +1 -0
- package/dist/constants/EnemyTemplates/Elemental.d.ts +64 -0
- package/dist/constants/EnemyTemplates/Elemental.d.ts.map +1 -0
- package/dist/constants/EnemyTemplates/Fiend.d.ts +62 -0
- package/dist/constants/EnemyTemplates/Fiend.d.ts.map +1 -0
- package/dist/constants/EnemyTemplates/Monstrosity.d.ts +63 -0
- package/dist/constants/EnemyTemplates/Monstrosity.d.ts.map +1 -0
- package/dist/constants/EnemyTemplates/Undead.d.ts +61 -0
- package/dist/constants/EnemyTemplates/Undead.d.ts.map +1 -0
- package/dist/constants/ItemTemplates.d.ts +40 -0
- package/dist/constants/ItemTemplates.d.ts.map +1 -0
- package/dist/constants/MagicItems.d.ts +30 -0
- package/dist/constants/MagicItems.d.ts.map +1 -0
- package/dist/constants/SpellSlots.d.ts +30 -0
- package/dist/constants/SpellSlots.d.ts.map +1 -0
- package/dist/constants/StatScaling.d.ts +113 -0
- package/dist/constants/StatScaling.d.ts.map +1 -0
- package/dist/core/analysis/AudioAnalyzer.d.ts +599 -0
- package/dist/core/analysis/AudioAnalyzer.d.ts.map +1 -0
- package/dist/core/analysis/ColorExtractor.d.ts +64 -0
- package/dist/core/analysis/ColorExtractor.d.ts.map +1 -0
- package/dist/core/analysis/EssentiaPitchDetector.d.ts +282 -0
- package/dist/core/analysis/EssentiaPitchDetector.d.ts.map +1 -0
- package/dist/core/analysis/LevelSerializer.d.ts +265 -0
- package/dist/core/analysis/LevelSerializer.d.ts.map +1 -0
- package/dist/core/analysis/MelodyContourAnalyzer.d.ts +283 -0
- package/dist/core/analysis/MelodyContourAnalyzer.d.ts.map +1 -0
- package/dist/core/analysis/MultiBandAnalyzer.d.ts +214 -0
- package/dist/core/analysis/MultiBandAnalyzer.d.ts.map +1 -0
- package/dist/core/analysis/MusicClassifier.d.ts +524 -0
- package/dist/core/analysis/MusicClassifier.d.ts.map +1 -0
- package/dist/core/analysis/PitchAnalyzer.d.ts +266 -0
- package/dist/core/analysis/PitchAnalyzer.d.ts.map +1 -0
- package/dist/core/analysis/PitchDetector.d.ts +251 -0
- package/dist/core/analysis/PitchDetector.d.ts.map +1 -0
- package/dist/core/analysis/SpectrumScanner.d.ts +52 -0
- package/dist/core/analysis/SpectrumScanner.d.ts.map +1 -0
- package/dist/core/analysis/beat/BeatInterpolator.d.ts +477 -0
- package/dist/core/analysis/beat/BeatInterpolator.d.ts.map +1 -0
- package/dist/core/analysis/beat/BeatMapGenerator.d.ts +170 -0
- package/dist/core/analysis/beat/BeatMapGenerator.d.ts.map +1 -0
- package/dist/core/analysis/beat/BeatStream.d.ts +316 -0
- package/dist/core/analysis/beat/BeatStream.d.ts.map +1 -0
- package/dist/core/analysis/beat/BeatSubdivider.d.ts +205 -0
- package/dist/core/analysis/beat/BeatSubdivider.d.ts.map +1 -0
- package/dist/core/analysis/beat/BeatTracker.d.ts +137 -0
- package/dist/core/analysis/beat/BeatTracker.d.ts.map +1 -0
- package/dist/core/analysis/beat/CompositeStreamGenerator.d.ts +180 -0
- package/dist/core/analysis/beat/CompositeStreamGenerator.d.ts.map +1 -0
- package/dist/core/analysis/beat/DensityAnalyzer.d.ts +246 -0
- package/dist/core/analysis/beat/DensityAnalyzer.d.ts.map +1 -0
- package/dist/core/analysis/beat/DifficultyVariantGenerator.d.ts +1082 -0
- package/dist/core/analysis/beat/DifficultyVariantGenerator.d.ts.map +1 -0
- package/dist/core/analysis/beat/GrooveAnalyzer.d.ts +192 -0
- package/dist/core/analysis/beat/GrooveAnalyzer.d.ts.map +1 -0
- package/dist/core/analysis/beat/OnsetStrengthEnvelope.d.ts +133 -0
- package/dist/core/analysis/beat/OnsetStrengthEnvelope.d.ts.map +1 -0
- package/dist/core/analysis/beat/PhraseAnalyzer.d.ts +230 -0
- package/dist/core/analysis/beat/PhraseAnalyzer.d.ts.map +1 -0
- package/dist/core/analysis/beat/RhythmQuantizer.d.ts +399 -0
- package/dist/core/analysis/beat/RhythmQuantizer.d.ts.map +1 -0
- package/dist/core/analysis/beat/RhythmicBalancer.d.ts +262 -0
- package/dist/core/analysis/beat/RhythmicBalancer.d.ts.map +1 -0
- package/dist/core/analysis/beat/StreamScorer.d.ts +275 -0
- package/dist/core/analysis/beat/StreamScorer.d.ts.map +1 -0
- package/dist/core/analysis/beat/TempoAwareQuantizer.d.ts +256 -0
- package/dist/core/analysis/beat/TempoAwareQuantizer.d.ts.map +1 -0
- package/dist/core/analysis/beat/TempoDetector.d.ts +220 -0
- package/dist/core/analysis/beat/TempoDetector.d.ts.map +1 -0
- package/dist/core/analysis/beat/TransientDetector.d.ts +303 -0
- package/dist/core/analysis/beat/TransientDetector.d.ts.map +1 -0
- package/dist/core/analysis/beat/beatKeyHelpers.d.ts +180 -0
- package/dist/core/analysis/beat/beatKeyHelpers.d.ts.map +1 -0
- package/dist/core/analysis/beat/index.d.ts +41 -0
- package/dist/core/analysis/beat/index.d.ts.map +1 -0
- package/dist/core/analysis/beat/utils/audioUtils.d.ts +204 -0
- package/dist/core/analysis/beat/utils/audioUtils.d.ts.map +1 -0
- package/dist/core/analysis/beat/utils/beatInterpolationDebug.d.ts +404 -0
- package/dist/core/analysis/beat/utils/beatInterpolationDebug.d.ts.map +1 -0
- package/dist/core/analysis/beat/utils/subdivideBeatMap.d.ts +61 -0
- package/dist/core/analysis/beat/utils/subdivideBeatMap.d.ts.map +1 -0
- package/dist/core/analysis/beat/utils/unifyBeatMap.d.ts +33 -0
- package/dist/core/analysis/beat/utils/unifyBeatMap.d.ts.map +1 -0
- package/dist/core/analysis/index.d.ts +18 -0
- package/dist/core/analysis/index.d.ts.map +1 -0
- package/dist/core/combat/AI/AICombatRunner.d.ts +108 -0
- package/dist/core/combat/AI/AICombatRunner.d.ts.map +1 -0
- package/dist/core/combat/AI/CombatAI.d.ts +179 -0
- package/dist/core/combat/AI/CombatAI.d.ts.map +1 -0
- package/dist/core/combat/AI/CombatMetricsTracker.d.ts +30 -0
- package/dist/core/combat/AI/CombatMetricsTracker.d.ts.map +1 -0
- package/dist/core/combat/Analysis/BalanceValidator.d.ts +170 -0
- package/dist/core/combat/Analysis/BalanceValidator.d.ts.map +1 -0
- package/dist/core/combat/Analysis/ComparativeAnalyzer.d.ts +231 -0
- package/dist/core/combat/Analysis/ComparativeAnalyzer.d.ts.map +1 -0
- package/dist/core/combat/Analysis/DifficultyCalculator.d.ts +203 -0
- package/dist/core/combat/Analysis/DifficultyCalculator.d.ts.map +1 -0
- package/dist/core/combat/Analysis/ParameterSweep.d.ts +201 -0
- package/dist/core/combat/Analysis/ParameterSweep.d.ts.map +1 -0
- package/dist/core/combat/AttackResolver.d.ts +220 -0
- package/dist/core/combat/AttackResolver.d.ts.map +1 -0
- package/dist/core/combat/CombatEngine.d.ts +388 -0
- package/dist/core/combat/CombatEngine.d.ts.map +1 -0
- package/dist/core/combat/DiceRoller.d.ts +115 -0
- package/dist/core/combat/DiceRoller.d.ts.map +1 -0
- package/dist/core/combat/InitiativeRoller.d.ts +62 -0
- package/dist/core/combat/InitiativeRoller.d.ts.map +1 -0
- package/dist/core/combat/PartyAnalyzer.d.ts +215 -0
- package/dist/core/combat/PartyAnalyzer.d.ts.map +1 -0
- package/dist/core/combat/SeededDiceRoller.d.ts +120 -0
- package/dist/core/combat/SeededDiceRoller.d.ts.map +1 -0
- package/dist/core/combat/Simulation/CombatSimulator.d.ts +366 -0
- package/dist/core/combat/Simulation/CombatSimulator.d.ts.map +1 -0
- package/dist/core/combat/SpellCaster.d.ts +113 -0
- package/dist/core/combat/SpellCaster.d.ts.map +1 -0
- package/dist/core/config/index.d.ts +24 -0
- package/dist/core/config/index.d.ts.map +1 -0
- package/dist/core/config/progressionConfig.d.ts +73 -0
- package/dist/core/config/progressionConfig.d.ts.map +1 -0
- package/dist/core/config/sensorConfig.d.ts +134 -0
- package/dist/core/config/sensorConfig.d.ts.map +1 -0
- package/dist/core/equipment/BoxOpener.d.ts +175 -0
- package/dist/core/equipment/BoxOpener.d.ts.map +1 -0
- package/dist/core/equipment/EquipmentEffectApplier.d.ts +189 -0
- package/dist/core/equipment/EquipmentEffectApplier.d.ts.map +1 -0
- package/dist/core/equipment/EquipmentModifier.d.ts +327 -0
- package/dist/core/equipment/EquipmentModifier.d.ts.map +1 -0
- package/dist/core/equipment/EquipmentSpawnHelper.d.ts +246 -0
- package/dist/core/equipment/EquipmentSpawnHelper.d.ts.map +1 -0
- package/dist/core/equipment/EquipmentValidator.d.ts +173 -0
- package/dist/core/equipment/EquipmentValidator.d.ts.map +1 -0
- package/dist/core/extensions/ExtensionManager.d.ts +517 -0
- package/dist/core/extensions/ExtensionManager.d.ts.map +1 -0
- package/dist/core/extensions/WeightedSelector.d.ts +156 -0
- package/dist/core/extensions/WeightedSelector.d.ts.map +1 -0
- package/dist/core/extensions/index.d.ts +11 -0
- package/dist/core/extensions/index.d.ts.map +1 -0
- package/dist/core/extensions/initializeDefaults.d.ts +170 -0
- package/dist/core/extensions/initializeDefaults.d.ts.map +1 -0
- package/dist/core/features/FeatureEffectApplier.d.ts +102 -0
- package/dist/core/features/FeatureEffectApplier.d.ts.map +1 -0
- package/dist/core/features/FeatureQuery.d.ts +368 -0
- package/dist/core/features/FeatureQuery.d.ts.map +1 -0
- package/dist/core/features/FeatureTypes.d.ts +199 -0
- package/dist/core/features/FeatureTypes.d.ts.map +1 -0
- package/dist/core/features/FeatureValidator.d.ts +149 -0
- package/dist/core/features/FeatureValidator.d.ts.map +1 -0
- package/dist/core/features/index.d.ts +12 -0
- package/dist/core/features/index.d.ts.map +1 -0
- package/dist/core/generation/AbilityScoreCalculator.d.ts +83 -0
- package/dist/core/generation/AbilityScoreCalculator.d.ts.map +1 -0
- package/dist/core/generation/AppearanceGenerator.d.ts +32 -0
- package/dist/core/generation/AppearanceGenerator.d.ts.map +1 -0
- package/dist/core/generation/BeatConverter.d.ts +127 -0
- package/dist/core/generation/BeatConverter.d.ts.map +1 -0
- package/dist/core/generation/ButtonMapper.d.ts +346 -0
- package/dist/core/generation/ButtonMapper.d.ts.map +1 -0
- package/dist/core/generation/ButtonPatternLibrary.d.ts +92 -0
- package/dist/core/generation/ButtonPatternLibrary.d.ts.map +1 -0
- package/dist/core/generation/CRLevelConverter.d.ts +242 -0
- package/dist/core/generation/CRLevelConverter.d.ts.map +1 -0
- package/dist/core/generation/CharacterGenerator.d.ts +194 -0
- package/dist/core/generation/CharacterGenerator.d.ts.map +1 -0
- package/dist/core/generation/ClassSuggester.d.ts +184 -0
- package/dist/core/generation/ClassSuggester.d.ts.map +1 -0
- package/dist/core/generation/EnemyEquipmentGenerator.d.ts +151 -0
- package/dist/core/generation/EnemyEquipmentGenerator.d.ts.map +1 -0
- package/dist/core/generation/EnemyGenerator.d.ts +595 -0
- package/dist/core/generation/EnemyGenerator.d.ts.map +1 -0
- package/dist/core/generation/EquipmentGenerator.d.ts +204 -0
- package/dist/core/generation/EquipmentGenerator.d.ts.map +1 -0
- package/dist/core/generation/LegendaryGenerator.d.ts +213 -0
- package/dist/core/generation/LegendaryGenerator.d.ts.map +1 -0
- package/dist/core/generation/LevelGenerator.d.ts +390 -0
- package/dist/core/generation/LevelGenerator.d.ts.map +1 -0
- package/dist/core/generation/NamingEngine.d.ts +136 -0
- package/dist/core/generation/NamingEngine.d.ts.map +1 -0
- package/dist/core/generation/PitchBeatLinker.d.ts +150 -0
- package/dist/core/generation/PitchBeatLinker.d.ts.map +1 -0
- package/dist/core/generation/RaceSelector.d.ts +58 -0
- package/dist/core/generation/RaceSelector.d.ts.map +1 -0
- package/dist/core/generation/RhythmGenerator.d.ts +597 -0
- package/dist/core/generation/RhythmGenerator.d.ts.map +1 -0
- package/dist/core/generation/SkillAssigner.d.ts +78 -0
- package/dist/core/generation/SkillAssigner.d.ts.map +1 -0
- package/dist/core/generation/SpellManager.d.ts +132 -0
- package/dist/core/generation/SpellManager.d.ts.map +1 -0
- package/dist/core/generation/SpellcastingGenerator.d.ts +255 -0
- package/dist/core/generation/SpellcastingGenerator.d.ts.map +1 -0
- package/dist/core/generation/index.d.ts +41 -0
- package/dist/core/generation/index.d.ts.map +1 -0
- package/dist/core/parser/MetadataExtractor.d.ts +66 -0
- package/dist/core/parser/MetadataExtractor.d.ts.map +1 -0
- package/dist/core/parser/PlaylistParser.d.ts +45 -0
- package/dist/core/parser/PlaylistParser.d.ts.map +1 -0
- package/dist/core/playback/SubdivisionPlaybackController.d.ts +333 -0
- package/dist/core/playback/SubdivisionPlaybackController.d.ts.map +1 -0
- package/dist/core/playback/index.d.ts +5 -0
- package/dist/core/playback/index.d.ts.map +1 -0
- package/dist/core/progression/CharacterUpdater.d.ts +203 -0
- package/dist/core/progression/CharacterUpdater.d.ts.map +1 -0
- package/dist/core/progression/LevelUpProcessor.d.ts +234 -0
- package/dist/core/progression/LevelUpProcessor.d.ts.map +1 -0
- package/dist/core/progression/PrestigeSystem.d.ts +217 -0
- package/dist/core/progression/PrestigeSystem.d.ts.map +1 -0
- package/dist/core/progression/RhythmXPCalculator.d.ts +182 -0
- package/dist/core/progression/RhythmXPCalculator.d.ts.map +1 -0
- package/dist/core/progression/SessionTracker.d.ts +169 -0
- package/dist/core/progression/SessionTracker.d.ts.map +1 -0
- package/dist/core/progression/XPCalculator.d.ts +128 -0
- package/dist/core/progression/XPCalculator.d.ts.map +1 -0
- package/dist/core/progression/stat/StatIncreaseStrategy.d.ts +97 -0
- package/dist/core/progression/stat/StatIncreaseStrategy.d.ts.map +1 -0
- package/dist/core/progression/stat/StatManager.d.ts +179 -0
- package/dist/core/progression/stat/StatManager.d.ts.map +1 -0
- package/dist/core/sensors/EnvironmentalSensors.d.ts +301 -0
- package/dist/core/sensors/EnvironmentalSensors.d.ts.map +1 -0
- package/dist/core/sensors/GamingPlatformSensors.d.ts +162 -0
- package/dist/core/sensors/GamingPlatformSensors.d.ts.map +1 -0
- package/dist/core/sensors/GeolocationProvider.d.ts +156 -0
- package/dist/core/sensors/GeolocationProvider.d.ts.map +1 -0
- package/dist/core/sensors/MotionDetector.d.ts +58 -0
- package/dist/core/sensors/MotionDetector.d.ts.map +1 -0
- package/dist/core/sensors/SteamAPIClient.d.ts +108 -0
- package/dist/core/sensors/SteamAPIClient.d.ts.map +1 -0
- package/dist/core/sensors/WeatherAPIClient.d.ts +360 -0
- package/dist/core/sensors/WeatherAPIClient.d.ts.map +1 -0
- package/dist/core/sensors/schemas/weather.schema.d.ts +144 -0
- package/dist/core/sensors/schemas/weather.schema.d.ts.map +1 -0
- package/dist/core/skills/SkillQuery.d.ts +159 -0
- package/dist/core/skills/SkillQuery.d.ts.map +1 -0
- package/dist/core/skills/SkillTypes.d.ts +233 -0
- package/dist/core/skills/SkillTypes.d.ts.map +1 -0
- package/dist/core/skills/SkillValidator.d.ts +146 -0
- package/dist/core/skills/SkillValidator.d.ts.map +1 -0
- package/dist/core/skills/index.d.ts +11 -0
- package/dist/core/skills/index.d.ts.map +1 -0
- package/dist/core/spells/SpellQuery.d.ts +194 -0
- package/dist/core/spells/SpellQuery.d.ts.map +1 -0
- package/dist/core/spells/SpellTypes.d.ts +71 -0
- package/dist/core/spells/SpellTypes.d.ts.map +1 -0
- package/dist/core/spells/SpellValidator.d.ts +129 -0
- package/dist/core/spells/SpellValidator.d.ts.map +1 -0
- package/dist/core/spells/index.d.ts +11 -0
- package/dist/core/spells/index.d.ts.map +1 -0
- package/dist/core/types/AudioProfile.d.ts +143 -0
- package/dist/core/types/AudioProfile.d.ts.map +1 -0
- package/dist/core/types/BeatMap.d.ts +1825 -0
- package/dist/core/types/BeatMap.d.ts.map +1 -0
- package/dist/core/types/ButtonMapping.d.ts +345 -0
- package/dist/core/types/ButtonMapping.d.ts.map +1 -0
- package/dist/core/types/Character.d.ts +397 -0
- package/dist/core/types/Character.d.ts.map +1 -0
- package/dist/core/types/ChartedBeatMap.d.ts +169 -0
- package/dist/core/types/ChartedBeatMap.d.ts.map +1 -0
- package/dist/core/types/Combat.d.ts +268 -0
- package/dist/core/types/Combat.d.ts.map +1 -0
- package/dist/core/types/CombatAI.d.ts +143 -0
- package/dist/core/types/CombatAI.d.ts.map +1 -0
- package/dist/core/types/Enemy.d.ts +447 -0
- package/dist/core/types/Enemy.d.ts.map +1 -0
- package/dist/core/types/Environmental.d.ts +213 -0
- package/dist/core/types/Environmental.d.ts.map +1 -0
- package/dist/core/types/Equipment.d.ts +309 -0
- package/dist/core/types/Equipment.d.ts.map +1 -0
- package/dist/core/types/ISessionTracker.d.ts +48 -0
- package/dist/core/types/ISessionTracker.d.ts.map +1 -0
- package/dist/core/types/LevelExport.d.ts +366 -0
- package/dist/core/types/LevelExport.d.ts.map +1 -0
- package/dist/core/types/Playlist.d.ts +70 -0
- package/dist/core/types/Playlist.d.ts.map +1 -0
- package/dist/core/types/Prestige.d.ts +94 -0
- package/dist/core/types/Prestige.d.ts.map +1 -0
- package/dist/core/types/Progression.d.ts +214 -0
- package/dist/core/types/Progression.d.ts.map +1 -0
- package/dist/core/types/RhythmXP.d.ts +398 -0
- package/dist/core/types/RhythmXP.d.ts.map +1 -0
- package/dist/core/utils/AbilityConstants.d.ts +31 -0
- package/dist/core/utils/AbilityConstants.d.ts.map +1 -0
- package/dist/core/utils/EffectApplierUtils.d.ts +56 -0
- package/dist/core/utils/EffectApplierUtils.d.ts.map +1 -0
- package/dist/core/utils/ImageValidator.d.ts +66 -0
- package/dist/core/utils/ImageValidator.d.ts.map +1 -0
- package/dist/core/utils/PrerequisiteValidator.d.ts +88 -0
- package/dist/core/utils/PrerequisiteValidator.d.ts.map +1 -0
- package/dist/essentia-wasm.es-BUEnKUts.js +2990 -0
- package/dist/essentia.js-model.es-CGA0xotH.js +306 -0
- package/dist/index.d.ts +176 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/playlist-data-engine.js +124 -0
- package/dist/playlist-data-engine.mjs +49251 -0
- package/dist/utils/EnchantmentLibrary.d.ts +378 -0
- package/dist/utils/EnchantmentLibrary.d.ts.map +1 -0
- package/dist/utils/arweaveGatewayManager.d.ts +485 -0
- package/dist/utils/arweaveGatewayManager.d.ts.map +1 -0
- package/dist/utils/arweaveUtils.d.ts +118 -0
- package/dist/utils/arweaveUtils.d.ts.map +1 -0
- package/dist/utils/constants.d.ts +439 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/equipmentConstants.d.ts +60 -0
- package/dist/utils/equipmentConstants.d.ts.map +1 -0
- package/dist/utils/hash.d.ts +33 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/logger.d.ts +192 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/magicItemExamples.d.ts +46 -0
- package/dist/utils/magicItemExamples.d.ts.map +1 -0
- package/dist/utils/playlistUtils.d.ts +149 -0
- package/dist/utils/playlistUtils.d.ts.map +1 -0
- package/dist/utils/random.d.ts +34 -0
- package/dist/utils/random.d.ts.map +1 -0
- package/dist/utils/sensorDashboard.d.ts +60 -0
- package/dist/utils/sensorDashboard.d.ts.map +1 -0
- package/dist/utils/validators.d.ts +189 -0
- package/dist/utils/validators.d.ts.map +1 -0
- package/dist/vite.svg +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rhythm Quantizer for Procedural Rhythm Generation
|
|
3
|
+
*
|
|
4
|
+
* Translates raw transients into quantized rhythmic subdivisions that align with the beat map grid.
|
|
5
|
+
*
|
|
6
|
+
* Part of the Procedural Rhythm Generation pipeline.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* // Basic usage - quantize transients to beat grid
|
|
11
|
+
* const quantizer = new RhythmQuantizer();
|
|
12
|
+
* const result = quantizer.quantize(transientAnalysis, unifiedBeatMap);
|
|
13
|
+
*
|
|
14
|
+
* // Access quantized streams for each band
|
|
15
|
+
* const lowBandBeats = result.streams.low.beats;
|
|
16
|
+
* const midBandBeats = result.streams.mid.beats;
|
|
17
|
+
* const highBandBeats = result.streams.high.beats;
|
|
18
|
+
*
|
|
19
|
+
* // Check grid decisions (16th vs triplet) for each beat
|
|
20
|
+
* for (const decision of result.streams.low.gridDecisions) {
|
|
21
|
+
* console.log(`Beat ${decision.beatIndex}: ${decision.selectedGrid} (confidence: ${decision.confidence.toFixed(2)})`);
|
|
22
|
+
* }
|
|
23
|
+
*
|
|
24
|
+
* // Custom configuration with intensity filtering
|
|
25
|
+
* const customQuantizer = new RhythmQuantizer({
|
|
26
|
+
* minimumTransientIntensity: 0.3, // Filter weak transients
|
|
27
|
+
* densityValidation: {
|
|
28
|
+
* maxRetries: 5, // Per-band retry limit (opt-in, default: 0)
|
|
29
|
+
* baseSensitivityReduction: 0.1, // Linear increment per retry
|
|
30
|
+
* maxCumulativeReduction: 0.5, // Max threshold increase (default: 0.5)
|
|
31
|
+
* },
|
|
32
|
+
* });
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
import type { TransientResult, TransientAnalysis } from './TransientDetector.js';
|
|
36
|
+
import type { UnifiedBeatMap } from '../../types/BeatMap.js';
|
|
37
|
+
import type { FrequencyBand } from './utils/audioUtils.js';
|
|
38
|
+
/**
|
|
39
|
+
* Configuration for density validation
|
|
40
|
+
*/
|
|
41
|
+
export interface DensityValidationConfig {
|
|
42
|
+
/** Maximum number of retries for sensitivity adjustment (default: 0, opt-in) */
|
|
43
|
+
maxRetries: number;
|
|
44
|
+
/** Base sensitivity reduction amount per retry (default: 0.1) */
|
|
45
|
+
baseSensitivityReduction: number;
|
|
46
|
+
/** Maximum cumulative sensitivity reduction (default: 0.5) */
|
|
47
|
+
maxCumulativeReduction: number;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Band type for per-band processing
|
|
51
|
+
*/
|
|
52
|
+
type BandType = 'low' | 'mid' | 'high';
|
|
53
|
+
/**
|
|
54
|
+
* Configuration for the RhythmQuantizer
|
|
55
|
+
*/
|
|
56
|
+
export interface QuantizationConfig {
|
|
57
|
+
/** Density validation configuration */
|
|
58
|
+
densityValidation?: DensityValidationConfig;
|
|
59
|
+
/** Minimum transient intensity to include (0.0 = catch all, default: 0.0) */
|
|
60
|
+
minimumTransientIntensity: number;
|
|
61
|
+
/** Custom frequency bands (default: FREQUENCY_BANDS from audioUtils) */
|
|
62
|
+
bands?: FrequencyBand[];
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Complete Phase 1 output - all 3 band streams plus metadata
|
|
66
|
+
*/
|
|
67
|
+
export interface QuantizedBandStreams {
|
|
68
|
+
streams: {
|
|
69
|
+
low: GeneratedRhythmMap;
|
|
70
|
+
mid: GeneratedRhythmMap;
|
|
71
|
+
high: GeneratedRhythmMap;
|
|
72
|
+
};
|
|
73
|
+
metadata: {
|
|
74
|
+
/** Per-band density validation results */
|
|
75
|
+
densityValidation: DensityValidationResult;
|
|
76
|
+
/** Total transients filtered by intensity across all bands */
|
|
77
|
+
transientsFilteredByIntensity: number;
|
|
78
|
+
/** Per-band filtered counts */
|
|
79
|
+
transientsFilteredByBand: {
|
|
80
|
+
low: number;
|
|
81
|
+
mid: number;
|
|
82
|
+
high: number;
|
|
83
|
+
};
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Result of density validation for a single band
|
|
88
|
+
*/
|
|
89
|
+
export interface BandDensityValidationResult {
|
|
90
|
+
/** Band that was validated */
|
|
91
|
+
band: BandType;
|
|
92
|
+
/** Whether the density is valid */
|
|
93
|
+
isValid: boolean;
|
|
94
|
+
/** Smallest gap between transients (seconds) */
|
|
95
|
+
minIntervalDetected: number;
|
|
96
|
+
/** Required minimum interval (16th note duration at current tempo) */
|
|
97
|
+
requiredMinInterval: number;
|
|
98
|
+
/** Number of retries attempted */
|
|
99
|
+
retryCount: number;
|
|
100
|
+
/** Cumulative sensitivity reduction applied */
|
|
101
|
+
sensitivityReduction: number;
|
|
102
|
+
/** Final intensity threshold used */
|
|
103
|
+
finalIntensityThreshold: number;
|
|
104
|
+
/** Number of transients after filtering */
|
|
105
|
+
transientsRemaining: number;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Combined density validation result for all bands
|
|
109
|
+
*/
|
|
110
|
+
export interface DensityValidationResult {
|
|
111
|
+
/** Whether all bands have valid density */
|
|
112
|
+
isValid: boolean;
|
|
113
|
+
/** Per-band density validation results */
|
|
114
|
+
bands: {
|
|
115
|
+
low: BandDensityValidationResult;
|
|
116
|
+
mid: BandDensityValidationResult;
|
|
117
|
+
high: BandDensityValidationResult;
|
|
118
|
+
};
|
|
119
|
+
/** Maximum retry count across all bands */
|
|
120
|
+
maxRetryCount: number;
|
|
121
|
+
/** Maximum sensitivity reduction across all bands */
|
|
122
|
+
maxSensitivityReduction: number;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Grid type for a beat
|
|
126
|
+
*/
|
|
127
|
+
export type GridType = 'straight_16th' | 'triplet_8th' | 'straight_8th';
|
|
128
|
+
/**
|
|
129
|
+
* Grid decision metadata (produced during grid detection)
|
|
130
|
+
*/
|
|
131
|
+
export interface GridDecision {
|
|
132
|
+
/** Index into UnifiedBeatMap.beats[] */
|
|
133
|
+
beatIndex: number;
|
|
134
|
+
/** Selected grid type for this beat */
|
|
135
|
+
selectedGrid: GridType;
|
|
136
|
+
/** Average ms offset from straight 16th grid (undefined when grid is forced) */
|
|
137
|
+
straightAvgOffset?: number;
|
|
138
|
+
/** Average ms offset from triplet grid (undefined when grid is forced) */
|
|
139
|
+
tripletAvgOffset?: number;
|
|
140
|
+
/** Number of transients in this beat */
|
|
141
|
+
transientCount: number;
|
|
142
|
+
/** How much better the chosen grid fits */
|
|
143
|
+
confidence: number;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* A single quantized note
|
|
147
|
+
*/
|
|
148
|
+
export interface GeneratedBeat {
|
|
149
|
+
/** Quantized time in seconds */
|
|
150
|
+
timestamp: number;
|
|
151
|
+
/** Index into UnifiedBeatMap.beats[] - which quarter note this belongs to */
|
|
152
|
+
beatIndex: number;
|
|
153
|
+
/** Position within that beat (0-3 for 16th, 0-2 for triplet, 0-1 for 8th) */
|
|
154
|
+
gridPosition: number;
|
|
155
|
+
/** Grid type for this beat */
|
|
156
|
+
gridType: GridType;
|
|
157
|
+
/** Transient strength (0.0 - 1.0) */
|
|
158
|
+
intensity: number;
|
|
159
|
+
/** Frequency band */
|
|
160
|
+
band: 'low' | 'mid' | 'high';
|
|
161
|
+
/** Original transient detection timestamp in seconds (before quantization) */
|
|
162
|
+
detectedTimestamp?: number;
|
|
163
|
+
/** How far it was moved from original (ms), for debugging */
|
|
164
|
+
quantizationError?: number;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Per-band rhythm map - a complete rhythm chart for one frequency band
|
|
168
|
+
*/
|
|
169
|
+
export interface GeneratedRhythmMap {
|
|
170
|
+
/** Unique identifier for the audio source */
|
|
171
|
+
audioId: string;
|
|
172
|
+
/** Duration in seconds */
|
|
173
|
+
duration: number;
|
|
174
|
+
/** All quantized beats for this band */
|
|
175
|
+
beats: GeneratedBeat[];
|
|
176
|
+
/** Per-beat grid choices (16th vs triplet) */
|
|
177
|
+
gridDecisions: GridDecision[];
|
|
178
|
+
/** Duration of a quarter note in seconds (from UnifiedBeatMap - the ground truth) */
|
|
179
|
+
quarterNoteInterval: number;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Callback for custom grid decision logic.
|
|
183
|
+
*
|
|
184
|
+
* When provided to `quantize()`, replaces the internal `decideGrids()` call
|
|
185
|
+
* for each band. Used by `TempoAwareQuantizer` to inject BPM-aware grid
|
|
186
|
+
* decisions into the decide-then-quantize flow without duplicating the
|
|
187
|
+
* density validation and deduplication logic.
|
|
188
|
+
*
|
|
189
|
+
* The returned grid decisions are passed directly to `quantizeToGrids()`.
|
|
190
|
+
*/
|
|
191
|
+
export type GridDecider = (transients: TransientResult[], unifiedBeatMap: UnifiedBeatMap, band: BandType) => GridDecision[];
|
|
192
|
+
/**
|
|
193
|
+
* Multi-Band Rhythm Quantizer
|
|
194
|
+
*
|
|
195
|
+
* Translates raw transients into quantized rhythmic subdivisions that align with the beat map grid.
|
|
196
|
+
*
|
|
197
|
+
* ## Overview
|
|
198
|
+
*
|
|
199
|
+
* The quantization process consists of three main phases:
|
|
200
|
+
*
|
|
201
|
+
* 1. **Density Validation**: Checks if transients are too dense (closer than 16th note interval)
|
|
202
|
+
* - If too dense, triggers sensitivity adjustment with retry logic
|
|
203
|
+
* - Uses exponential backoff for sensitivity reduction
|
|
204
|
+
*
|
|
205
|
+
* 2. **Intensity Filtering**: Removes transients below the minimum intensity threshold
|
|
206
|
+
*
|
|
207
|
+
* 3. **Decide-then-Quantize**: Two-phase per-band processing:
|
|
208
|
+
* a. **Grid Decision** (`decideGrids()`): For each beat, determines whether transients
|
|
209
|
+
* fit better on a straight 16th note grid or an 8th note triplet grid. Does NOT
|
|
210
|
+
* perform quantization — the returned decisions can be modified by downstream
|
|
211
|
+
* rules (e.g., BPM-aware quantization) before snapping.
|
|
212
|
+
* b. **Quantization** (`quantizeToGrids()`): Snaps each transient's original timestamp
|
|
213
|
+
* to the nearest point on the chosen grid. Uses the original (not pre-quantized)
|
|
214
|
+
* timestamps to minimize quantization error.
|
|
215
|
+
*
|
|
216
|
+
* The `quantizeBand()` method orchestrates: decide → quantize → deduplicate.
|
|
217
|
+
*
|
|
218
|
+
* ## Usage
|
|
219
|
+
*
|
|
220
|
+
* ```typescript
|
|
221
|
+
* const quantizer = new RhythmQuantizer({
|
|
222
|
+
* minimumTransientIntensity: 0.3
|
|
223
|
+
* });
|
|
224
|
+
* const result = quantizer.quantize(transientAnalysis, unifiedBeatMap);
|
|
225
|
+
*
|
|
226
|
+
* // Access per-band streams
|
|
227
|
+
* const lowStream = result.streams.low;
|
|
228
|
+
* const midStream = result.streams.mid;
|
|
229
|
+
* const highStream = result.streams.high;
|
|
230
|
+
* ```
|
|
231
|
+
*/
|
|
232
|
+
export declare class RhythmQuantizer {
|
|
233
|
+
private config;
|
|
234
|
+
/**
|
|
235
|
+
* Create a new RhythmQuantizer
|
|
236
|
+
*
|
|
237
|
+
* @param config - Configuration options (all optional, defaults provided)
|
|
238
|
+
*/
|
|
239
|
+
constructor(config?: Partial<QuantizationConfig>);
|
|
240
|
+
/**
|
|
241
|
+
* Get the current configuration
|
|
242
|
+
*
|
|
243
|
+
* @returns The current configuration
|
|
244
|
+
*/
|
|
245
|
+
getConfig(): Required<QuantizationConfig>;
|
|
246
|
+
/**
|
|
247
|
+
* Quantize transients into rhythm streams
|
|
248
|
+
*
|
|
249
|
+
* Implements per-band density validation with linear retry increments:
|
|
250
|
+
* - Each band (low/mid/high) is validated independently
|
|
251
|
+
* - Retry increments are linear: 0.1, 0.2, 0.3, 0.4, 0.5
|
|
252
|
+
* - If one band is too dense, only that band's threshold is increased
|
|
253
|
+
*
|
|
254
|
+
* @param transientAnalysis - Transient analysis from TransientDetector
|
|
255
|
+
* @param unifiedBeatMap - Unified beat map to quantize against
|
|
256
|
+
* @param gridDecider - Optional custom grid decider (e.g., TempoAwareQuantizer).
|
|
257
|
+
* When provided, replaces the internal `decideGrids()` call for each band.
|
|
258
|
+
* @returns Quantized band streams
|
|
259
|
+
*/
|
|
260
|
+
quantize(transientAnalysis: TransientAnalysis, unifiedBeatMap: UnifiedBeatMap, gridDecider?: GridDecider): QuantizedBandStreams;
|
|
261
|
+
/**
|
|
262
|
+
* Split transients by frequency band
|
|
263
|
+
*/
|
|
264
|
+
private splitTransientsByBand;
|
|
265
|
+
/**
|
|
266
|
+
* Process a single band with per-band density validation and retry logic
|
|
267
|
+
*
|
|
268
|
+
* Uses linear increments instead of exponential:
|
|
269
|
+
* - Retry 1: +0.1
|
|
270
|
+
* - Retry 2: +0.2
|
|
271
|
+
* - Retry 3: +0.3
|
|
272
|
+
* - Retry 4: +0.4
|
|
273
|
+
* - Retry 5: +0.5
|
|
274
|
+
*/
|
|
275
|
+
private processBand;
|
|
276
|
+
/**
|
|
277
|
+
* Validate density for a single band
|
|
278
|
+
*/
|
|
279
|
+
private validateBandDensity;
|
|
280
|
+
/**
|
|
281
|
+
* Aggregate density results from all bands into a single result
|
|
282
|
+
*/
|
|
283
|
+
private aggregateDensityResults;
|
|
284
|
+
/**
|
|
285
|
+
* Decide grid types for each beat that has transients.
|
|
286
|
+
*
|
|
287
|
+
* Grid decision phase only — determines which grid type (straight_16th,
|
|
288
|
+
* triplet_8th, or forced straight_8th) best fits the transients in each beat.
|
|
289
|
+
* Does NOT perform any quantization. The returned decisions can be modified
|
|
290
|
+
* by downstream rules (e.g., BPM-aware quantization) before quantization.
|
|
291
|
+
*
|
|
292
|
+
* @param transients - Raw transients for this band
|
|
293
|
+
* @param unifiedBeatMap - Unified beat map
|
|
294
|
+
* @param band - Band being processed
|
|
295
|
+
* @returns Array of grid decisions for beats with transients
|
|
296
|
+
*/
|
|
297
|
+
decideGrids(transients: TransientResult[], unifiedBeatMap: UnifiedBeatMap, band: BandType): GridDecision[];
|
|
298
|
+
/**
|
|
299
|
+
* Quantize transients to their chosen grid positions.
|
|
300
|
+
*
|
|
301
|
+
* Quantization phase — snaps each transient's original timestamp to the
|
|
302
|
+
* nearest grid point based on the provided grid decisions. Uses the
|
|
303
|
+
* ORIGINAL transient timestamps (not pre-quantized data) to minimize
|
|
304
|
+
* quantization error.
|
|
305
|
+
*
|
|
306
|
+
* @param transients - Raw transients for this band (original timestamps)
|
|
307
|
+
* @param unifiedBeatMap - Unified beat map
|
|
308
|
+
* @param band - Band being processed
|
|
309
|
+
* @param gridDecisions - Grid decisions for each beat (may be modified by BPM rules)
|
|
310
|
+
* @returns Array of raw quantized beats (before deduplication)
|
|
311
|
+
*/
|
|
312
|
+
quantizeToGrids(transients: TransientResult[], unifiedBeatMap: UnifiedBeatMap, band: BandType, gridDecisions: GridDecision[]): GeneratedBeat[];
|
|
313
|
+
/**
|
|
314
|
+
* Quantize a single band (orchestrator: decide → quantize → deduplicate)
|
|
315
|
+
*/
|
|
316
|
+
private quantizeBand;
|
|
317
|
+
/**
|
|
318
|
+
* Deduplicate beats that snap to the same grid point
|
|
319
|
+
*
|
|
320
|
+
* When multiple transients quantize to the same (beatIndex, gridPosition, gridType),
|
|
321
|
+
* keep only the one with the highest intensity.
|
|
322
|
+
*
|
|
323
|
+
* @param beats - Array of quantized beats (may have duplicates)
|
|
324
|
+
* @returns Deduplicated array with only the strongest beat at each grid point
|
|
325
|
+
*/
|
|
326
|
+
private deduplicateBeats;
|
|
327
|
+
/**
|
|
328
|
+
* Detect grid type for a beat
|
|
329
|
+
*
|
|
330
|
+
* ## Algorithm: Per-Beat Grid Detection (16th vs Triplet)
|
|
331
|
+
*
|
|
332
|
+
* This method determines whether transients within a beat fit better on:
|
|
333
|
+
* - **Straight 16th note grid**: 4 equally-spaced positions (0, 1, 2, 3)
|
|
334
|
+
* - **8th note triplet grid**: 3 equally-spaced positions (0, 1, 2)
|
|
335
|
+
*
|
|
336
|
+
* ### Decision Logic:
|
|
337
|
+
*
|
|
338
|
+
* 1. Calculate both grid positions for the beat
|
|
339
|
+
* 2. For each transient, measure distance to nearest point on each grid
|
|
340
|
+
* 3. Calculate average offset per transient for each grid
|
|
341
|
+
* 4. Select grid with **smaller average offset** (transients are closer to grid points)
|
|
342
|
+
* 5. Confidence = |straightAvgOffset - tripletAvgOffset| (how much better the winner fits)
|
|
343
|
+
*
|
|
344
|
+
* ### Example:
|
|
345
|
+
* - If transients are at 0ms, 250ms, 500ms in a 500ms beat:
|
|
346
|
+
* - Straight 16th grid (0, 125, 250, 375, 500ms) → offsets: 0, 0, 0 → avg 0ms
|
|
347
|
+
* - Triplet grid (0, 167, 333, 500ms) → offsets: 0, 83, 167 → avg 83ms
|
|
348
|
+
* - Winner: Straight 16th (smaller offset)
|
|
349
|
+
*
|
|
350
|
+
* ### Why Per-Beat Detection?
|
|
351
|
+
*
|
|
352
|
+
* Music often mixes straight and triplet feels within the same song.
|
|
353
|
+
* By detecting the grid per-beat, we can handle:
|
|
354
|
+
* - Songs with tempo changes
|
|
355
|
+
* - Songs with mixed time signatures
|
|
356
|
+
* - Songs with swing feel in some sections but not others
|
|
357
|
+
*/
|
|
358
|
+
/**
|
|
359
|
+
* Get the forced grid type for a band, if any.
|
|
360
|
+
*
|
|
361
|
+
* Returns null for bands that should auto-detect their grid.
|
|
362
|
+
*/
|
|
363
|
+
private getBandGridType;
|
|
364
|
+
private detectGrid;
|
|
365
|
+
/**
|
|
366
|
+
* Calculate straight 16th note grid for a beat
|
|
367
|
+
*
|
|
368
|
+
* @param beatStart - Start time of the beat in seconds
|
|
369
|
+
* @param quarterNoteInterval - Duration of a quarter note in seconds
|
|
370
|
+
* @returns Array of grid positions in seconds
|
|
371
|
+
*/
|
|
372
|
+
private calculateStraightGrid;
|
|
373
|
+
/**
|
|
374
|
+
* Calculate 8th note triplet grid for a beat
|
|
375
|
+
*
|
|
376
|
+
* @param beatStart - Start time of the beat in seconds
|
|
377
|
+
* @param quarterNoteInterval - Duration of a quarter note in seconds
|
|
378
|
+
* @returns Array of grid positions in seconds
|
|
379
|
+
*/
|
|
380
|
+
private calculateTripletGrid;
|
|
381
|
+
/**
|
|
382
|
+
* Calculate straight 8th note grid for a beat
|
|
383
|
+
*
|
|
384
|
+
* @param beatStart - Start time of the beat in seconds
|
|
385
|
+
* @param quarterNoteInterval - Duration of a quarter note in seconds
|
|
386
|
+
* @returns Array of grid positions in seconds
|
|
387
|
+
*/
|
|
388
|
+
private calculate8thGrid;
|
|
389
|
+
/**
|
|
390
|
+
* Calculate offset from grid (in milliseconds)
|
|
391
|
+
*/
|
|
392
|
+
private calculateOffsetFromGrid;
|
|
393
|
+
/**
|
|
394
|
+
* Quantize a transient to chosen grid
|
|
395
|
+
*/
|
|
396
|
+
private quantizeTransient;
|
|
397
|
+
}
|
|
398
|
+
export {};
|
|
399
|
+
//# sourceMappingURL=RhythmQuantizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RhythmQuantizer.d.ts","sourceRoot":"","sources":["../../../../src/core/analysis/beat/RhythmQuantizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RhythmicBalancer - Enforces metric structure and downbeat anchoring
|
|
3
|
+
*
|
|
4
|
+
* A post-processing step that transforms the composite stream to ensure
|
|
5
|
+
* rhythmic playability. Operates between CompositeStreamGenerator and
|
|
6
|
+
* DifficultyVariantGenerator in the pipeline.
|
|
7
|
+
*
|
|
8
|
+
* Key operations:
|
|
9
|
+
* - Shifts lone subdivision notes to downbeats
|
|
10
|
+
* - Fills empty measures with a beat on beat 1
|
|
11
|
+
* - Enforces downbeat proximity for upbeat notes
|
|
12
|
+
* - Removes notes within the start/end audio margin
|
|
13
|
+
*
|
|
14
|
+
* Part of the Procedural Rhythm Generation pipeline - Rhythmic Balance
|
|
15
|
+
*/
|
|
16
|
+
import type { CompositeStream } from './CompositeStreamGenerator.js';
|
|
17
|
+
import type { UnifiedBeatMap, DownbeatSegment } from '../../types/BeatMap.js';
|
|
18
|
+
import type { ControllerMode } from '../../types/ButtonMapping.js';
|
|
19
|
+
/**
|
|
20
|
+
* Describes what action the RhythmicBalancer took on a beat (if any).
|
|
21
|
+
*
|
|
22
|
+
* Used to tag beats in the balanced composite so the UI can visually
|
|
23
|
+
* distinguish balancer-modified beats from naturally detected ones.
|
|
24
|
+
*/
|
|
25
|
+
export type BalancerAction = 'none' | 'shifted_to_downbeat' | 'empty_measure_fill' | 'proximity_shift' | 'margin_removal';
|
|
26
|
+
/**
|
|
27
|
+
* Summary statistics from the rhythmic balancing step.
|
|
28
|
+
*/
|
|
29
|
+
export interface BalanceStats {
|
|
30
|
+
/** Number of lone offbeat notes shifted to downbeats */
|
|
31
|
+
shiftedToDownbeat: number;
|
|
32
|
+
/** Number of empty measures filled with a downbeat */
|
|
33
|
+
emptyMeasuresFilled: number;
|
|
34
|
+
/** Number of upbeat notes shifted due to missing nearby downbeat */
|
|
35
|
+
proximityShifts: number;
|
|
36
|
+
/** Total beats added by the balancer (filled measures only) */
|
|
37
|
+
beatsAdded: number;
|
|
38
|
+
/** Total beats modified by the balancer (shifts) */
|
|
39
|
+
beatsShifted: number;
|
|
40
|
+
/** Total beats removed for being within the start/end audio margin */
|
|
41
|
+
marginRemovals: number;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Result of the balance() operation, including the balanced stream and stats.
|
|
45
|
+
*/
|
|
46
|
+
export interface BalanceResult {
|
|
47
|
+
/** The balanced composite stream with tagged beats */
|
|
48
|
+
composite: CompositeStream;
|
|
49
|
+
/** Statistics about what the balancer did */
|
|
50
|
+
stats: BalanceStats;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Strong beat emphasis mode for density reduction priority
|
|
54
|
+
*
|
|
55
|
+
* Determines which beats within a measure are considered "strong" for the
|
|
56
|
+
* purpose of density reduction (which beats to keep vs remove).
|
|
57
|
+
*/
|
|
58
|
+
export type StrongBeatEmphasis = 'natural' | 'backbeat' | 'neutral';
|
|
59
|
+
/**
|
|
60
|
+
* Configuration for rhythmic balancing
|
|
61
|
+
*
|
|
62
|
+
* Controls how the RhythmicBalancer enforces metric structure on the
|
|
63
|
+
* composite stream before difficulty variants are generated.
|
|
64
|
+
*/
|
|
65
|
+
export interface RhythmicBalanceConfig {
|
|
66
|
+
/**
|
|
67
|
+
* Which beats are "strong" for density reduction priority.
|
|
68
|
+
* Derives grouping from time signature automatically.
|
|
69
|
+
*
|
|
70
|
+
* - 'natural': Emphasize natural metric accents (e.g., 4/4 → beats 1, 3; 9/8 → beats 1, 4, 7)
|
|
71
|
+
* - 'backbeat': Emphasize weak positions (e.g., 4/4 → beats 2, 4; 9/8 → beats 2, 3, 5, 6, 8, 9)
|
|
72
|
+
* - 'neutral': No positional preference
|
|
73
|
+
*
|
|
74
|
+
* @default 'natural'
|
|
75
|
+
*/
|
|
76
|
+
strongBeatEmphasis: StrongBeatEmphasis;
|
|
77
|
+
/**
|
|
78
|
+
* Max distance in quarter-note beats from an upbeat note to the nearest downbeat note.
|
|
79
|
+
* 0 = same beat only, 1 = one beat, 1.5 = one beat (half-beat increments supported),
|
|
80
|
+
* 4 = same measure.
|
|
81
|
+
*
|
|
82
|
+
* Supports whole beats and 0.5 increments. Intermediate fractional values are
|
|
83
|
+
* rounded down to the nearest supported step (e.g., 1.7 behaves like 1.5).
|
|
84
|
+
*
|
|
85
|
+
* If an upbeat note has no downbeat within this range, it gets shifted to the
|
|
86
|
+
* downbeat of its beat index.
|
|
87
|
+
*
|
|
88
|
+
* @default 2
|
|
89
|
+
*/
|
|
90
|
+
downbeatProximityRange: number;
|
|
91
|
+
/**
|
|
92
|
+
* Whether to fill empty measures with a beat on beat 1 downbeat.
|
|
93
|
+
*
|
|
94
|
+
* Ensures every measure has at least one beat for rhythmic foundation.
|
|
95
|
+
*
|
|
96
|
+
* @default true
|
|
97
|
+
*/
|
|
98
|
+
fillEmptyMeasures: boolean;
|
|
99
|
+
/**
|
|
100
|
+
* Intensity for beats added by the balancer.
|
|
101
|
+
*
|
|
102
|
+
* Lower than detected beats (typically 0.6-0.8) so they're removable
|
|
103
|
+
* during density reduction if needed.
|
|
104
|
+
*
|
|
105
|
+
* @default 0.45
|
|
106
|
+
*/
|
|
107
|
+
addedBeatIntensity: number;
|
|
108
|
+
/**
|
|
109
|
+
* Minimum distance in seconds from the start and end of the audio file
|
|
110
|
+
* where notes are allowed. Beats within this margin are removed to prevent
|
|
111
|
+
* unfair/unplayable notes at the very beginning or end of a song.
|
|
112
|
+
*
|
|
113
|
+
* 0 = disabled (no margin enforced).
|
|
114
|
+
*
|
|
115
|
+
* @default 0.5
|
|
116
|
+
*/
|
|
117
|
+
marginSeconds: number;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Default configuration for rhythmic balancing
|
|
121
|
+
*/
|
|
122
|
+
export declare const DEFAULT_RHYTHMIC_BALANCE_CONFIG: RhythmicBalanceConfig;
|
|
123
|
+
/**
|
|
124
|
+
* Get the default rhythmic balance config for a controller mode.
|
|
125
|
+
*
|
|
126
|
+
* @param controllerMode - The controller mode to get defaults for
|
|
127
|
+
* @returns RhythmicBalanceConfig with mode-specific values
|
|
128
|
+
*/
|
|
129
|
+
export declare function getControllerModeBalanceDefaults(controllerMode: ControllerMode): RhythmicBalanceConfig;
|
|
130
|
+
/**
|
|
131
|
+
* Get the metric group size based on time signature
|
|
132
|
+
*
|
|
133
|
+
* Simple meter (beatsPerMeasure not divisible by 3): groups of 2
|
|
134
|
+
* Compound meter (beatsPerMeasure divisible by 3): groups of 3
|
|
135
|
+
*
|
|
136
|
+
* @param beatsPerMeasure - Number of beats per measure
|
|
137
|
+
* @returns Group size (2 for simple, 3 for compound)
|
|
138
|
+
*/
|
|
139
|
+
export declare function getMetricGroupSize(beatsPerMeasure: number): number;
|
|
140
|
+
/**
|
|
141
|
+
* Check if a beat position is a metric strong beat within its group
|
|
142
|
+
*
|
|
143
|
+
* In simple meter (groups of 2): positions 0, 2, 4, ... are strong
|
|
144
|
+
* In compound meter (groups of 3): positions 0, 3, 6, ... are strong
|
|
145
|
+
*
|
|
146
|
+
* @param beatInMeasure - Position within the measure (0-indexed)
|
|
147
|
+
* @param groupSize - Metric group size (2 or 3)
|
|
148
|
+
* @returns True if this is a strong beat position
|
|
149
|
+
*/
|
|
150
|
+
export declare function isMetricStrongBeat(beatInMeasure: number, groupSize: number): boolean;
|
|
151
|
+
/**
|
|
152
|
+
* Check if a beat position is a metric weak beat within its group
|
|
153
|
+
*
|
|
154
|
+
* In simple meter (groups of 2): positions 1, 3, 5, ... are weak
|
|
155
|
+
* In compound meter (groups of 3): positions 1, 2, 4, 5, 7, 8, ... are weak
|
|
156
|
+
*
|
|
157
|
+
* @param beatInMeasure - Position within the measure (0-indexed)
|
|
158
|
+
* @param groupSize - Metric group size (2 or 3)
|
|
159
|
+
* @returns True if this is a weak beat position
|
|
160
|
+
*/
|
|
161
|
+
export declare function isMetricWeakBeat(beatInMeasure: number, groupSize: number): boolean;
|
|
162
|
+
/**
|
|
163
|
+
* Find the active downbeat segment for a given beat index
|
|
164
|
+
*
|
|
165
|
+
* @param segments - Array of downbeat segments (must be ordered by startBeat)
|
|
166
|
+
* @param beatIndex - The beat index to find the segment for
|
|
167
|
+
* @returns The active segment for the given beat index
|
|
168
|
+
*/
|
|
169
|
+
export declare function findActiveSegment(segments: DownbeatSegment[], beatIndex: number): DownbeatSegment;
|
|
170
|
+
/**
|
|
171
|
+
* Check if a beat should be considered "strong" based on the emphasis mode
|
|
172
|
+
*
|
|
173
|
+
* @param beatInMeasure - Position within the measure (0-indexed)
|
|
174
|
+
* @param beatsPerMeasure - Number of beats per measure in this segment
|
|
175
|
+
* @param emphasis - Strong beat emphasis mode
|
|
176
|
+
* @returns True if this beat should be treated as strong
|
|
177
|
+
*/
|
|
178
|
+
export declare function isStrongBeatForEmphasis(beatInMeasure: number, beatsPerMeasure: number, emphasis: StrongBeatEmphasis): boolean;
|
|
179
|
+
/**
|
|
180
|
+
* Balances a composite stream to enforce metric structure and downbeat anchoring
|
|
181
|
+
*
|
|
182
|
+
* Takes a CompositeStream and returns a new CompositeStream with improved
|
|
183
|
+
* rhythmic foundation for players who can't read rhythm well.
|
|
184
|
+
*
|
|
185
|
+
* @example
|
|
186
|
+
* ```typescript
|
|
187
|
+
* const balancer = new RhythmicBalancer();
|
|
188
|
+
* const balanced = balancer.balance(composite, unifiedBeatMap);
|
|
189
|
+
*
|
|
190
|
+
* // Every measure now has at least 1 beat
|
|
191
|
+
* // Lone subdivision notes are shifted to downbeats
|
|
192
|
+
* // Upbeat notes have a downbeat nearby
|
|
193
|
+
* ```
|
|
194
|
+
*/
|
|
195
|
+
export declare class RhythmicBalancer {
|
|
196
|
+
private config;
|
|
197
|
+
constructor(config?: Partial<RhythmicBalanceConfig>);
|
|
198
|
+
/**
|
|
199
|
+
* Get the current configuration
|
|
200
|
+
*/
|
|
201
|
+
getConfig(): RhythmicBalanceConfig;
|
|
202
|
+
/**
|
|
203
|
+
* Balance a composite stream to enforce metric structure
|
|
204
|
+
*
|
|
205
|
+
* Processing order:
|
|
206
|
+
* 1. shiftLoneSubdivisionNotes() - Move lone offbeat notes to downbeats
|
|
207
|
+
* 2. fillEmptyMeasures() - Ensure every measure has a beat
|
|
208
|
+
* 3. enforceDownbeatProximity() - Ensure upbeats have nearby downbeats
|
|
209
|
+
* 4. removeMarginNotes() - Remove beats within start/end audio margin
|
|
210
|
+
*
|
|
211
|
+
* Each modified beat is tagged with a `balancerAction` field so the UI
|
|
212
|
+
* can visually distinguish balancer-modified beats from detected ones.
|
|
213
|
+
*
|
|
214
|
+
* @param composite - The composite stream to balance
|
|
215
|
+
* @param unifiedBeatMap - The unified beat map with measure/position info
|
|
216
|
+
* @returns A BalanceResult with the balanced composite and statistics
|
|
217
|
+
*/
|
|
218
|
+
balance(composite: CompositeStream, unifiedBeatMap: UnifiedBeatMap): BalanceResult;
|
|
219
|
+
/**
|
|
220
|
+
* Shift lone subdivision notes to downbeats
|
|
221
|
+
*
|
|
222
|
+
* For measures with exactly 1 beat where that beat is not on a downbeat,
|
|
223
|
+
* move it to the downbeat position.
|
|
224
|
+
*
|
|
225
|
+
* @param beats - Current beats array
|
|
226
|
+
* @param unifiedBeatMap - Unified beat map with measure info
|
|
227
|
+
* @returns Updated beats array
|
|
228
|
+
*/
|
|
229
|
+
private shiftLoneSubdivisionNotes;
|
|
230
|
+
/**
|
|
231
|
+
* Fill empty measures with a beat on beat 1 downbeat
|
|
232
|
+
*
|
|
233
|
+
* @param beats - Current beats array
|
|
234
|
+
* @param unifiedBeatMap - Unified beat map with measure info
|
|
235
|
+
* @returns Updated beats array with added beats
|
|
236
|
+
*/
|
|
237
|
+
private fillEmptyMeasures;
|
|
238
|
+
/**
|
|
239
|
+
* Enforce downbeat proximity for upbeat notes
|
|
240
|
+
*
|
|
241
|
+
* If an upbeat note has no downbeat within the configured range,
|
|
242
|
+
* shift it to the downbeat of its beat index.
|
|
243
|
+
*
|
|
244
|
+
* @param beats - Current beats array
|
|
245
|
+
* @param unifiedBeatMap - Unified beat map with measure info
|
|
246
|
+
* @returns Updated beats array
|
|
247
|
+
*/
|
|
248
|
+
private enforceDownbeatProximity;
|
|
249
|
+
/**
|
|
250
|
+
* Remove beats within the start/end audio margin
|
|
251
|
+
*
|
|
252
|
+
* Filters out beats whose timestamps fall within `marginSeconds` of
|
|
253
|
+
* the beginning or end of the audio file. This prevents unfair/unplayable
|
|
254
|
+
* notes at the very edges of a song where the player has no time to react.
|
|
255
|
+
*
|
|
256
|
+
* @param beats - Current beats array
|
|
257
|
+
* @param audioDuration - Total duration of the audio file in seconds
|
|
258
|
+
* @returns Updated beats array with margin beats removed
|
|
259
|
+
*/
|
|
260
|
+
private removeMarginNotes;
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=RhythmicBalancer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RhythmicBalancer.d.ts","sourceRoot":"","sources":["../../../../src/core/analysis/beat/RhythmicBalancer.ts"],"names":[],"mappings":"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"}
|