Skip to content

Commit 77ca9fe

Browse files
committed
new sample mapping 30-61
1 parent c570bee commit 77ca9fe

7 files changed

Lines changed: 78 additions & 50 deletions

File tree

src/lib/components/DeviceConnection.svelte

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@
2727
});
2828
});
2929
30-
// ADDED: Derived store to check if a firmware update is available
30+
// ADDED: Derived store to check if a firmware update is available and not ignored
3131
const firmwareUpdateAvailable = derived(midiStore, ($midiStore) => {
32-
if ($midiStore.isConnected) {
32+
if ($midiStore.isConnected && !$midiStore.ignoreFirmwareUpdate) {
3333
// If firmwareVersion is null, it means we haven't received it yet or it's not supported.
3434
// In this case, we assume an update might be needed to prompt the user.
3535
return isNewerVersion($midiStore.firmwareVersion, LATEST_FIRMWARE_VERSION);
@@ -138,15 +138,20 @@
138138
({$_('firmware_version_label', { values: { version: $midiStore.firmwareVersion } })}){/if}
139139
</p>
140140
<p class="text-yellow-700 mt-2">
141-
{$_('firmware_update_available', { values: { latestVersion: LATEST_FIRMWARE_VERSION } })}
141+
{$_('firmware_update_available', { values: { currentVersion: $midiStore.firmwareVersion || 'Unknown', latestVersion: LATEST_FIRMWARE_VERSION } })}
142142
</p>
143-
<a
144-
href={FIRMWARE_DOWNLOAD_URL}
145-
download
146-
class="inline-block mt-2 px-4 py-2 bg-purple-600 text-white rounded hover:bg-purple-700"
147-
>
148-
{$_('download_firmware_button')}
149-
</a>
143+
<div class="mt-2 flex gap-2">
144+
<a
145+
href={FIRMWARE_DOWNLOAD_URL}
146+
download
147+
class="inline-block px-4 py-2 bg-purple-600 text-white rounded hover:bg-purple-700"
148+
>
149+
{$_('download_firmware_button')}
150+
</a>
151+
<button class="px-4 py-2 bg-gray-500 text-white rounded hover:bg-gray-600" onclick={midiStore.ignoreFirmwareUpdate}>
152+
{$_('ignore_firmware_update_button')}
153+
</button>
154+
</div>
150155
<div class="mt-2 flex gap-2">
151156
<button class="px-4 py-2 bg-red-500 text-white rounded hover:bg-red-600" onclick={handleDisconnect}>
152157
{$_('device_disconnect_button')}

src/lib/components/SampleTable.svelte

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -6,47 +6,47 @@
66
// Define specific sample data for each track, including MIDI note and raw LED color
77
// This structure allows for non-consecutive MIDI notes and tightly couples them with colors.
88
const track1SampleData: { midiNoteNumber: number; ledColorRgb: [number, number, number] }[] = [
9-
{ midiNoteNumber: 42, ledColorRgb: [255, 255, 0] }, // C2
10-
{ midiNoteNumber: 44, ledColorRgb: [255, 225, 0] }, // C#2
11-
{ midiNoteNumber: 46, ledColorRgb: [255, 195, 0] }, // D2
12-
{ midiNoteNumber: 49, ledColorRgb: [255, 165, 0] }, // D#2
13-
{ midiNoteNumber: 51, ledColorRgb: [255, 255, 32] }, // E2
14-
{ midiNoteNumber: 52, ledColorRgb: [255, 225, 32] }, // F2
15-
{ midiNoteNumber: 53, ledColorRgb: [255, 195, 32] }, // F#2
16-
{ midiNoteNumber: 57, ledColorRgb: [255, 165, 32] } // G2
9+
{ midiNoteNumber: 30, ledColorRgb: [255, 255, 0] },
10+
{ midiNoteNumber: 31, ledColorRgb: [255, 225, 0] },
11+
{ midiNoteNumber: 32, ledColorRgb: [255, 195, 0] },
12+
{ midiNoteNumber: 33, ledColorRgb: [255, 165, 0] },
13+
{ midiNoteNumber: 34, ledColorRgb: [255, 255, 32] },
14+
{ midiNoteNumber: 35, ledColorRgb: [255, 225, 32] },
15+
{ midiNoteNumber: 36, ledColorRgb: [255, 195, 32] },
16+
{ midiNoteNumber: 37, ledColorRgb: [255, 165, 32] }
1717
];
1818
1919
const track2SampleData: { midiNoteNumber: number; ledColorRgb: [number, number, number] }[] = [
20-
{ midiNoteNumber: 45, ledColorRgb: [0, 255, 0] }, // C1
21-
{ midiNoteNumber: 58, ledColorRgb: [0, 255, 30] }, // C#1
22-
{ midiNoteNumber: 59, ledColorRgb: [0, 255, 60] }, // D1
23-
{ midiNoteNumber: 60, ledColorRgb: [0, 255, 90] }, // D#1
24-
{ midiNoteNumber: 61, ledColorRgb: [16, 255, 16] }, // E1
25-
{ midiNoteNumber: 62, ledColorRgb: [16, 255, 30] }, // F1
26-
{ midiNoteNumber: 63, ledColorRgb: [16, 255, 60] }, // F#1
27-
{ midiNoteNumber: 64, ledColorRgb: [32, 255, 90] }, // G1
20+
{ midiNoteNumber: 38, ledColorRgb: [0, 255, 0] },
21+
{ midiNoteNumber: 39, ledColorRgb: [0, 255, 30] },
22+
{ midiNoteNumber: 40, ledColorRgb: [0, 255, 60] },
23+
{ midiNoteNumber: 41, ledColorRgb: [0, 255, 90] },
24+
{ midiNoteNumber: 42, ledColorRgb: [16, 255, 16] },
25+
{ midiNoteNumber: 43, ledColorRgb: [16, 255, 30] },
26+
{ midiNoteNumber: 44, ledColorRgb: [16, 255, 60] },
27+
{ midiNoteNumber: 45, ledColorRgb: [32, 255, 90] }
2828
];
2929
3030
const track3SampleData: { midiNoteNumber: number; ledColorRgb: [number, number, number] }[] = [
31-
{ midiNoteNumber: 38, ledColorRgb: [0, 0, 255] }, // C0
32-
{ midiNoteNumber: 40, ledColorRgb: [0, 40, 255] }, // C#0
33-
{ midiNoteNumber: 39, ledColorRgb: [0, 80, 255] }, // D0
34-
{ midiNoteNumber: 54, ledColorRgb: [0, 120, 255] }, // D#0
35-
{ midiNoteNumber: 56, ledColorRgb: [16, 16, 255] }, // E0
36-
{ midiNoteNumber: 75, ledColorRgb: [16, 40, 255] }, // F0
37-
{ midiNoteNumber: 76, ledColorRgb: [32, 80, 255] }, // F#0
38-
{ midiNoteNumber: 77, ledColorRgb: [48, 120, 255] },// G0
31+
{ midiNoteNumber: 46, ledColorRgb: [0, 0, 255] },
32+
{ midiNoteNumber: 47, ledColorRgb: [0, 40, 255] },
33+
{ midiNoteNumber: 48, ledColorRgb: [0, 80, 255] },
34+
{ midiNoteNumber: 49, ledColorRgb: [0, 120, 255] },
35+
{ midiNoteNumber: 50, ledColorRgb: [16, 16, 255] },
36+
{ midiNoteNumber: 51, ledColorRgb: [16, 40, 255] },
37+
{ midiNoteNumber: 52, ledColorRgb: [32, 80, 255] },
38+
{ midiNoteNumber: 53, ledColorRgb: [48, 120, 255] }
3939
];
4040
4141
const track4SampleData: { midiNoteNumber: number; ledColorRgb: [number, number, number] }[] = [
42-
{ midiNoteNumber: 35, ledColorRgb: [255, 0, 0] }, // C-1
43-
{ midiNoteNumber: 36, ledColorRgb: [255, 0, 32] }, // C#-1
44-
{ midiNoteNumber: 37, ledColorRgb: [255, 0, 64] }, // D-1
45-
{ midiNoteNumber: 41, ledColorRgb: [255, 0, 96] }, // D#-1
46-
{ midiNoteNumber: 43, ledColorRgb: [255, 16, 16] }, // E-1
47-
{ midiNoteNumber: 47, ledColorRgb: [255, 16, 32] }, // F-1
48-
{ midiNoteNumber: 48, ledColorRgb: [255, 32, 64] }, // F#-1
49-
{ midiNoteNumber: 50, ledColorRgb: [255, 32, 96] }, // G-1
42+
{ midiNoteNumber: 54, ledColorRgb: [255, 0, 0] },
43+
{ midiNoteNumber: 55, ledColorRgb: [255, 0, 32] },
44+
{ midiNoteNumber: 56, ledColorRgb: [255, 0, 64] },
45+
{ midiNoteNumber: 57, ledColorRgb: [255, 0, 96] },
46+
{ midiNoteNumber: 58, ledColorRgb: [255, 16, 16] },
47+
{ midiNoteNumber: 59, ledColorRgb: [255, 16, 32] },
48+
{ midiNoteNumber: 60, ledColorRgb: [255, 32, 64] },
49+
{ midiNoteNumber: 61, ledColorRgb: [255, 32, 96] }
5050
];
5151
5252
/**

src/lib/stores/midi.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ interface MidiState {
1111
error: string | null;
1212
isRequestingAccess: boolean;
1313
firmwareVersion: string | null;
14+
ignoreFirmwareUpdate: boolean;
1415
}
1516

1617
const initialState: MidiState = {
@@ -23,6 +24,7 @@ const initialState: MidiState = {
2324
error: null,
2425
isRequestingAccess: false,
2526
firmwareVersion: null,
27+
ignoreFirmwareUpdate: false,
2628
};
2729

2830
const SYSEX_START = 0xF0;
@@ -175,6 +177,13 @@ function _setFirmwareVersion(fwVersion: string | null) {
175177
}));
176178
}
177179

180+
function _setIgnoreFirmwareUpdate(ignore: boolean) {
181+
update(state => ({
182+
...state,
183+
ignoreFirmwareUpdate: ignore,
184+
}));
185+
}
186+
178187
// Action to update the list of available MIDI devices, typically on state change
179188
function _updateAvailableMidiDevices(midiAccess: MIDIAccess) {
180189
update(state => ({
@@ -245,13 +254,19 @@ function connectDevice(deviceId: string) {
245254
input.onmidimessage = (event) => {
246255
const data = event.data;
247256
console.log('Incoming MIDI message:', data);
257+
console.log('Message as hex:', Array.from(data).map(b => b.toString(16).padStart(2, '0')).join(' '));
248258

249259
if (data[0] === SYSEX_START) {
260+
console.log('Detected SysEx message, parsing...');
250261
const fwVersion = parseSysExIdentityReply(data);
251262
if (fwVersion) {
263+
console.log('Successfully parsed firmware version:', fwVersion);
252264
_setFirmwareVersion(fwVersion);
265+
} else {
266+
console.log('Failed to parse firmware version from SysEx');
253267
}
254268
} else {
269+
console.log('Regular MIDI message, handling as note...');
255270
handleMidiNoteMessage(data);
256271
}
257272
};
@@ -342,6 +357,10 @@ function playNote(noteNumber: number) {
342357
}
343358
}
344359

360+
function ignoreFirmwareUpdate() {
361+
_setIgnoreFirmwareUpdate(true);
362+
}
363+
345364
export const midiStore = {
346365
subscribe,
347366
requestMidiAccess,
@@ -350,4 +369,5 @@ export const midiStore = {
350369
playNote,
351370
requestIdentity,
352371
rebootToBootloader,
372+
ignoreFirmwareUpdate,
353373
};

src/locales/de.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"firmware_version_label": "Firmware: {version}",
2727
"reboot_bootloader_button": "Neustart in Bootloader",
2828
"reboot_bootloader_confirm": "Dies wird das Gerät in den Bootloader-Modus neu starten. Fortfahren?",
29-
"firmware_update_available": "Eine neue Firmware-Version ({latestVersion}) ist verfügbar!",
30-
"download_firmware_button": "Firmware herunterladen (.UF2)"
29+
"firmware_update_available": "Firmware-Update verfügbar! Aktuell: {currentVersion}, Neueste: {latestVersion}",
30+
"download_firmware_button": "Firmware herunterladen (.UF2)",
31+
"ignore_firmware_update_button": "Trotzdem fortfahren"
3132
}

src/locales/en.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"firmware_version_label": "Firmware: {version}",
2727
"reboot_bootloader_button": "Reboot to Bootloader",
2828
"reboot_bootloader_confirm": "This will reboot the device to bootloader mode. Continue?",
29-
"firmware_update_available": "A new firmware version ({latestVersion}) is available!",
30-
"download_firmware_button": "Download Firmware (.UF2)"
29+
"firmware_update_available": "Firmware update available! Current: {currentVersion}, Latest: {latestVersion}",
30+
"download_firmware_button": "Download Firmware (.UF2)",
31+
"ignore_firmware_update_button": "Continue Anyway"
3132
}

src/locales/nl.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"firmware_version_label": "Firmware: {version}",
2727
"reboot_bootloader_button": "Opnieuw opstarten naar bootloader",
2828
"reboot_bootloader_confirm": "Dit zal het apparaat opnieuw opstarten naar de bootloader-modus. Doorgaan?",
29-
"firmware_update_available": "Een nieuwe firmware-versie ({latestVersion}) is beschikbaar!",
30-
"download_firmware_button": "Firmware downloaden (.UF2)"
29+
"firmware_update_available": "Firmware-update beschikbaar! Huidige: {currentVersion}, Nieuwste: {latestVersion}",
30+
"download_firmware_button": "Firmware downloaden (.UF2)",
31+
"ignore_firmware_update_button": "Toch doorgaan"
3132
}

src/routes/+page.svelte

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
import { LATEST_FIRMWARE_VERSION } from '$lib/config/firmware';
88
import { isNewerVersion } from '$lib/utils/versioning';
99
10-
// Derived store to check if a firmware update is available
10+
// Derived store to check if a firmware update is available and not ignored
1111
const firmwareUpdateAvailable = derived(midiStore, ($midiStore) => {
12-
if ($midiStore.isConnected) {
12+
if ($midiStore.isConnected && !$midiStore.ignoreFirmwareUpdate) {
1313
return isNewerVersion($midiStore.firmwareVersion, LATEST_FIRMWARE_VERSION);
1414
}
1515
return false;

0 commit comments

Comments
 (0)