virtual-piano-player 1.0.0 → 1.0.1

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/README.md CHANGED
@@ -67,6 +67,16 @@ npm install
67
67
  | :--- | :--- | :--- | :--- | :--- | :--- |
68
68
  | `amelie` | `play-amelie` | Amélie (Comptine d'un autre été) | Yann Tiersen | E minor | ~122s |
69
69
  | `nocturne` | `play-nocturne` | Nocturne Op. 9 No. 2 (Andante) | Frédéric Chopin (Csabay Domonkos) | Eb major | ~248s |
70
+ | `golden` | `play-golden` | Golden Hour | JVKE | E major | ~207s |
71
+ | `idea10` | `play-idea10` | Idea 10 | Gibran Alcocer | G minor | ~121s |
72
+ | `solas` | `play-solas` | Solas | Jamie Duffy | E minor | ~122s |
73
+ | `blue` | `play-blue` | Blue | Yung Kai | E major | ~105s |
74
+ | `lovestory` | `play-lovestory` | Love Story | Indila | Bb minor | ~253s |
75
+ | `luna` | `play-luna` | Hijo de la Luna | Mecano (José María Cano) | A minor | ~268s |
76
+ | `baby` | `play-baby` | Pretty Little Baby | Connie Francis | Db major | ~94s |
77
+ | `hotline` | `play-hotline` | Hotline (Edit) | Billie Eilish | A minor | ~94s |
78
+ | `face` | `play-face` | I Thought I Saw Your Face Today | She & Him (Zooey Deschanel) | G major | ~86s |
79
+ | `moment` | `play-moment` | Every Living Breathing Moment | Grant Steller | F major | ~101s |
70
80
  | `succession` | `play-succession` | Succession (Main Title Theme) | Nicholas Britell | C minor | ~89s |
71
81
  | `still` | `play-still` | Still D.R.E. (Polished Master) | Dr. Dre ft. Snoop Dogg | A minor | ~66s |
72
82
  | `paint` | `play-paint` | Paint It, Black | The Rolling Stones (Westworld) | E minor | ~50s |
package/SKILL.md CHANGED
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: virtual-piano-player
3
- description: Controls the browser to navigate to OnlinePianist (https://www.onlinepianist.com/virtual-piano), configure the 88-key piano interface (set visible keys to Max), and play classical, pop, jazz, or custom piano solos, melodies, and chords using automated keyboard simulation and Web Audio.
3
+ description: Controls the browser to navigate to OnlinePianist (https://www.onlinepianist.com/virtual-piano), configure the 88-key piano interface (set visible keys to Max), and play classical, pop, jazz, or custom piano solos, melodies, and chords using automated keyboard simulation and studio-grade Web Audio synthesis.
4
4
  ---
5
5
 
6
- # Virtual Piano Player Skill
6
+ # Virtual Piano Player Skill & CLI
7
7
 
8
- This skill automates the **[OnlinePianist Virtual Piano](https://www.onlinepianist.com/virtual-piano)** in the browser. It configures the keyboard to the full **88 visible keys**, activates the sustain pedal, and plays classical piano solos, chords, or custom compositions with expressive timing and visual glow effects on each key.
8
+ This skill and standalone CLI automates the **[OnlinePianist Virtual Piano](https://www.onlinepianist.com/virtual-piano)** in Google Chrome. It automatically expands the keyboard to the full **88 visible keys**, activates the sustain pedal, connects directly into the browser's Web Audio synthesis engine (**Studio Direct** audio bridge), and performs classical piano solos, chords, or custom compositions with expressive timing and visual glow effects on each key.
9
9
 
10
10
  ---
11
11
 
@@ -13,46 +13,94 @@ This skill automates the **[OnlinePianist Virtual Piano](https://www.onlinepiani
13
13
 
14
14
  Activate this skill whenever the user:
15
15
  - Asks to play, compose, or perform a song, melody, or solo on the OnlinePianist virtual piano (`https://www.onlinepianist.com/virtual-piano`).
16
- - Mentions playing piano in the browser, controlling keyboard keys, or playing in the style of composers like Chopin, Beethoven, Mozart, Bach, Debussy, or modern artists.
16
+ - Mentions playing piano in the browser, controlling keyboard keys, or playing works by composers like Chopin, Yann Tiersen, Beethoven, Vivaldi, Nicholas Britell, or Dr. Dre.
17
17
  - Requests setting visible keys to max / full 88-key piano view and performing music.
18
+ - Asks to manage, list, add, or publish songs to the virtual piano package or repository.
18
19
 
19
20
  ---
20
21
 
21
- ## Directory Structure
22
+ ## Project & Directory Structure
22
23
 
23
24
  ```text
24
25
  virtual-piano-player/
25
- ├── SKILL.md # Main skill instructions and documentation
26
- ├── package.json # Node dependencies (puppeteer-core)
27
- └── scripts/
28
- ├── play.js # Master CLI runner for browser automation & playback
29
- └── songs/
30
- ├── chopin_nocturne.json # Chopin's Nocturne Op. 9 No. 2 (Csabay Domonkos perf. ~248s)
31
- ├── chopin_etude.json # 60s Fast Chopin Impromptu-Etude in C# minor
32
- ├── vivaldi_winter.json # Vivaldi's Winter (L'Inverno - Allegro non molto)
33
- ├── paint_it_black.json # The Rolling Stones' Paint It, Black
34
- ├── still_dre.json # Dr. Dre & Snoop Dogg's Still D.R.E.
35
- ├── succession.json # Nicholas Britell's Succession (Main Title Theme)
36
- ├── amelie.json # Yann Tiersen's Comptine d'un autre été (Amélie)
37
- └── fur_elise.json # Beethoven's Für Elise theme
26
+ ├── bin/
27
+ │ └── cli.js # Executable CLI binary (piano, virtual-piano, npx runner)
28
+ ├── scripts/
29
+ ├── play.js # Master playback engine, audio bridge & lock manager
30
+ │ ├── list.sh # In-directory bash catalog runner
31
+ │ └── songs/ # Curated library of high-precision song JSONs
32
+ ├── golden_hour.json # JVKE's Golden Hour (unabridged cascading piano ~207s)
33
+ ├── idea_10.json # Gibran Alcocer's Idea 10 (3/4 waltz arpeggios ~121s)
34
+ ├── solas.json # Jamie Duffy's Solas (emotive Celtic piano solo ~122s)
35
+ ├── blue.json # Yung Kai's Blue (tender ballad ~105s)
36
+ ├── love_story.json # Indila's Love Story (Bb minor harp & piano ~253s)
37
+ ├── hijo_de_la_luna.json # Mecano's Hijo de la Luna (expressive A minor ~268s)
38
+ │ ├── pretty_little_baby.json # Connie Francis' Pretty Little Baby (1962 pop swing ~94s)
39
+ │ ├── hotline.json # Billie Eilish's Hotline Edit (haunting ballad ~94s)
40
+ │ ├── i_thought_i_saw_your_face_today.json # She & Him's 60s folk swing ~86s
41
+ │ ├── every_living_breathing_moment.json # Grant Steller's cinematic theme ~101s
42
+ │ ├── chopin_nocturne.json # Chopin's Nocturne Op. 9 No. 2 (Csabay Domonkos perf. ~248s)
43
+ │ ├── chopin_etude.json # 60s Fast Chopin Impromptu-Etude in C# minor
44
+ │ ├── vivaldi_winter.json # Vivaldi's Winter (L'Inverno - Allegro non molto)
45
+ │ ├── paint_it_black.json # The Rolling Stones' Paint It, Black
46
+ │ ├── still_dre.json # Dr. Dre & Snoop Dogg's Still D.R.E.
47
+ │ ├── succession.json # Nicholas Britell's Succession (Main Title Theme)
48
+ │ ├── amelie.json # Yann Tiersen's Comptine d'un autre été (Amélie)
49
+ │ └── fur_elise.json # Beethoven's Für Elise theme
50
+ ├── index.js # Programmatic Node.js exports (play, listSongs, loadSong)
51
+ ├── package.json # NPM manifest with bin mappings, files whitelist & dependencies
52
+ ├── package-lock.json # Exact dependency lockfile (puppeteer-core)
53
+ ├── SKILL.md # Agent skill instructions & key mappings
54
+ ├── skill.json # Skill metadata for Antigravity & agent discovery
55
+ ├── README.md # Public documentation, quickstart & catalog table
56
+ ├── LICENSE # MIT License (AxmadjonTeacher)
57
+ └── .gitignore # Ignores node_modules/, scratch/, /tmp profiles, logs
38
58
  ```
39
59
 
40
60
  ---
41
61
 
62
+ ## 🌐 Public Distribution & Releases
63
+
64
+ - **NPM Package**: [`virtual-piano-player`](https://www.npmjs.com/package/virtual-piano-player) (v1.0.0 live)
65
+ - **GitHub Repository**: [https://github.com/AxmadjonTeacher/virtual-piano](https://github.com/AxmadjonTeacher/virtual-piano)
66
+ - **Global Binaries**: `piano`, `virtual-piano`
67
+
68
+ ### 📦 Summary of Future Releases
69
+
70
+ Whenever you add new songs or tweak code, just run:
71
+
72
+ cd ~/.agents/skills/virtual-piano-player
73
+ npm version patch # Increments 1.0.0 -> 1.0.1 and tags git
74
+ git push origin main --tags
75
+ npm publish
76
+
77
+ ---
78
+
42
79
  ## Quick Usage
43
80
 
44
- ### View Available Songs Catalog:
45
- Run any of the following to see the catalog table with all titles, composers, durations, and keys:
81
+ ### 1. View Song Catalog:
82
+ Run any of the following to see the interactive catalog table with all titles, composers, durations, and keys:
46
83
  ```bash
47
- piano # From anywhere (via zsh function)
48
- songs # Global alias
84
+ piano # From anywhere (via zsh function & npm link)
85
+ virtual-piano # Direct npm binary
86
+ songs # Shell shortcut
49
87
  ./scripts/list.sh # When inside virtual-piano-player directory
50
88
  node scripts/play.js --list # Direct Node CLI
51
89
  ```
52
90
 
53
- ### Play Songs via Shell Shortcuts:
91
+ ### 2. Play Songs via Shell Shortcuts:
54
92
  ```bash
55
- # Play with master "piano" command:
93
+ # Play with master "piano" or "virtual-piano" command:
94
+ piano golden # JVKE - Golden Hour (unabridged cascading piano)
95
+ piano idea10 # Gibran Alcocer - Idea 10 (3/4 waltz arpeggios)
96
+ piano solas # Jamie Duffy - Solas (emotive Celtic piano solo)
97
+ piano blue # Yung Kai - Blue (tender ballad)
98
+ piano lovestory # Indila - Love Story (Bb minor harp & piano)
99
+ piano luna # Mecano - Hijo de la Luna (expressive A minor)
100
+ piano baby # Connie Francis - Pretty Little Baby (1962 pop swing)
101
+ piano hotline # Billie Eilish - Hotline Edit (haunting ballad)
102
+ piano face # She & Him - I Thought I Saw Your Face Today
103
+ piano moment # Grant Steller - Every Living Breathing Moment
56
104
  piano nocturne # Chopin - Nocturnes, Op. 9: No. 2 (Domonkos Csabay)
57
105
  piano amelie # Yann Tiersen - Comptine d'un autre été (Amélie)
58
106
  piano succession # Nicholas Britell - Succession Main Title Theme
@@ -63,6 +111,16 @@ piano chopin # Chopin - Fast Impromptu-Etude
63
111
  piano elise # Beethoven - Für Elise
64
112
 
65
113
  # Or play with direct shortcut aliases:
114
+ play-golden
115
+ play-idea10
116
+ play-solas
117
+ play-blue
118
+ play-lovestory
119
+ play-luna
120
+ play-baby
121
+ play-hotline
122
+ play-face
123
+ play-moment
66
124
  play-nocturne
67
125
  play-amelie
68
126
  play-succession
@@ -72,13 +130,49 @@ play-winter
72
130
  play-chopin
73
131
  play-elise
74
132
 
75
- # Play at custom tempo (e.g. 1.2x speed):
76
- piano chopin --tempo 1.2
133
+ # Play at custom tempo (e.g. 1.15x speed):
134
+ piano golden --tempo 1.15
135
+
136
+ # Play headlessly (for audio testing/CI):
137
+ piano elise --headless true
77
138
 
78
139
  # Play a custom song JSON file:
79
140
  piano --file /path/to/my_song.json
80
141
  ```
81
142
 
143
+ ### 3. Instant Zero-Install Execution (NPX):
144
+ ```bash
145
+ npx virtual-piano-player golden
146
+ npx virtual-piano-player solas
147
+ npx virtual-piano-player idea10
148
+ npx virtual-piano-player amelie
149
+ ```
150
+
151
+ ---
152
+
153
+ ## 🎵 Song Catalog Reference
154
+
155
+ | Alias | Shortcut | Title | Composer / Artist | Key | Duration | Notes |
156
+ | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
157
+ | `amelie` | `play-amelie` | Amélie (Comptine d'un autre été) | Yann Tiersen | E minor | ~122s | 945 notes, client timeline |
158
+ | `nocturne` | `play-nocturne` | Nocturne Op. 9 No. 2 (Andante) | Frédéric Chopin (Csabay Domonkos) | Eb major | ~248s | 1,242 notes, full unabridged |
159
+ | `golden` | `play-golden` | Golden Hour | JVKE | E major | ~207s | 2,716 notes, sparkling arpeggios |
160
+ | `idea10` | `play-idea10` | Idea 10 | Gibran Alcocer | G minor | ~121s | 1,076 notes, 3/4 waltz arpeggios |
161
+ | `solas` | `play-solas` | Solas | Jamie Duffy | E minor | ~122s | 808 notes, emotive Celtic piano |
162
+ | `blue` | `play-blue` | Blue | Yung Kai | E major | ~105s | 744 notes, warm tender chords |
163
+ | `lovestory` | `play-lovestory` | Love Story | Indila | Bb minor | ~253s | 1,655 notes, concert harp & piano |
164
+ | `luna` | `play-luna` | Hijo de la Luna | Mecano (José María Cano) | A minor | ~268s | 1,636 notes, expressive piano score |
165
+ | `baby` | `play-baby` | Pretty Little Baby | Connie Francis | Db major | ~94s | 754 notes, 1962 pop swing |
166
+ | `hotline` | `play-hotline` | Hotline (Edit) | Billie Eilish | A minor | ~94s | 329 notes, intimate acoustic ballad |
167
+ | `face` | `play-face` | I Thought I Saw Your Face Today | She & Him (Zooey Deschanel) | G major | ~86s | 550 notes, 60s folk pop swing |
168
+ | `moment` | `play-moment` | Every Living Breathing Moment | Grant Steller | F major | ~101s | 431 notes, cinematic film score |
169
+ | `succession` | `play-succession` | Succession (Main Title Theme) | Nicholas Britell | C minor | ~89s | 390 notes, hip-hop/classical |
170
+ | `still` | `play-still` | Still D.R.E. (Polished Master) | Dr. Dre ft. Snoop Dogg | A minor | ~66s | 374 notes, classic 8-beat loop |
171
+ | `paint` | `play-paint` | Paint It, Black | The Rolling Stones (Westworld) | E minor | ~50s | 98 events, driving rock rhythm |
172
+ | `winter` | `play-winter` | Winter (L'Inverno - Allegro) | Antonio Vivaldi | F minor | ~45s | 80 events, rapid violin runs |
173
+ | `chopin` | `play-chopin` | Impromptu-Etude in C# minor | Frédéric Chopin style | C# minor | ~60s | 257 events, tempestuous arpeggios |
174
+ | `elise` | `play-elise` | Für Elise (Bagatelle No. 25) | Ludwig van Beethoven | A minor | ~25s | 53 events, famous theme |
175
+
82
176
  ---
83
177
 
84
178
  ## 88-Key Keyboard Mapping Reference
@@ -122,48 +216,19 @@ OnlinePianist maps 5 full octaves (C2 through C7) directly to standard computer
122
216
 
123
217
  ---
124
218
 
125
- ## How to Compose New Songs
126
-
127
- Songs are JSON objects with an array of sequential `events`. Each event contains:
128
- - `keys`: An array of note strings (e.g. `["C4"]` or `["C4", "E4", "G4"]` for a chord), or direct key letters (e.g. `["t", "u", "o"]`).
129
- - `dur`: Note hold duration in milliseconds (e.g. `80` for staccato / 16th-note, `400` for quarter note).
130
- - `wait`: Pause before the next event in milliseconds (e.g. `20` for continuous legato, `200` for rests).
131
-
132
- ### Example Song JSON
133
-
134
- ```json
135
- {
136
- "title": "Moonlight Sonata (Opening Theme)",
137
- "composer": "Ludwig van Beethoven",
138
- "key": "C# minor",
139
- "events": [
140
- { "keys": ["Cs2", "Cs3"], "dur": 600, "wait": 100 },
141
- { "keys": ["Gs3"], "dur": 180, "wait": 40 },
142
- { "keys": ["Cs4"], "dur": 180, "wait": 40 },
143
- { "keys": ["E4"], "dur": 180, "wait": 40 },
144
- { "keys": ["Gs3"], "dur": 180, "wait": 40 },
145
- { "keys": ["Cs4"], "dur": 180, "wait": 40 },
146
- { "keys": ["E4"], "dur": 180, "wait": 40 }
147
- ]
148
- }
149
- ```
150
-
151
- ---
152
-
153
- ## Procedural Automation Checklist
154
-
155
- When automating OnlinePianist:
156
- 1. **Launch Google Chrome**: Use `puppeteer-core` pointing to `/Applications/Google Chrome.app/Contents/MacOS/Google Chrome`.
157
- 2. **Bring Window to Front**: Execute `osascript -e 'tell application "Google Chrome" to activate'` so visual animations and audio playback are front and center.
158
- 3. **Wait for Sound Engine**: Poll until `!document.body.innerText.includes('WARMING UP PIANO')` so Web Audio fonts are fully initialized before playing.
159
- 4. **Remove Ad Overlays**: Remove `#layoutDesign` and `.vp-btf-container` from the DOM to avoid pointer interception.
160
- 5. **Set Visible Keys to Max**:
161
- - Click `.synth-btn--settings`.
162
- - Find the button with text `Max` under `VISIBLE KEYS` and click it.
163
- - Close the settings menu by clicking `.synth-btn--settings` again.
164
- 6. **Verify 88 Keys**: Ensure `document.querySelectorAll('.piano-key-white, .piano-key-black').length === 88`.
165
- 7. **Ensure Sustain Pedal**: Verify `.synth-btn--sustain` has class `synth-btn--on`.
166
- 8. **Native Audio Bridge**: Connects directly to OnlinePianist's Web Audio synthesis engine (`te.playNote(midi)`), eliminating OS keyboard modifier drops and ensuring 100% pitch fidelity for all black and white keys with simultaneous visual key glow.
219
+ ## Technical Architecture & Automation Checklist
220
+
221
+ 1. **Launch Google Chrome**: Uses `puppeteer-core` pointing to `/Applications/Google Chrome.app/Contents/MacOS/Google Chrome` with `--start-maximized` and `--autoplay-policy=no-user-gesture-required`.
222
+ 2. **Pre-flight Lock Cleanup & Auto-Recovery**: Prior to launching, `play.js` terminates orphaned `chrome-piano-profile` processes (`pkill -9 -f "chrome-piano-profile"`) and removes stale `/tmp/chrome-piano-profile/Singleton*` lock symlinks, preventing browser startup errors.
223
+ 3. **Signal Trapping**: Intercepts `SIGINT` (Ctrl+C) and `SIGTERM` to close browser windows cleanly and release profile locks.
224
+ 4. **Bring Window to Front**: Executes `osascript -e 'tell application "Google Chrome" to activate'` so visual animations and audio playback are front and center.
225
+ 5. **Sound Engine Synchronization**: Polls until `!document.body.innerText.includes('WARMING UP PIANO')` so Web Audio samples are loaded before notes trigger.
226
+ 6. **Set Visible Keys to Max**:
227
+ - Clicks `.synth-btn--settings`.
228
+ - Clicks `Full` layout and `Max` visible keys (88 keys).
229
+ - Verifies 88 keys exist in DOM (`document.querySelectorAll('.piano-key-white, .piano-key-black').length === 88`).
230
+ 7. **Ensure Sustain Pedal**: Confirms `.synth-btn--sustain` has class `synth-btn--on`.
231
+ 8. **Studio Direct Audio Bridge**: Connects directly into OnlinePianist's Web Audio synthesis engine (`window.__playMidi`, `window.__releaseMidi`), bypassing OS keyboard modifier drops and ensuring 100% pitch fidelity for all black and white keys with simultaneous visual key glow.
167
232
  9. **Dual Playback Formats**:
168
- - `notes`: High-precision client-side timeline arrays with exact millisecond timestamps (`startMs`, `durMs`, `midi`), ideal for official transcribed multi-track scores.
169
- - `events`: Sequential step-by-step note events (`keys`, `dur`, `wait`), ideal for custom solos and arrangements.
233
+ - `notes`: High-precision client-side timeline arrays with exact millisecond timestamps (`startMs`, `durMs`, `midi`), used for complex multi-track classical scores (Amélie, Chopin Nocturne, Still D.R.E.).
234
+ - `events`: Sequential note events (`keys`, `dur`, `wait`), used for classic solo and chord transcriptions.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "virtual-piano-player",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Autonomous browser-controlled virtual piano player with 88 visible keys, sustain pedal, and studio-grade Web Audio synthesis.",
5
5
  "main": "index.js",
6
6
  "bin": {
package/scripts/play.js CHANGED
@@ -75,6 +75,16 @@ function listSongs() {
75
75
  const SONG_ORDER = [
76
76
  { file: 'amelie.json', alias: 'amelie', shortcut: 'play-amelie' },
77
77
  { file: 'chopin_nocturne.json', alias: 'nocturne', shortcut: 'play-nocturne' },
78
+ { file: 'golden_hour.json', alias: 'golden', shortcut: 'play-golden' },
79
+ { file: 'idea_10.json', alias: 'idea10', shortcut: 'play-idea10' },
80
+ { file: 'solas.json', alias: 'solas', shortcut: 'play-solas' },
81
+ { file: 'blue.json', alias: 'blue', shortcut: 'play-blue' },
82
+ { file: 'love_story.json', alias: 'lovestory', shortcut: 'play-lovestory' },
83
+ { file: 'hijo_de_la_luna.json', alias: 'luna', shortcut: 'play-luna' },
84
+ { file: 'pretty_little_baby.json', alias: 'baby', shortcut: 'play-baby' },
85
+ { file: 'hotline.json', alias: 'hotline', shortcut: 'play-hotline' },
86
+ { file: 'i_thought_i_saw_your_face_today.json', alias: 'face', shortcut: 'play-face' },
87
+ { file: 'every_living_breathing_moment.json', alias: 'moment', shortcut: 'play-moment' },
78
88
  { file: 'succession.json', alias: 'succession', shortcut: 'play-succession' },
79
89
  { file: 'still_dre.json', alias: 'still', shortcut: 'play-still' },
80
90
  { file: 'paint_it_black.json', alias: 'paint', shortcut: 'play-paint' },
@@ -227,6 +237,26 @@ function loadSong(options) {
227
237
  filePath = path.join(songsDir, 'succession.json');
228
238
  } else if (s === 'amelie' || s === 'comptine' || s === 'comptine_dun_autre_ete' || s === 'tiersen' || s === 'yann_tiersen') {
229
239
  filePath = path.join(songsDir, 'amelie.json');
240
+ } else if (s === 'golden' || s === 'golden_hour' || s === 'goldenhour' || s === 'jvke' || s === 'jvke_golden_hour') {
241
+ filePath = path.join(songsDir, 'golden_hour.json');
242
+ } else if (s === 'idea10' || s === 'idea_10' || s === 'idea' || s === 'gibran' || s === 'alcocer' || s === 'gibran_alcocer') {
243
+ filePath = path.join(songsDir, 'idea_10.json');
244
+ } else if (s === 'solas' || s === 'jamie' || s === 'duffy' || s === 'jamie_duffy') {
245
+ filePath = path.join(songsDir, 'solas.json');
246
+ } else if (s === 'blue' || s === 'yungkai' || s === 'yung_kai' || s === 'kai') {
247
+ filePath = path.join(songsDir, 'blue.json');
248
+ } else if (s === 'baby' || s === 'pretty_little_baby' || s === 'pretty' || s === 'connie' || s === 'francis' || s === 'connie_francis') {
249
+ filePath = path.join(songsDir, 'pretty_little_baby.json');
250
+ } else if (s === 'hotline' || s === 'hotline_edit' || s === 'billie' || s === 'eilish' || s === 'billie_eilish' || s === 'hotline_bling') {
251
+ filePath = path.join(songsDir, 'hotline.json');
252
+ } else if (s === 'face' || s === 'i_thought_i_saw_your_face_today' || s === 'she_and_him' || s === 'she&him' || s === 'sheandhim' || s === 'deschanel') {
253
+ filePath = path.join(songsDir, 'i_thought_i_saw_your_face_today.json');
254
+ } else if (s === 'luna' || s === 'hijo_de_la_luna' || s === 'hijo' || s === 'mecano' || s === 'cano') {
255
+ filePath = path.join(songsDir, 'hijo_de_la_luna.json');
256
+ } else if (s === 'lovestory' || s === 'love_story' || s === 'indila' || s === 'love') {
257
+ filePath = path.join(songsDir, 'love_story.json');
258
+ } else if (s === 'moment' || s === 'every_living_breathing_moment' || s === 'grant' || s === 'steller' || s === 'grant_steller' || s === 'breathing') {
259
+ filePath = path.join(songsDir, 'every_living_breathing_moment.json');
230
260
  } else {
231
261
  filePath = path.join(songsDir, `${s}.json`);
232
262
  }