@nice2dev/ui-audio 1.0.28 → 1.0.29

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 (69) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +52 -14
  3. package/dist/core/audioIcons.d.ts +10 -0
  4. package/dist/core/audioIcons.d.ts.map +1 -0
  5. package/dist/editor/AudioEditorPianoRoll.d.ts.map +1 -1
  6. package/dist/editor/AudioLayerDetails.d.ts.map +1 -1
  7. package/dist/editor/AudioStudio.d.ts +51 -0
  8. package/dist/editor/AudioStudio.d.ts.map +1 -0
  9. package/dist/editor/NiceSampleBrowser.d.ts.map +1 -1
  10. package/dist/editor/PianoRoll.d.ts.map +1 -1
  11. package/dist/editor/nav/AudioTimelineNav.d.ts.map +1 -1
  12. package/dist/editor/panels/AdvancedEditingPanel.d.ts.map +1 -1
  13. package/dist/editor/panels/LFOPanel.d.ts.map +1 -1
  14. package/dist/editor/panels/ProjectPanel.d.ts.map +1 -1
  15. package/dist/editor/panels/StepSequencerPanel.d.ts.map +1 -1
  16. package/dist/engine/NiceAudioEffectsRack.d.ts.map +1 -1
  17. package/dist/engine/instrumentPresets.d.ts +1 -1
  18. package/dist/engine/instrumentPresets.d.ts.map +1 -1
  19. package/dist/index.cjs +58 -67
  20. package/dist/index.d.ts +36 -0
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.mjs +24672 -19789
  23. package/dist/input/AudioInputPicker.d.ts +43 -0
  24. package/dist/input/AudioInputPicker.d.ts.map +1 -0
  25. package/dist/input/VocalEffectsRack.d.ts +15 -0
  26. package/dist/input/VocalEffectsRack.d.ts.map +1 -0
  27. package/dist/karaoke/KaraokeLyrics.d.ts.map +1 -1
  28. package/dist/karaoke/KaraokeManager.d.ts +104 -0
  29. package/dist/karaoke/KaraokeManager.d.ts.map +1 -0
  30. package/dist/karaoke/KaraokeSelectionMode.d.ts +26 -0
  31. package/dist/karaoke/KaraokeSelectionMode.d.ts.map +1 -0
  32. package/dist/karaoke/KaraokeSessionJoin.d.ts +41 -0
  33. package/dist/karaoke/KaraokeSessionJoin.d.ts.map +1 -0
  34. package/dist/karaoke/KaraokeSetupPanel.d.ts +31 -0
  35. package/dist/karaoke/KaraokeSetupPanel.d.ts.map +1 -0
  36. package/dist/karaoke/KaraokeSongBrowser.d.ts +62 -0
  37. package/dist/karaoke/KaraokeSongBrowser.d.ts.map +1 -0
  38. package/dist/karaoke/KaraokeSummaryOverlay.d.ts +9 -1
  39. package/dist/karaoke/KaraokeSummaryOverlay.d.ts.map +1 -1
  40. package/dist/karaoke/KaraokeUploader.d.ts +23 -0
  41. package/dist/karaoke/KaraokeUploader.d.ts.map +1 -0
  42. package/dist/karaoke/LatencyCalibrator.d.ts +18 -0
  43. package/dist/karaoke/LatencyCalibrator.d.ts.map +1 -0
  44. package/dist/karaoke/PadKaraokeOverlay.d.ts +16 -0
  45. package/dist/karaoke/PadKaraokeOverlay.d.ts.map +1 -0
  46. package/dist/karaoke/VocalPerformanceReport.d.ts +21 -0
  47. package/dist/karaoke/VocalPerformanceReport.d.ts.map +1 -0
  48. package/dist/karaoke/rendering/glossyBarRenderer.d.ts.map +1 -1
  49. package/dist/karaoke/useKaraokePitch.d.ts +90 -0
  50. package/dist/karaoke/useKaraokePitch.d.ts.map +1 -0
  51. package/dist/karaoke/useKaraokeScoring.d.ts +49 -0
  52. package/dist/karaoke/useKaraokeScoring.d.ts.map +1 -0
  53. package/dist/karaokeEditor/KaraokeEditorManager.d.ts.map +1 -1
  54. package/dist/library/MusicLibraryExplorer.d.ts +31 -0
  55. package/dist/library/MusicLibraryExplorer.d.ts.map +1 -0
  56. package/dist/lighting/NiceDMXTimeline.d.ts.map +1 -1
  57. package/dist/player/GenericPlayer.d.ts.map +1 -1
  58. package/dist/player/GenericPlayerControls.d.ts.map +1 -1
  59. package/dist/player/GenericPlayerTrackList.d.ts.map +1 -1
  60. package/dist/player/visualizer/StageVisualizer.d.ts +6 -0
  61. package/dist/player/visualizer/StageVisualizer.d.ts.map +1 -1
  62. package/dist/playlist/DynamicRuleEditor.d.ts.map +1 -1
  63. package/dist/playlist/GenericPlaylistItem.d.ts.map +1 -1
  64. package/dist/playlist/PlaylistImportWizard.d.ts.map +1 -1
  65. package/dist/radio/NiceRadioPlayer.d.ts.map +1 -1
  66. package/dist/ui-audio.css +1 -1
  67. package/dist/utils/vocalEffectsEngine.d.ts +1 -1
  68. package/dist/utils/vocalEffectsEngine.d.ts.map +1 -1
  69. package/package.json +8 -2
