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.
Files changed (345) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +352 -0
  3. package/dist/__vite-browser-external-DYxpcVy9.js +4 -0
  4. package/dist/constants/DefaultClasses.d.ts +46 -0
  5. package/dist/constants/DefaultClasses.d.ts.map +1 -0
  6. package/dist/constants/DefaultEnchantments.d.ts +337 -0
  7. package/dist/constants/DefaultEnchantments.d.ts.map +1 -0
  8. package/dist/constants/DefaultEnemies.d.ts +83 -0
  9. package/dist/constants/DefaultEnemies.d.ts.map +1 -0
  10. package/dist/constants/DefaultEquipment.d.ts +23 -0
  11. package/dist/constants/DefaultEquipment.d.ts.map +1 -0
  12. package/dist/constants/DefaultFeatures.d.ts +22 -0
  13. package/dist/constants/DefaultFeatures.d.ts.map +1 -0
  14. package/dist/constants/DefaultRaces.d.ts +102 -0
  15. package/dist/constants/DefaultRaces.d.ts.map +1 -0
  16. package/dist/constants/DefaultSkills.d.ts +26 -0
  17. package/dist/constants/DefaultSkills.d.ts.map +1 -0
  18. package/dist/constants/DefaultSpells.d.ts +41 -0
  19. package/dist/constants/DefaultSpells.d.ts.map +1 -0
  20. package/dist/constants/EncounterBalance.d.ts +208 -0
  21. package/dist/constants/EncounterBalance.d.ts.map +1 -0
  22. package/dist/constants/EnemyEquipment.d.ts +71 -0
  23. package/dist/constants/EnemyEquipment.d.ts.map +1 -0
  24. package/dist/constants/EnemyRarity.d.ts +79 -0
  25. package/dist/constants/EnemyRarity.d.ts.map +1 -0
  26. package/dist/constants/EnemyTemplates/Construct.d.ts +63 -0
  27. package/dist/constants/EnemyTemplates/Construct.d.ts.map +1 -0
  28. package/dist/constants/EnemyTemplates/Dragon.d.ts +68 -0
  29. package/dist/constants/EnemyTemplates/Dragon.d.ts.map +1 -0
  30. package/dist/constants/EnemyTemplates/Elemental.d.ts +64 -0
  31. package/dist/constants/EnemyTemplates/Elemental.d.ts.map +1 -0
  32. package/dist/constants/EnemyTemplates/Fiend.d.ts +62 -0
  33. package/dist/constants/EnemyTemplates/Fiend.d.ts.map +1 -0
  34. package/dist/constants/EnemyTemplates/Monstrosity.d.ts +63 -0
  35. package/dist/constants/EnemyTemplates/Monstrosity.d.ts.map +1 -0
  36. package/dist/constants/EnemyTemplates/Undead.d.ts +61 -0
  37. package/dist/constants/EnemyTemplates/Undead.d.ts.map +1 -0
  38. package/dist/constants/ItemTemplates.d.ts +40 -0
  39. package/dist/constants/ItemTemplates.d.ts.map +1 -0
  40. package/dist/constants/MagicItems.d.ts +30 -0
  41. package/dist/constants/MagicItems.d.ts.map +1 -0
  42. package/dist/constants/SpellSlots.d.ts +30 -0
  43. package/dist/constants/SpellSlots.d.ts.map +1 -0
  44. package/dist/constants/StatScaling.d.ts +113 -0
  45. package/dist/constants/StatScaling.d.ts.map +1 -0
  46. package/dist/core/analysis/AudioAnalyzer.d.ts +599 -0
  47. package/dist/core/analysis/AudioAnalyzer.d.ts.map +1 -0
  48. package/dist/core/analysis/ColorExtractor.d.ts +64 -0
  49. package/dist/core/analysis/ColorExtractor.d.ts.map +1 -0
  50. package/dist/core/analysis/EssentiaPitchDetector.d.ts +282 -0
  51. package/dist/core/analysis/EssentiaPitchDetector.d.ts.map +1 -0
  52. package/dist/core/analysis/LevelSerializer.d.ts +265 -0
  53. package/dist/core/analysis/LevelSerializer.d.ts.map +1 -0
  54. package/dist/core/analysis/MelodyContourAnalyzer.d.ts +283 -0
  55. package/dist/core/analysis/MelodyContourAnalyzer.d.ts.map +1 -0
  56. package/dist/core/analysis/MultiBandAnalyzer.d.ts +214 -0
  57. package/dist/core/analysis/MultiBandAnalyzer.d.ts.map +1 -0
  58. package/dist/core/analysis/MusicClassifier.d.ts +524 -0
  59. package/dist/core/analysis/MusicClassifier.d.ts.map +1 -0
  60. package/dist/core/analysis/PitchAnalyzer.d.ts +266 -0
  61. package/dist/core/analysis/PitchAnalyzer.d.ts.map +1 -0
  62. package/dist/core/analysis/PitchDetector.d.ts +251 -0
  63. package/dist/core/analysis/PitchDetector.d.ts.map +1 -0
  64. package/dist/core/analysis/SpectrumScanner.d.ts +52 -0
  65. package/dist/core/analysis/SpectrumScanner.d.ts.map +1 -0
  66. package/dist/core/analysis/beat/BeatInterpolator.d.ts +477 -0
  67. package/dist/core/analysis/beat/BeatInterpolator.d.ts.map +1 -0
  68. package/dist/core/analysis/beat/BeatMapGenerator.d.ts +170 -0
  69. package/dist/core/analysis/beat/BeatMapGenerator.d.ts.map +1 -0
  70. package/dist/core/analysis/beat/BeatStream.d.ts +316 -0
  71. package/dist/core/analysis/beat/BeatStream.d.ts.map +1 -0
  72. package/dist/core/analysis/beat/BeatSubdivider.d.ts +205 -0
  73. package/dist/core/analysis/beat/BeatSubdivider.d.ts.map +1 -0
  74. package/dist/core/analysis/beat/BeatTracker.d.ts +137 -0
  75. package/dist/core/analysis/beat/BeatTracker.d.ts.map +1 -0
  76. package/dist/core/analysis/beat/CompositeStreamGenerator.d.ts +180 -0
  77. package/dist/core/analysis/beat/CompositeStreamGenerator.d.ts.map +1 -0
  78. package/dist/core/analysis/beat/DensityAnalyzer.d.ts +246 -0
  79. package/dist/core/analysis/beat/DensityAnalyzer.d.ts.map +1 -0
  80. package/dist/core/analysis/beat/DifficultyVariantGenerator.d.ts +1082 -0
  81. package/dist/core/analysis/beat/DifficultyVariantGenerator.d.ts.map +1 -0
  82. package/dist/core/analysis/beat/GrooveAnalyzer.d.ts +192 -0
  83. package/dist/core/analysis/beat/GrooveAnalyzer.d.ts.map +1 -0
  84. package/dist/core/analysis/beat/OnsetStrengthEnvelope.d.ts +133 -0
  85. package/dist/core/analysis/beat/OnsetStrengthEnvelope.d.ts.map +1 -0
  86. package/dist/core/analysis/beat/PhraseAnalyzer.d.ts +230 -0
  87. package/dist/core/analysis/beat/PhraseAnalyzer.d.ts.map +1 -0
  88. package/dist/core/analysis/beat/RhythmQuantizer.d.ts +399 -0
  89. package/dist/core/analysis/beat/RhythmQuantizer.d.ts.map +1 -0
  90. package/dist/core/analysis/beat/RhythmicBalancer.d.ts +262 -0
  91. package/dist/core/analysis/beat/RhythmicBalancer.d.ts.map +1 -0
  92. package/dist/core/analysis/beat/StreamScorer.d.ts +275 -0
  93. package/dist/core/analysis/beat/StreamScorer.d.ts.map +1 -0
  94. package/dist/core/analysis/beat/TempoAwareQuantizer.d.ts +256 -0
  95. package/dist/core/analysis/beat/TempoAwareQuantizer.d.ts.map +1 -0
  96. package/dist/core/analysis/beat/TempoDetector.d.ts +220 -0
  97. package/dist/core/analysis/beat/TempoDetector.d.ts.map +1 -0
  98. package/dist/core/analysis/beat/TransientDetector.d.ts +303 -0
  99. package/dist/core/analysis/beat/TransientDetector.d.ts.map +1 -0
  100. package/dist/core/analysis/beat/beatKeyHelpers.d.ts +180 -0
  101. package/dist/core/analysis/beat/beatKeyHelpers.d.ts.map +1 -0
  102. package/dist/core/analysis/beat/index.d.ts +41 -0
  103. package/dist/core/analysis/beat/index.d.ts.map +1 -0
  104. package/dist/core/analysis/beat/utils/audioUtils.d.ts +204 -0
  105. package/dist/core/analysis/beat/utils/audioUtils.d.ts.map +1 -0
  106. package/dist/core/analysis/beat/utils/beatInterpolationDebug.d.ts +404 -0
  107. package/dist/core/analysis/beat/utils/beatInterpolationDebug.d.ts.map +1 -0
  108. package/dist/core/analysis/beat/utils/subdivideBeatMap.d.ts +61 -0
  109. package/dist/core/analysis/beat/utils/subdivideBeatMap.d.ts.map +1 -0
  110. package/dist/core/analysis/beat/utils/unifyBeatMap.d.ts +33 -0
  111. package/dist/core/analysis/beat/utils/unifyBeatMap.d.ts.map +1 -0
  112. package/dist/core/analysis/index.d.ts +18 -0
  113. package/dist/core/analysis/index.d.ts.map +1 -0
  114. package/dist/core/combat/AI/AICombatRunner.d.ts +108 -0
  115. package/dist/core/combat/AI/AICombatRunner.d.ts.map +1 -0
  116. package/dist/core/combat/AI/CombatAI.d.ts +179 -0
  117. package/dist/core/combat/AI/CombatAI.d.ts.map +1 -0
  118. package/dist/core/combat/AI/CombatMetricsTracker.d.ts +30 -0
  119. package/dist/core/combat/AI/CombatMetricsTracker.d.ts.map +1 -0
  120. package/dist/core/combat/Analysis/BalanceValidator.d.ts +170 -0
  121. package/dist/core/combat/Analysis/BalanceValidator.d.ts.map +1 -0
  122. package/dist/core/combat/Analysis/ComparativeAnalyzer.d.ts +231 -0
  123. package/dist/core/combat/Analysis/ComparativeAnalyzer.d.ts.map +1 -0
  124. package/dist/core/combat/Analysis/DifficultyCalculator.d.ts +203 -0
  125. package/dist/core/combat/Analysis/DifficultyCalculator.d.ts.map +1 -0
  126. package/dist/core/combat/Analysis/ParameterSweep.d.ts +201 -0
  127. package/dist/core/combat/Analysis/ParameterSweep.d.ts.map +1 -0
  128. package/dist/core/combat/AttackResolver.d.ts +220 -0
  129. package/dist/core/combat/AttackResolver.d.ts.map +1 -0
  130. package/dist/core/combat/CombatEngine.d.ts +388 -0
  131. package/dist/core/combat/CombatEngine.d.ts.map +1 -0
  132. package/dist/core/combat/DiceRoller.d.ts +115 -0
  133. package/dist/core/combat/DiceRoller.d.ts.map +1 -0
  134. package/dist/core/combat/InitiativeRoller.d.ts +62 -0
  135. package/dist/core/combat/InitiativeRoller.d.ts.map +1 -0
  136. package/dist/core/combat/PartyAnalyzer.d.ts +215 -0
  137. package/dist/core/combat/PartyAnalyzer.d.ts.map +1 -0
  138. package/dist/core/combat/SeededDiceRoller.d.ts +120 -0
  139. package/dist/core/combat/SeededDiceRoller.d.ts.map +1 -0
  140. package/dist/core/combat/Simulation/CombatSimulator.d.ts +366 -0
  141. package/dist/core/combat/Simulation/CombatSimulator.d.ts.map +1 -0
  142. package/dist/core/combat/SpellCaster.d.ts +113 -0
  143. package/dist/core/combat/SpellCaster.d.ts.map +1 -0
  144. package/dist/core/config/index.d.ts +24 -0
  145. package/dist/core/config/index.d.ts.map +1 -0
  146. package/dist/core/config/progressionConfig.d.ts +73 -0
  147. package/dist/core/config/progressionConfig.d.ts.map +1 -0
  148. package/dist/core/config/sensorConfig.d.ts +134 -0
  149. package/dist/core/config/sensorConfig.d.ts.map +1 -0
  150. package/dist/core/equipment/BoxOpener.d.ts +175 -0
  151. package/dist/core/equipment/BoxOpener.d.ts.map +1 -0
  152. package/dist/core/equipment/EquipmentEffectApplier.d.ts +189 -0
  153. package/dist/core/equipment/EquipmentEffectApplier.d.ts.map +1 -0
  154. package/dist/core/equipment/EquipmentModifier.d.ts +327 -0
  155. package/dist/core/equipment/EquipmentModifier.d.ts.map +1 -0
  156. package/dist/core/equipment/EquipmentSpawnHelper.d.ts +246 -0
  157. package/dist/core/equipment/EquipmentSpawnHelper.d.ts.map +1 -0
  158. package/dist/core/equipment/EquipmentValidator.d.ts +173 -0
  159. package/dist/core/equipment/EquipmentValidator.d.ts.map +1 -0
  160. package/dist/core/extensions/ExtensionManager.d.ts +517 -0
  161. package/dist/core/extensions/ExtensionManager.d.ts.map +1 -0
  162. package/dist/core/extensions/WeightedSelector.d.ts +156 -0
  163. package/dist/core/extensions/WeightedSelector.d.ts.map +1 -0
  164. package/dist/core/extensions/index.d.ts +11 -0
  165. package/dist/core/extensions/index.d.ts.map +1 -0
  166. package/dist/core/extensions/initializeDefaults.d.ts +170 -0
  167. package/dist/core/extensions/initializeDefaults.d.ts.map +1 -0
  168. package/dist/core/features/FeatureEffectApplier.d.ts +102 -0
  169. package/dist/core/features/FeatureEffectApplier.d.ts.map +1 -0
  170. package/dist/core/features/FeatureQuery.d.ts +368 -0
  171. package/dist/core/features/FeatureQuery.d.ts.map +1 -0
  172. package/dist/core/features/FeatureTypes.d.ts +199 -0
  173. package/dist/core/features/FeatureTypes.d.ts.map +1 -0
  174. package/dist/core/features/FeatureValidator.d.ts +149 -0
  175. package/dist/core/features/FeatureValidator.d.ts.map +1 -0
  176. package/dist/core/features/index.d.ts +12 -0
  177. package/dist/core/features/index.d.ts.map +1 -0
  178. package/dist/core/generation/AbilityScoreCalculator.d.ts +83 -0
  179. package/dist/core/generation/AbilityScoreCalculator.d.ts.map +1 -0
  180. package/dist/core/generation/AppearanceGenerator.d.ts +32 -0
  181. package/dist/core/generation/AppearanceGenerator.d.ts.map +1 -0
  182. package/dist/core/generation/BeatConverter.d.ts +127 -0
  183. package/dist/core/generation/BeatConverter.d.ts.map +1 -0
  184. package/dist/core/generation/ButtonMapper.d.ts +346 -0
  185. package/dist/core/generation/ButtonMapper.d.ts.map +1 -0
  186. package/dist/core/generation/ButtonPatternLibrary.d.ts +92 -0
  187. package/dist/core/generation/ButtonPatternLibrary.d.ts.map +1 -0
  188. package/dist/core/generation/CRLevelConverter.d.ts +242 -0
  189. package/dist/core/generation/CRLevelConverter.d.ts.map +1 -0
  190. package/dist/core/generation/CharacterGenerator.d.ts +194 -0
  191. package/dist/core/generation/CharacterGenerator.d.ts.map +1 -0
  192. package/dist/core/generation/ClassSuggester.d.ts +184 -0
  193. package/dist/core/generation/ClassSuggester.d.ts.map +1 -0
  194. package/dist/core/generation/EnemyEquipmentGenerator.d.ts +151 -0
  195. package/dist/core/generation/EnemyEquipmentGenerator.d.ts.map +1 -0
  196. package/dist/core/generation/EnemyGenerator.d.ts +595 -0
  197. package/dist/core/generation/EnemyGenerator.d.ts.map +1 -0
  198. package/dist/core/generation/EquipmentGenerator.d.ts +204 -0
  199. package/dist/core/generation/EquipmentGenerator.d.ts.map +1 -0
  200. package/dist/core/generation/LegendaryGenerator.d.ts +213 -0
  201. package/dist/core/generation/LegendaryGenerator.d.ts.map +1 -0
  202. package/dist/core/generation/LevelGenerator.d.ts +390 -0
  203. package/dist/core/generation/LevelGenerator.d.ts.map +1 -0
  204. package/dist/core/generation/NamingEngine.d.ts +136 -0
  205. package/dist/core/generation/NamingEngine.d.ts.map +1 -0
  206. package/dist/core/generation/PitchBeatLinker.d.ts +150 -0
  207. package/dist/core/generation/PitchBeatLinker.d.ts.map +1 -0
  208. package/dist/core/generation/RaceSelector.d.ts +58 -0
  209. package/dist/core/generation/RaceSelector.d.ts.map +1 -0
  210. package/dist/core/generation/RhythmGenerator.d.ts +597 -0
  211. package/dist/core/generation/RhythmGenerator.d.ts.map +1 -0
  212. package/dist/core/generation/SkillAssigner.d.ts +78 -0
  213. package/dist/core/generation/SkillAssigner.d.ts.map +1 -0
  214. package/dist/core/generation/SpellManager.d.ts +132 -0
  215. package/dist/core/generation/SpellManager.d.ts.map +1 -0
  216. package/dist/core/generation/SpellcastingGenerator.d.ts +255 -0
  217. package/dist/core/generation/SpellcastingGenerator.d.ts.map +1 -0
  218. package/dist/core/generation/index.d.ts +41 -0
  219. package/dist/core/generation/index.d.ts.map +1 -0
  220. package/dist/core/parser/MetadataExtractor.d.ts +66 -0
  221. package/dist/core/parser/MetadataExtractor.d.ts.map +1 -0
  222. package/dist/core/parser/PlaylistParser.d.ts +45 -0
  223. package/dist/core/parser/PlaylistParser.d.ts.map +1 -0
  224. package/dist/core/playback/SubdivisionPlaybackController.d.ts +333 -0
  225. package/dist/core/playback/SubdivisionPlaybackController.d.ts.map +1 -0
  226. package/dist/core/playback/index.d.ts +5 -0
  227. package/dist/core/playback/index.d.ts.map +1 -0
  228. package/dist/core/progression/CharacterUpdater.d.ts +203 -0
  229. package/dist/core/progression/CharacterUpdater.d.ts.map +1 -0
  230. package/dist/core/progression/LevelUpProcessor.d.ts +234 -0
  231. package/dist/core/progression/LevelUpProcessor.d.ts.map +1 -0
  232. package/dist/core/progression/PrestigeSystem.d.ts +217 -0
  233. package/dist/core/progression/PrestigeSystem.d.ts.map +1 -0
  234. package/dist/core/progression/RhythmXPCalculator.d.ts +182 -0
  235. package/dist/core/progression/RhythmXPCalculator.d.ts.map +1 -0
  236. package/dist/core/progression/SessionTracker.d.ts +169 -0
  237. package/dist/core/progression/SessionTracker.d.ts.map +1 -0
  238. package/dist/core/progression/XPCalculator.d.ts +128 -0
  239. package/dist/core/progression/XPCalculator.d.ts.map +1 -0
  240. package/dist/core/progression/stat/StatIncreaseStrategy.d.ts +97 -0
  241. package/dist/core/progression/stat/StatIncreaseStrategy.d.ts.map +1 -0
  242. package/dist/core/progression/stat/StatManager.d.ts +179 -0
  243. package/dist/core/progression/stat/StatManager.d.ts.map +1 -0
  244. package/dist/core/sensors/EnvironmentalSensors.d.ts +301 -0
  245. package/dist/core/sensors/EnvironmentalSensors.d.ts.map +1 -0
  246. package/dist/core/sensors/GamingPlatformSensors.d.ts +162 -0
  247. package/dist/core/sensors/GamingPlatformSensors.d.ts.map +1 -0
  248. package/dist/core/sensors/GeolocationProvider.d.ts +156 -0
  249. package/dist/core/sensors/GeolocationProvider.d.ts.map +1 -0
  250. package/dist/core/sensors/MotionDetector.d.ts +58 -0
  251. package/dist/core/sensors/MotionDetector.d.ts.map +1 -0
  252. package/dist/core/sensors/SteamAPIClient.d.ts +108 -0
  253. package/dist/core/sensors/SteamAPIClient.d.ts.map +1 -0
  254. package/dist/core/sensors/WeatherAPIClient.d.ts +360 -0
  255. package/dist/core/sensors/WeatherAPIClient.d.ts.map +1 -0
  256. package/dist/core/sensors/schemas/weather.schema.d.ts +144 -0
  257. package/dist/core/sensors/schemas/weather.schema.d.ts.map +1 -0
  258. package/dist/core/skills/SkillQuery.d.ts +159 -0
  259. package/dist/core/skills/SkillQuery.d.ts.map +1 -0
  260. package/dist/core/skills/SkillTypes.d.ts +233 -0
  261. package/dist/core/skills/SkillTypes.d.ts.map +1 -0
  262. package/dist/core/skills/SkillValidator.d.ts +146 -0
  263. package/dist/core/skills/SkillValidator.d.ts.map +1 -0
  264. package/dist/core/skills/index.d.ts +11 -0
  265. package/dist/core/skills/index.d.ts.map +1 -0
  266. package/dist/core/spells/SpellQuery.d.ts +194 -0
  267. package/dist/core/spells/SpellQuery.d.ts.map +1 -0
  268. package/dist/core/spells/SpellTypes.d.ts +71 -0
  269. package/dist/core/spells/SpellTypes.d.ts.map +1 -0
  270. package/dist/core/spells/SpellValidator.d.ts +129 -0
  271. package/dist/core/spells/SpellValidator.d.ts.map +1 -0
  272. package/dist/core/spells/index.d.ts +11 -0
  273. package/dist/core/spells/index.d.ts.map +1 -0
  274. package/dist/core/types/AudioProfile.d.ts +143 -0
  275. package/dist/core/types/AudioProfile.d.ts.map +1 -0
  276. package/dist/core/types/BeatMap.d.ts +1825 -0
  277. package/dist/core/types/BeatMap.d.ts.map +1 -0
  278. package/dist/core/types/ButtonMapping.d.ts +345 -0
  279. package/dist/core/types/ButtonMapping.d.ts.map +1 -0
  280. package/dist/core/types/Character.d.ts +397 -0
  281. package/dist/core/types/Character.d.ts.map +1 -0
  282. package/dist/core/types/ChartedBeatMap.d.ts +169 -0
  283. package/dist/core/types/ChartedBeatMap.d.ts.map +1 -0
  284. package/dist/core/types/Combat.d.ts +268 -0
  285. package/dist/core/types/Combat.d.ts.map +1 -0
  286. package/dist/core/types/CombatAI.d.ts +143 -0
  287. package/dist/core/types/CombatAI.d.ts.map +1 -0
  288. package/dist/core/types/Enemy.d.ts +447 -0
  289. package/dist/core/types/Enemy.d.ts.map +1 -0
  290. package/dist/core/types/Environmental.d.ts +213 -0
  291. package/dist/core/types/Environmental.d.ts.map +1 -0
  292. package/dist/core/types/Equipment.d.ts +309 -0
  293. package/dist/core/types/Equipment.d.ts.map +1 -0
  294. package/dist/core/types/ISessionTracker.d.ts +48 -0
  295. package/dist/core/types/ISessionTracker.d.ts.map +1 -0
  296. package/dist/core/types/LevelExport.d.ts +366 -0
  297. package/dist/core/types/LevelExport.d.ts.map +1 -0
  298. package/dist/core/types/Playlist.d.ts +70 -0
  299. package/dist/core/types/Playlist.d.ts.map +1 -0
  300. package/dist/core/types/Prestige.d.ts +94 -0
  301. package/dist/core/types/Prestige.d.ts.map +1 -0
  302. package/dist/core/types/Progression.d.ts +214 -0
  303. package/dist/core/types/Progression.d.ts.map +1 -0
  304. package/dist/core/types/RhythmXP.d.ts +398 -0
  305. package/dist/core/types/RhythmXP.d.ts.map +1 -0
  306. package/dist/core/utils/AbilityConstants.d.ts +31 -0
  307. package/dist/core/utils/AbilityConstants.d.ts.map +1 -0
  308. package/dist/core/utils/EffectApplierUtils.d.ts +56 -0
  309. package/dist/core/utils/EffectApplierUtils.d.ts.map +1 -0
  310. package/dist/core/utils/ImageValidator.d.ts +66 -0
  311. package/dist/core/utils/ImageValidator.d.ts.map +1 -0
  312. package/dist/core/utils/PrerequisiteValidator.d.ts +88 -0
  313. package/dist/core/utils/PrerequisiteValidator.d.ts.map +1 -0
  314. package/dist/essentia-wasm.es-BUEnKUts.js +2990 -0
  315. package/dist/essentia.js-model.es-CGA0xotH.js +306 -0
  316. package/dist/index.d.ts +176 -0
  317. package/dist/index.d.ts.map +1 -0
  318. package/dist/playlist-data-engine.js +124 -0
  319. package/dist/playlist-data-engine.mjs +49251 -0
  320. package/dist/utils/EnchantmentLibrary.d.ts +378 -0
  321. package/dist/utils/EnchantmentLibrary.d.ts.map +1 -0
  322. package/dist/utils/arweaveGatewayManager.d.ts +485 -0
  323. package/dist/utils/arweaveGatewayManager.d.ts.map +1 -0
  324. package/dist/utils/arweaveUtils.d.ts +118 -0
  325. package/dist/utils/arweaveUtils.d.ts.map +1 -0
  326. package/dist/utils/constants.d.ts +439 -0
  327. package/dist/utils/constants.d.ts.map +1 -0
  328. package/dist/utils/equipmentConstants.d.ts +60 -0
  329. package/dist/utils/equipmentConstants.d.ts.map +1 -0
  330. package/dist/utils/hash.d.ts +33 -0
  331. package/dist/utils/hash.d.ts.map +1 -0
  332. package/dist/utils/logger.d.ts +192 -0
  333. package/dist/utils/logger.d.ts.map +1 -0
  334. package/dist/utils/magicItemExamples.d.ts +46 -0
  335. package/dist/utils/magicItemExamples.d.ts.map +1 -0
  336. package/dist/utils/playlistUtils.d.ts +149 -0
  337. package/dist/utils/playlistUtils.d.ts.map +1 -0
  338. package/dist/utils/random.d.ts +34 -0
  339. package/dist/utils/random.d.ts.map +1 -0
  340. package/dist/utils/sensorDashboard.d.ts +60 -0
  341. package/dist/utils/sensorDashboard.d.ts.map +1 -0
  342. package/dist/utils/validators.d.ts +189 -0
  343. package/dist/utils/validators.d.ts.map +1 -0
  344. package/dist/vite.svg +1 -0
  345. 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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"}