@@ -0,0 +1,43 @@
1
+ import { default as React } from 'react';
2
+ import { NiceTranslateFn } from '../core/i18n';
3
+ export interface AudioInputSettings {
4
+ /** Pitch-detection algorithm ('pitchy' | 'autocorrelation' | 'librosa' | 'crepe'). */
5
+ algorithm: string;
6
+ /** Mic gain multiplier (0–3, 1 = unity). */
7
+ gain: number;
8
+ /** RMS gate threshold (0–0.2). */
9
+ rmsThreshold: number;
10
+ /** Pitch clarity threshold (0–1). */
11
+ pitchThreshold: number;
12
+ /** Rolling-average window (frames). */
13
+ smoothingWindow: number;
14
+ /** Silent frames tolerated before zeroing pitch. */
15
+ hysteresisFrames: number;
16
+ /** Apply a Hanning window before detection. */
17
+ useHanning: boolean;
18
+ /** Latency offset in ms. */
19
+ offsetMs: number;
20
+ }
21
+ export declare const DEFAULT_AUDIO_INPUT_SETTINGS: AudioInputSettings;
22
+ export interface NiceAudioInputPickerProps {
23
+ deviceId?: string;
24
+ onDeviceChange?: (deviceId: string) => void;
25
+ settings?: Partial<AudioInputSettings>;
26
+ onSettingsChange?: (settings: AudioInputSettings) => void;
27
+ /** Microphone devices. If omitted, they are enumerated. */
28
+ audioInputs?: MediaDeviceInfo[];
29
+ /** Available algorithms (default: pitchy / autocorrelation / librosa / crepe). */
30
+ algorithms?: {
31
+ value: string;
32
+ label: string;
33
+ }[];
34
+ /** Show the "Test mic" live level meter (default true). */
35
+ showLevelMeter?: boolean;
36
+ /** Show a "Calibrate latency" action for the selected device. */
37
+ onCalibrate?: (deviceId: string) => void;
38
+ compact?: boolean;
39
+ t?: NiceTranslateFn;
40
+ }
41
+ export declare const NiceAudioInputPicker: React.FC<NiceAudioInputPickerProps>;
42
+ export default NiceAudioInputPicker;
43
+ //# sourceMappingURL=AudioInputPicker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioInputPicker.d.ts","sourceRoot":"","sources":["../../src/input/AudioInputPicker.tsx"],"names":[],"mappings":"AAUA,OAAO,KAA+C,MAAM,OAAO,CAAC;AAGpE,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAExE,MAAM,WAAW,kBAAkB;IACjC,sFAAsF;IACtF,SAAS,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,uCAAuC;IACvC,eAAe,EAAE,MAAM,CAAC;IACxB,oDAAoD;IACpD,gBAAgB,EAAE,MAAM,CAAC;IACzB,+CAA+C;IAC/C,UAAU,EAAE,OAAO,CAAC;IACpB,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,4BAA4B,EAAE,kBAS1C,CAAC;AAEF,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACvC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC1D,2DAA2D;IAC3D,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;IAChC,kFAAkF;IAClF,UAAU,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAChD,2DAA2D;IAC3D,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iEAAiE;IACjE,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,CAAC,CAAC,EAAE,eAAe,CAAC;CACrB;AASD,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC,yBAAyB,CAoRpE,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { NiceBaseProps } from '@nice2dev/ui-core';
2
+ import { default as React } from 'react';
3
+ import { NiceTranslateFn } from '../core/i18n';
4
+ export interface NiceVocalEffectsRackProps extends NiceBaseProps {
5
+ /** Mic device ID. If omitted, the default device is used. */
6
+ deviceId?: string;
7
+ /** Existing MediaStream (skip getUserMedia). */
8
+ mediaStream?: MediaStream;
9
+ /** Compact layout. */
10
+ compact?: boolean;
11
+ t?: NiceTranslateFn;
12
+ }
13
+ export declare const NiceVocalEffectsRack: React.FC<NiceVocalEffectsRackProps>;
14
+ export default NiceVocalEffectsRack;
15
+ //# sourceMappingURL=VocalEffectsRack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VocalEffectsRack.d.ts","sourceRoot":"","sources":["../../src/input/VocalEffectsRack.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAmD,MAAM,OAAO,CAAC;AAiBxE,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAyBxE,MAAM,WAAW,yBAA0B,SAAQ,aAAa;IAC9D,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,sBAAsB;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,CAAC,CAAC,EAAE,eAAe,CAAC;CACrB;AAED,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC,yBAAyB,CA4VpE,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"KaraokeLyrics.d.ts","sourceRoot":"","sources":["../../src/karaoke/KaraokeLyrics.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAGvC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,UAAU,kBAAkB;IAC1B,IAAI,EAAE,eAAe,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;;AA2MD,wBAAyC"}
1
+ {"version":3,"file":"KaraokeLyrics.d.ts","sourceRoot":"","sources":["../../src/karaoke/KaraokeLyrics.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAIvC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,UAAU,kBAAkB;IAC1B,IAAI,EAAE,eAAe,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;;AAsND,wBAAyC"}
@@ -0,0 +1,104 @@
1
+ import { NiceBaseProps } from '@nice2dev/ui-core';
2
+ import { default as React } from 'react';
3
+ import { DifficultyLevel } from '../constants/karaokeScoringConfig';
4
+ import { NiceTranslateFn } from '../core/i18n';
5
+ import { KaraokeSongFile, TopSinging } from '../models/modelsKaraoke';
6
+ import { KaraokeRtcService } from './useKaraokePitch';
7
+ /** A player taking part in the karaoke round. */
8
+ export interface NiceKaraokePlayer {
9
+ id: number;
10
+ name: string;
11
+ /** CSS color for this player's timeline/score. */
12
+ color?: string;
13
+ /** Assigned microphone deviceId (no mic = spectator, no pitch detection). */
14
+ micId?: string | null;
15
+ }
16
+ /** Per-player result row passed to `onSaveResults`. */
17
+ export interface KaraokeResultEntry {
18
+ playerId: number;
19
+ songId: number;
20
+ score: number;
21
+ hits: number;
22
+ misses: number;
23
+ good: number;
24
+ perfect: number;
25
+ combo: number;
26
+ }
27
+ export interface NiceKaraokeManagerProps extends NiceBaseProps {
28
+ /** Players singing this round. */
29
+ players: NiceKaraokePlayer[];
30
+ /** Controlled song. When provided, the manager follows changes to this prop. */
31
+ song?: KaraokeSongFile | null;
32
+ /** Initial song (uncontrolled). */
33
+ initialSong?: KaraokeSongFile | null;
34
+ difficulty?: DifficultyLevel;
35
+ /** Game mode passed through to track building + hooks (e.g. 'normal', 'demo'). */
36
+ gameMode?: string;
37
+ /** Player/stage height in px. */
38
+ height?: number;
39
+ /** Render the per-player pitch timelines (default true). */
40
+ showTimelines?: boolean;
41
+ /** Render the synchronized lyrics overlay (default true). */
42
+ showLyrics?: boolean;
43
+ /** Render only the active mic player's timeline rather than all players. */
44
+ singleTimeline?: boolean;
45
+ /** Ask for microphone permission on activation (default true). */
46
+ requestMicPermission?: boolean;
47
+ /** Start with audio already activated (skip the tap-to-start overlay) when a
48
+ * prior user gesture already unlocked audio. Does NOT auto-play. */
49
+ initiallyActivated?: boolean;
50
+ /** Show the built-in UltraStar uploader when no song is loaded. */
51
+ showUploader?: boolean;
52
+ /** Optional backend UltraStar parser for the uploader (else parsed client-side). */
53
+ parseSong?: (file: {
54
+ fileName: string;
55
+ data: string;
56
+ }) => Promise<KaraokeSongFile>;
57
+ micAlgorithms?: {
58
+ [playerId: number]: string;
59
+ };
60
+ defaultPitchAlgorithm?: string;
61
+ micRmsThresholds?: {
62
+ [micId: string]: number;
63
+ };
64
+ micOffsets?: {
65
+ [micId: string]: number;
66
+ };
67
+ micGains?: {
68
+ [micId: string]: number;
69
+ };
70
+ micPitchThresholds?: {
71
+ [micId: string]: number;
72
+ };
73
+ micSmoothingWindows?: {
74
+ [micId: string]: number;
75
+ };
76
+ micHysteresisFrames?: {
77
+ [micId: string]: number;
78
+ };
79
+ micUseHanning?: {
80
+ [micId: string]: boolean;
81
+ };
82
+ micMonitorEnabled?: {
83
+ [micId: string]: boolean;
84
+ };
85
+ micMonitorVolumes?: {
86
+ [micId: string]: number;
87
+ };
88
+ searchYouTubeByArtistTitle?: (artist: string, title: string) => Promise<string | null>;
89
+ fetchTopSingings?: (songId: number) => Promise<TopSinging[]>;
90
+ onSaveResults?: (results: KaraokeResultEntry[]) => Promise<void> | void;
91
+ rtc?: KaraokeRtcService | null;
92
+ onSongChange?: (song: KaraokeSongFile | null) => void;
93
+ onPlayingChange?: (playing: boolean) => void;
94
+ onTimeUpdate?: (time: number) => void;
95
+ onEnded?: () => void;
96
+ /** Called when the user picks "Continue" on the summary. */
97
+ onContinue?: () => void;
98
+ /** Inject a post-performance report modal (e.g. NiceVocalPerformanceReport). */
99
+ renderReport?: (close: () => void) => React.ReactNode;
100
+ t?: NiceTranslateFn;
101
+ }
102
+ export declare const NiceKaraokeManager: React.FC<NiceKaraokeManagerProps>;
103
+ export default NiceKaraokeManager;
104
+ //# sourceMappingURL=KaraokeManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KaraokeManager.d.ts","sourceRoot":"","sources":["../../src/karaoke/KaraokeManager.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { NiceBaseProps } from '@nice2dev/ui-core';
2
+ import { default as React } from 'react';
3
+ import { NiceTranslateFn } from '../core/i18n';
4
+ export type SongSelectionMode = 'freeForAll' | 'roundRobin' | 'hostOnly' | 'firstCome';
5
+ export interface SelectionModePlayer {
6
+ name?: string | null;
7
+ }
8
+ export interface NiceKaraokeSelectionModeProps extends NiceBaseProps {
9
+ players: SelectionModePlayer[];
10
+ mode: SongSelectionMode;
11
+ onModeChange?: (mode: SongSelectionMode) => void;
12
+ /** Seconds per turn in roundRobin (0 = no limit). */
13
+ turnTimeSec?: number;
14
+ /** Index of the host/organizer (-1 = none). */
15
+ hostIndex?: number;
16
+ /** Notified when the allowed-to-pick player changes (index; -1 = all). */
17
+ onActivePlayerChange?: (playerIndex: number) => void;
18
+ /** The current user's player index (for visual feedback). */
19
+ myPlayerIndex?: number;
20
+ t?: NiceTranslateFn;
21
+ }
22
+ export declare const NiceKaraokeSelectionMode: React.FC<NiceKaraokeSelectionModeProps>;
23
+ /** Hook: can the given player currently pick a song? */
24
+ export declare function useCanPickSong(mode: SongSelectionMode, activePlayerIndex: number, hostIndex: number, playerIndex: number): boolean;
25
+ export default NiceKaraokeSelectionMode;
26
+ //# sourceMappingURL=KaraokeSelectionMode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KaraokeSelectionMode.d.ts","sourceRoot":"","sources":["../../src/karaoke/KaraokeSelectionMode.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAA4D,MAAM,OAAO,CAAC;AAWjF,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAExE,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,YAAY,GAAG,UAAU,GAAG,WAAW,CAAC;AAEvF,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,6BAA8B,SAAQ,aAAa;IAClE,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,IAAI,EAAE,iBAAiB,CAAC;IACxB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACjD,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,oBAAoB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,6DAA6D;IAC7D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,CAAC,CAAC,EAAE,eAAe,CAAC;CACrB;AAgBD,eAAO,MAAM,wBAAwB,EAAE,KAAK,CAAC,EAAE,CAAC,6BAA6B,CAgP5E,CAAC;AAEF,wDAAwD;AACxD,wBAAgB,cAAc,CAC5B,IAAI,EAAE,iBAAiB,EACvB,iBAAiB,EAAE,MAAM,EACzB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAgBT;AAED,eAAe,wBAAwB,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { NiceBaseProps } from '@nice2dev/ui-core';
2
+ import { default as React } from 'react';
3
+ import { DifficultyLevel } from '../constants/karaokeScoringConfig';
4
+ import { NiceTranslateFn } from '../core/i18n';
5
+ import { NiceKaraokePlayer } from './KaraokeManager';
6
+ import { SongSelectionMode } from './KaraokeSelectionMode';
7
+ import { NiceKaraokeGameModeOption } from './KaraokeSetupPanel';
8
+ export interface SessionJoinState {
9
+ selectionMode: SongSelectionMode;
10
+ /** Index of the player whose turn it is (-1 = all). */
11
+ activePickerIndex: number;
12
+ /** Whether every player has a mic assigned. */
13
+ allMicsAssigned: boolean;
14
+ /** True when no input devices are detected at all. */
15
+ noInputDevices: boolean;
16
+ }
17
+ export interface NiceKaraokeSessionJoinProps extends NiceBaseProps {
18
+ players: NiceKaraokePlayer[];
19
+ onPlayersChange: (players: NiceKaraokePlayer[]) => void;
20
+ gameMode?: string;
21
+ onGameModeChange?: (mode: string) => void;
22
+ gameModes?: NiceKaraokeGameModeOption[];
23
+ difficulty?: DifficultyLevel;
24
+ onDifficultyChange?: (difficulty: DifficultyLevel) => void;
25
+ /** Microphone input devices. If omitted, they are enumerated. */
26
+ audioInputs?: MediaDeviceInfo[];
27
+ maxPlayers?: number;
28
+ onCalibrate?: (deviceId: string) => void;
29
+ /** Initial song-selection mode (default free-for-all). */
30
+ initialSelectionMode?: SongSelectionMode;
31
+ turnTimeSec?: number;
32
+ hostIndex?: number;
33
+ myPlayerIndex?: number;
34
+ /** Notified whenever the combined session state changes. */
35
+ onChange?: (state: SessionJoinState) => void;
36
+ variant?: 'bar' | 'card';
37
+ t?: NiceTranslateFn;
38
+ }
39
+ export declare const NiceKaraokeSessionJoin: React.FC<NiceKaraokeSessionJoinProps>;
40
+ export default NiceKaraokeSessionJoin;
41
+ //# sourceMappingURL=KaraokeSessionJoin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KaraokeSessionJoin.d.ts","sourceRoot":"","sources":["../../src/karaoke/KaraokeSessionJoin.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAoD,MAAM,OAAO,CAAC;AAEzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAExE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAiC,EAAE,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAA8B,EAAE,KAAK,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAE5F,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,iBAAiB,CAAC;IACjC,uDAAuD;IACvD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,+CAA+C;IAC/C,eAAe,EAAE,OAAO,CAAC;IACzB,sDAAsD;IACtD,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,2BAA4B,SAAQ,aAAa;IAChE,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,eAAe,EAAE,CAAC,OAAO,EAAE,iBAAiB,EAAE,KAAK,IAAI,CAAC;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,SAAS,CAAC,EAAE,yBAAyB,EAAE,CAAC;IACxC,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,IAAI,CAAC;IAC3D,iEAAiE;IACjE,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,0DAA0D;IAC1D,oBAAoB,CAAC,EAAE,iBAAiB,CAAC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC7C,OAAO,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACzB,CAAC,CAAC,EAAE,eAAe,CAAC;CACrB;AAED,eAAO,MAAM,sBAAsB,EAAE,KAAK,CAAC,EAAE,CAAC,2BAA2B,CA6JxE,CAAC;AAEF,eAAe,sBAAsB,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { NiceBaseProps } from '@nice2dev/ui-core';
2
+ import { default as React } from 'react';
3
+ import { DifficultyLevel } from '../constants/karaokeScoringConfig';
4
+ import { NiceTranslateFn } from '../core/i18n';
5
+ import { NiceKaraokePlayer } from './KaraokeManager';
6
+ export interface NiceKaraokeGameModeOption {
7
+ value: string;
8
+ label: React.ReactNode;
9
+ }
10
+ export interface NiceKaraokeSetupPanelProps extends NiceBaseProps {
11
+ /** Current player roster (controlled). */
12
+ players: NiceKaraokePlayer[];
13
+ onPlayersChange: (players: NiceKaraokePlayer[]) => void;
14
+ /** Selected game mode. */
15
+ gameMode?: string;
16
+ onGameModeChange?: (mode: string) => void;
17
+ /** Available game modes (default: mic / pad / demo). */
18
+ gameModes?: NiceKaraokeGameModeOption[];
19
+ difficulty?: DifficultyLevel;
20
+ onDifficultyChange?: (difficulty: DifficultyLevel) => void;
21
+ /** Microphone input devices. If omitted, the panel enumerates them. */
22
+ audioInputs?: MediaDeviceInfo[];
23
+ /** Max players (default 4). */
24
+ maxPlayers?: number;
25
+ /** Open a latency calibrator for a device (shows a "calibrate" action). */
26
+ onCalibrate?: (deviceId: string) => void;
27
+ t?: NiceTranslateFn;
28
+ }
29
+ export declare const NiceKaraokeSetupPanel: React.FC<NiceKaraokeSetupPanelProps>;
30
+ export default NiceKaraokeSetupPanel;
31
+ //# sourceMappingURL=KaraokeSetupPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KaraokeSetupPanel.d.ts","sourceRoot":"","sources":["../../src/karaoke/KaraokeSetupPanel.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAuC,MAAM,OAAO,CAAC;AAE5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAUzE,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAExE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;CACxB;AAED,MAAM,WAAW,0BAA2B,SAAQ,aAAa;IAC/D,0CAA0C;IAC1C,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,eAAe,EAAE,CAAC,OAAO,EAAE,iBAAiB,EAAE,KAAK,IAAI,CAAC;IACxD,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,wDAAwD;IACxD,SAAS,CAAC,EAAE,yBAAyB,EAAE,CAAC;IACxC,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,IAAI,CAAC;IAC3D,uEAAuE;IACvE,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;IAChC,+BAA+B;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,CAAC,CAAC,EAAE,eAAe,CAAC;CACrB;AA6BD,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,0BAA0B,CA2LtE,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
@@ -0,0 +1,62 @@
1
+ import { NiceBaseProps } from '@nice2dev/ui-core';
2
+ import { default as React } from 'react';
3
+ import { NiceTranslateFn } from '../core/i18n';
4
+ import { TopSinging } from '../models/modelsKaraoke';
5
+ /** A song in the karaoke library (list/summary shape). */
6
+ export interface KaraokeSong {
7
+ id: number;
8
+ title: string;
9
+ artist: string;
10
+ genre?: string;
11
+ language?: string;
12
+ year?: number | string;
13
+ coverPath?: string;
14
+ coverImage?: string;
15
+ externalCoverUrl?: string | null;
16
+ videoPath?: string;
17
+ youtubeId?: string;
18
+ /** External import source: "Spotify" | "YouTube" | … */
19
+ externalSource?: string | null;
20
+ /** Duration in seconds, if known. */
21
+ durationSec?: number | null;
22
+ }
23
+ /** Filter request passed to `fetchSongs`. */
24
+ export interface KaraokeSongFilter {
25
+ searchQuery?: string;
26
+ genres?: string[];
27
+ languages?: string[];
28
+ years?: number[];
29
+ externalSource?: string;
30
+ }
31
+ export interface SongBrowserSelection {
32
+ songs: KaraokeSong[];
33
+ }
34
+ export interface NiceKaraokeSongBrowserProps extends NiceBaseProps {
35
+ /** Song list (filtered/sorted client-side). */
36
+ songs?: KaraokeSong[];
37
+ /** Server-side fetch (called on filter change) when `songs` is not given. */
38
+ fetchSongs?: (filter: KaraokeSongFilter) => Promise<KaraokeSong[]>;
39
+ /** External loading indicator. */
40
+ loading?: boolean;
41
+ /** Resolve a cover image URL for a song. */
42
+ getCover?: (song: KaraokeSong) => string | undefined;
43
+ /** Resolve the top recorded score for a song (shown as a badge). */
44
+ getTopScore?: (song: KaraokeSong) => TopSinging | null | undefined;
45
+ /** Quick-play a single song. */
46
+ onPlay?: (song: KaraokeSong) => void;
47
+ /** Confirm a multi-select. */
48
+ onSelect?: (selection: SongBrowserSelection) => void;
49
+ /** Enable checkbox multi-select. */
50
+ multiSelect?: boolean;
51
+ /** Cap on multi-select (0 = unlimited). */
52
+ maxSelections?: number;
53
+ /** Show the genre/language facet sidebar. */
54
+ showSidebar?: boolean;
55
+ /** Disable play buttons (e.g. no mics). */
56
+ disabled?: boolean;
57
+ disabledReason?: string;
58
+ t?: NiceTranslateFn;
59
+ }
60
+ export declare const NiceKaraokeSongBrowser: React.FC<NiceKaraokeSongBrowserProps>;
61
+ export default NiceKaraokeSongBrowser;
62
+ //# sourceMappingURL=KaraokeSongBrowser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KaraokeSongBrowser.d.ts","sourceRoot":"","sources":["../../src/karaoke/KaraokeSongBrowser.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAuC,MAAM,OAAO,CAAC;AAG5D,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,OAAO,0BAA0B,CAAC;AAElC,0DAA0D;AAC1D,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,6CAA6C;AAC7C,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AASD,MAAM,WAAW,2BAA4B,SAAQ,aAAa;IAChE,+CAA+C;IAC/C,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;IACtB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACnE,kCAAkC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,MAAM,GAAG,SAAS,CAAC;IACrD,oEAAoE;IACpE,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,UAAU,GAAG,IAAI,GAAG,SAAS,CAAC;IACnE,gCAAgC;IAChC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IACrC,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,oBAAoB,KAAK,IAAI,CAAC;IACrD,oCAAoC;IACpC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,CAAC,CAAC,EAAE,eAAe,CAAC;CACrB;AA0GD,eAAO,MAAM,sBAAsB,EAAE,KAAK,CAAC,EAAE,CAAC,2BAA2B,CAkQxE,CAAC;AAEF,eAAe,sBAAsB,CAAC"}
@@ -1,6 +1,8 @@
1
+ import { NiceBaseProps } from '@nice2dev/ui-core';
1
2
  import { default as React } from 'react';
2
3
  import { NiceTranslateFn } from '../core/i18n';
3
4
  import { KaraokeSongFile, TopSinging } from '../models/modelsKaraoke';
5
+ /** Per-player score data (as produced by the karaoke scoring engine). */
4
6
  export interface PlayerScoreEntry {
5
7
  id: number;
6
8
  name: string;
@@ -9,13 +11,19 @@ export interface PlayerScoreEntry {
9
11
  bonusScore: number;
10
12
  totalScore: number;
11
13
  }
12
- export interface KaraokeSummaryOverlayProps {
14
+ export interface KaraokeSummaryOverlayProps extends NiceBaseProps {
13
15
  uploadedSong: KaraokeSongFile | null;
14
16
  playerScores: PlayerScoreEntry[];
15
17
  topSingings: TopSinging[];
16
18
  onRestart: () => void;
17
19
  onContinue: () => void;
18
20
  t: NiceTranslateFn;
21
+ /**
22
+ * Optional render-prop for the post-performance report modal. When provided, a
23
+ * "Report" action is shown; clicking it renders the returned node as an overlay.
24
+ * The `close` callback dismisses it. Inject e.g. NiceVocalPerformanceReport here.
25
+ */
26
+ renderReport?: (close: () => void) => React.ReactNode;
19
27
  }
20
28
  export declare const KaraokeSummaryOverlay: React.FC<KaraokeSummaryOverlayProps>;
21
29
  export default KaraokeSummaryOverlay;
@@ -1 +1 @@
1
- {"version":3,"file":"KaraokeSummaryOverlay.d.ts","sourceRoot":"","sources":["../../src/karaoke/KaraokeSummaryOverlay.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAkB,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,6BAA6B,CAAC;AAGrC,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,0BAA0B;IACzC,YAAY,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,CAAC,EAAE,eAAe,CAAC;CACpB;AAMD,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,0BAA0B,CAwHtE,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"KaraokeSummaryOverlay.d.ts","sourceRoot":"","sources":["../../src/karaoke/KaraokeSummaryOverlay.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAuC,MAAM,OAAO,CAAC;AAG5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,6BAA6B,CAAC;AAGrC,yEAAyE;AACzE,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,0BAA2B,SAAQ,aAAa;IAC/D,YAAY,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,CAAC,EAAE,eAAe,CAAC;IACnB;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,IAAI,KAAK,KAAK,CAAC,SAAS,CAAC;CACvD;AAqLD,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,0BAA0B,CAuJtE,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { default as React } from 'react';
2
+ import { NiceTranslateFn } from '../core/i18n';
3
+ import { KaraokeSongFile } from '../models/modelsKaraoke';
4
+ export interface NiceKaraokeUploaderProps {
5
+ /** Called with the parsed song once a file is loaded. */
6
+ onSongUpload: (song: KaraokeSongFile) => void;
7
+ /**
8
+ * Optional backend parser. When provided, the file is sent (base64-encoded)
9
+ * to this function instead of being parsed in the browser.
10
+ */
11
+ parseSong?: (file: {
12
+ fileName: string;
13
+ data: string;
14
+ }) => Promise<KaraokeSongFile>;
15
+ /** Called when parsing fails. */
16
+ onError?: (error: unknown) => void;
17
+ t?: NiceTranslateFn;
18
+ }
19
+ /** Parse raw UltraStar `.txt` content into a KaraokeSongFile (client-side). */
20
+ export declare function parseUltraStarText(text: string, fileName?: string): KaraokeSongFile;
21
+ export declare const NiceKaraokeUploader: React.FC<NiceKaraokeUploaderProps>;
22
+ export default NiceKaraokeUploader;
23
+ //# sourceMappingURL=KaraokeUploader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KaraokeUploader.d.ts","sourceRoot":"","sources":["../../src/karaoke/KaraokeUploader.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAA2B,MAAM,OAAO,CAAC;AAEhD,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAAmC,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAEhG,MAAM,WAAW,wBAAwB;IACvC,yDAAyD;IACzD,YAAY,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IAC9C;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;IACnF,iCAAiC;IACjC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,CAAC,CAAC,EAAE,eAAe,CAAC;CACrB;AAED,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAa,GAAG,eAAe,CA2CvF;AAID,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAiGlE,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { NiceBaseProps } from '@nice2dev/ui-core';
2
+ import { default as React } from 'react';
3
+ import { NiceTranslateFn } from '../core/i18n';
4
+ export interface NiceLatencyCalibratorProps extends NiceBaseProps {
5
+ /** Microphone deviceId to calibrate. */
6
+ deviceId: string;
7
+ /** Seed value (e.g. previously saved offset). */
8
+ initialOffsetMs?: number | null;
9
+ /** Persist the measured offset (host stores it). */
10
+ onSave?: (ms: number) => void | Promise<void>;
11
+ onClose?: () => void;
12
+ /** Number of calibration rounds to average (default 3). */
13
+ rounds?: number;
14
+ t?: NiceTranslateFn;
15
+ }
16
+ export declare const NiceLatencyCalibrator: React.FC<NiceLatencyCalibratorProps>;
17
+ export default NiceLatencyCalibrator;
18
+ //# sourceMappingURL=LatencyCalibrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LatencyCalibrator.d.ts","sourceRoot":"","sources":["../../src/karaoke/LatencyCalibrator.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAsC,MAAM,OAAO,CAAC;AAG3D,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAGxE,MAAM,WAAW,0BAA2B,SAAQ,aAAa;IAC/D,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,oDAAoD;IACpD,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,CAAC,CAAC,EAAE,eAAe,CAAC;CACrB;AAED,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,0BAA0B,CAsUtE,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { default as React } from 'react';
2
+ import { PadDifficulty, PadHitFeedback, PadLane, PadNoteEvent } from './rendering/padNotePlayer';
3
+ export interface NicePadKaraokeOverlayProps {
4
+ lanes: PadLane[];
5
+ events: PadNoteEvent[];
6
+ currentTime: number;
7
+ activeLanes: boolean[];
8
+ difficulty: PadDifficulty;
9
+ feedbackQueue: PadHitFeedback[];
10
+ isPlaying: boolean;
11
+ /** Total overlay height in px (default 300). */
12
+ height?: number;
13
+ }
14
+ export declare const NicePadKaraokeOverlay: React.FC<NicePadKaraokeOverlayProps>;
15
+ export default NicePadKaraokeOverlay;
16
+ //# sourceMappingURL=PadKaraokeOverlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PadKaraokeOverlay.d.ts","sourceRoot":"","sources":["../../src/karaoke/PadKaraokeOverlay.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAA4B,MAAM,OAAO,CAAC;AAIjD,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,OAAO,EACP,YAAY,EACb,MAAM,2BAA2B,CAAC;AAuBnC,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,EAAE,CAAC;IACvB,UAAU,EAAE,aAAa,CAAC;IAC1B,aAAa,EAAE,cAAc,EAAE,CAAC;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAMD,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,0BAA0B,CAiNtE,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { NiceBaseProps } from '@nice2dev/ui-core';
2
+ import { default as React } from 'react';
3
+ import { NiceTranslateFn } from '../core/i18n';
4
+ import { KaraokeSongFile } from '../models/modelsKaraoke';
5
+ import { ComboResult, PitchPoint } from '../utils/karaokeScoring';
6
+ import { MicSettingsSnapshot, VerseRatingInput } from '../utils/vocalPerformanceMetrics';
7
+ import { PlayerScoreEntry } from './KaraokeSummaryOverlay';
8
+ export interface NiceVocalPerformanceReportProps extends NiceBaseProps {
9
+ uploadedSong: KaraokeSongFile | null;
10
+ playerScores: PlayerScoreEntry[];
11
+ livePitch: Record<number, PitchPoint[]>;
12
+ liveVerseRatings: VerseRatingInput[];
13
+ liveCombo: ComboResult;
14
+ difficulty: string;
15
+ micSettings: Record<number, MicSettingsSnapshot>;
16
+ onClose: () => void;
17
+ t?: NiceTranslateFn;
18
+ }
19
+ export declare const NiceVocalPerformanceReport: React.FC<NiceVocalPerformanceReportProps>;
20
+ export default NiceVocalPerformanceReport;
21
+ //# sourceMappingURL=VocalPerformanceReport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VocalPerformanceReport.d.ts","sourceRoot":"","sources":["../../src/karaoke/VocalPerformanceReport.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAuC,MAAM,OAAO,CAAC;AAyB5D,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,KAAK,EAAE,WAAW,EAAkB,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACvF,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EAEtB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAGhE,MAAM,WAAW,+BAAgC,SAAQ,aAAa;IACpE,YAAY,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IACxC,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;IACrC,SAAS,EAAE,WAAW,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IACjD,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,CAAC,CAAC,EAAE,eAAe,CAAC;CACrB;AA6MD,eAAO,MAAM,0BAA0B,EAAE,KAAK,CAAC,EAAE,CAAC,+BAA+B,CAohChF,CAAC;AAEF,eAAe,0BAA0B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"glossyBarRenderer.d.ts","sourceRoot":"","sources":["../../../src/karaoke/rendering/glossyBarRenderer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"glossyBarRenderer.d.ts","sourceRoot":"","sources":["../../../src/karaoke/rendering/glossyBarRenderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ import { MutableRefObject } from 'react';
2
+ import { AudioRecorder } from '../engine/recording';
3
+ import { PitchPoint } from '../utils/karaokeScoring';
4
+ /** Optional realtime service for multiplayer pitch-timeline sync. */
5
+ export interface KaraokeRtcService {
6
+ isConnected(): boolean;
7
+ publishTimelineUpdate(payload: Record<string, unknown>): Promise<void> | void;
8
+ onTimelineUpdate(handler: (payload: unknown) => void): void;
9
+ offTimelineUpdate(handler: (payload: unknown) => void): void;
10
+ }
11
+ /** Minimal player shape needed for pitch detection. */
12
+ export interface KaraokePitchPlayer {
13
+ id: number;
14
+ name: string;
15
+ micId?: string | null;
16
+ }
17
+ export interface UseKaraokePitchProps {
18
+ isPlaying: boolean;
19
+ gameMode: string;
20
+ players: KaraokePitchPlayer[];
21
+ /** Stable key over [{id, micId}] — restart detection when it changes. */
22
+ playersMicKey: string;
23
+ /** Per-player pitch algorithm ('pitchy' | 'librosa' | 'crepe' | …). */
24
+ micAlgorithms?: {
25
+ [playerId: number]: string;
26
+ };
27
+ defaultPitchAlgorithm?: string;
28
+ micRmsThresholds?: {
29
+ [micId: string]: number;
30
+ };
31
+ micOffsets?: {
32
+ [micId: string]: number;
33
+ };
34
+ micGains?: {
35
+ [micId: string]: number;
36
+ };
37
+ micPitchThresholds?: {
38
+ [micId: string]: number;
39
+ };
40
+ micSmoothingWindows?: {
41
+ [micId: string]: number;
42
+ };
43
+ micHysteresisFrames?: {
44
+ [micId: string]: number;
45
+ };
46
+ micUseHanning?: {
47
+ [micId: string]: boolean;
48
+ };
49
+ micMonitorEnabled?: {
50
+ [micId: string]: boolean;
51
+ };
52
+ micMonitorVolumes?: {
53
+ [micId: string]: number;
54
+ };
55
+ /** Ref to the current media time (seconds) for accurate pitch timestamps. */
56
+ currentTimeRef: MutableRefObject<number>;
57
+ isPadMode: boolean;
58
+ /** Optional clock-offset ref (multiplayer latency compensation). */
59
+ clockOffsetMsRef?: MutableRefObject<number>;
60
+ /** Optional party/event id ref (tagged onto published timeline updates). */
61
+ currentPartyIdRef?: MutableRefObject<number | null>;
62
+ /** Optional realtime service — when omitted, the hook runs standalone. */
63
+ rtc?: KaraokeRtcService | null;
64
+ }
65
+ export declare function useKaraokePitch({ isPlaying, gameMode, players, playersMicKey, micAlgorithms, defaultPitchAlgorithm, micRmsThresholds, micOffsets, micGains, micPitchThresholds, micSmoothingWindows, micHysteresisFrames, micUseHanning, micMonitorEnabled, micMonitorVolumes, currentTimeRef, isPadMode: _isPadMode, clockOffsetMsRef, currentPartyIdRef, rtc, }: UseKaraokePitchProps): {
66
+ livePitch: {
67
+ [playerId: number]: PitchPoint[];
68
+ };
69
+ setLivePitch: import('react').Dispatch<import('react').SetStateAction<{
70
+ [playerId: number]: PitchPoint[];
71
+ }>>;
72
+ recordings: {
73
+ [playerId: number]: Blob;
74
+ };
75
+ recordersRef: MutableRefObject<{
76
+ [playerId: number]: AudioRecorder;
77
+ }>;
78
+ unsentPitchRef: MutableRefObject<{
79
+ [playerId: number]: PitchPoint[];
80
+ }>;
81
+ pitchCleanupsRef: MutableRefObject<(() => void)[]>;
82
+ remoteLatencyMs: {
83
+ [playerId: number]: number;
84
+ };
85
+ showRemoteTimelines: boolean;
86
+ setShowRemoteTimelines: import('react').Dispatch<import('react').SetStateAction<boolean>>;
87
+ compactTimelines: boolean;
88
+ setCompactTimelines: import('react').Dispatch<import('react').SetStateAction<boolean>>;
89
+ };
90
+ //# sourceMappingURL=useKaraokePitch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useKaraokePitch.d.ts","sourceRoot":"","sources":["../../src/karaoke/useKaraokePitch.ts"],"names":[],"mappings":"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"}