Skip to content

Commit 3d4e9c3

Browse files
author
dogatech
committed
msb/lsb midi no longer separate values
1 parent d5a07c0 commit 3d4e9c3

5 files changed

Lines changed: 53 additions & 41 deletions

File tree

be/src/SoulSifterSettings.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,7 @@ namespace soulsifter {
5555
//ptree.put("midi.pauseAudio", "");
5656
ptree.put("midi.volume.exponentialFactor", "0.25");
5757
ptree.put("midi.volume.linearFactor", "1.125");
58-
//ptree.put("midi.volume.lsb", "");
59-
//ptree.put("midi.volume.msb", "");
58+
//ptree.put("midi.volume.value", "");
6059
ptree.put("search.energyGap", 1);
6160
ptree.put("search.includeUnknownKeys", true);
6261
ptree.put("songList.column.bpm", true);

fe/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "SoulSifter",
33
"version": "1.10.0",
44
"description": "DJ & music organization app.",
5-
"build": 4208,
5+
"build": 4213,
66
"main": "main.js",
77
"scripts": {
88
"fe:build": "vite build",

fe/src/midi-manager.js

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import { WebMidi } from "webmidi";
22

3+
import { Utilities } from "webmidi";
4+
5+
36
class MidiNote {
47
constructor(note) {
58
if (!/^[0-9A-Fa-f]{2} [0-9A-Fa-f]{2} [0-9A-Fa-fx]{2}$/.test(note)) {
@@ -35,6 +38,7 @@ class MidiManager {
3538
// This structured map will hold all registered callbacks
3639
this._channelCallbacks = []
3740
MidiManager.instance = this;
41+
this._msb = {};
3842
}
3943

4044
async connect(controllerName) {
@@ -89,34 +93,51 @@ class MidiManager {
8993
registerInput(note, callback) {
9094
try {
9195
if (!note || !callback) return;
92-
const notes = note.split(',').map(item => item.trim());
96+
const notes = note.split(',').map(n => n.trim());
9397
for (note of notes) {
9498
console.log(`${note} registering`);
95-
const midiNote = new MidiNote(note);
96-
let chanCb = this._channelCallbacks[midiNote.channel];
97-
if (!chanCb) {
98-
chanCb = {};
99-
this._channelCallbacks[midiNote.channel] = chanCb;
100-
}
101-
let typeCb = chanCb[midiNote.type];
102-
if (!typeCb) {
103-
typeCb = [];
104-
chanCb[midiNote.type] = typeCb;
99+
if (note.includes('/')) {
100+
const [msb, lsb] = note.split('/').map(n => new MidiNote(n.trim()));
101+
const uuid = crypto.randomUUID();
102+
const msbCallback = e => this._msb[uuid] = e.rawValue;
103+
this._registerInput(msb, msbCallback);
104+
const lsbCallback = e => {
105+
const value = Utilities.fromMsbLsbToFloat(this._msb[uuid], e.rawValue);
106+
e.rawValue = value;
107+
callback(e);
108+
};
109+
this._registerInput(lsb, lsbCallback);
110+
} else {
111+
const midiNote = new MidiNote(note);
112+
this._registerInput(midiNote, callback);
105113
}
106-
let cb = typeCb[midiNote.byte1];
107-
if (!cb) {
108-
cb = [];
109-
typeCb[midiNote.byte1] = cb;
110-
this._setupListenerOnChannelForType(midiNote.channel, midiNote.type);
111-
}
112-
cb.push([midiNote, callback]);
113114
}
114115
} catch (err) {
115116
console.error(err);
116117
return;
117118
}
118119
}
119120

121+
_registerInput(midiNote, callback) {
122+
let chanCb = this._channelCallbacks[midiNote.channel];
123+
if (!chanCb) {
124+
chanCb = {};
125+
this._channelCallbacks[midiNote.channel] = chanCb;
126+
}
127+
let typeCb = chanCb[midiNote.type];
128+
if (!typeCb) {
129+
typeCb = [];
130+
chanCb[midiNote.type] = typeCb;
131+
}
132+
let cb = typeCb[midiNote.byte1];
133+
if (!cb) {
134+
cb = [];
135+
typeCb[midiNote.byte1] = cb;
136+
this._setupListenerOnChannelForType(midiNote.channel, midiNote.type);
137+
}
138+
cb.push([midiNote, callback]);
139+
}
140+
120141
// Method for components to unregister their inputs
121142
// unregisterInput(note, callback) {
122143
// const midiNote = new MidiNote(note);

fe/src/search-toolbar.js

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ import "@material/web/dialog/dialog.js";
44
import "@material/web/textfield/filled-text-field.js";
55
import "@thomasloven/round-slider";
66

7-
import { Utilities } from "webmidi";
8-
97
import { midiManager } from './midi-manager.js';
108
import { AlertsMixin } from "./mixin-alerts-pub.js";
119
import { BpmMixin } from "./mixin-bpm.js";
@@ -410,14 +408,9 @@ class SearchToolbar extends AlertsMixin(BpmMixin(QueryMixin(SearchMixin(SearchOp
410408
e => this.dispatchEvent(new CustomEvent('audio-pause', {bubbles: true, composed: true}))
411409
);
412410
midiManager.registerInput(
413-
this.settings.getString('midi.volume.msb'), // 13
414-
e => this.note = e.rawValue
415-
);
416-
midiManager.registerInput(
417-
this.settings.getString('midi.volume.lsb'), // 33
411+
this.settings.getString('midi.volume.value'),
418412
e => {
419-
let value = Utilities.fromMsbLsbToFloat(this.note, e.rawValue);
420-
this.note = undefined;
413+
const value = e.rawValue;
421414
let exp = Number(this.settings.getString('midi.volume.exponentialFactor'));
422415
let linear = Number(this.settings.getString('midi.volume.linearFactor'));
423416
// 0.93*x^1/2.5 looks to match the closest curve,

fe/src/settings-edit.js

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ import { SettingsMixin } from "./mixin-settings.js";
1010

1111
class SettingsEdit extends SettingsMixin(LitElement) {
1212
render() {
13-
const rawMidiPattern = "[89A-E,a-e][0-9A-Fa-f] [0-7][0-9A-Fa-f] [x0-7][x0-9A-Fa-f]";
13+
const note = "[89A-E,a-e][0-9A-Fa-f] [0-7][0-9A-Fa-f] [x0-7][x0-9A-Fa-f]";
14+
const dblNote = `${note}\\s*(/\\s*${note})?`;
15+
const rawMidiPattern = `^(${dblNote},\s*)?${dblNote}$`;
1416
return html`
1517
<abstract-action-page @cancel="${this.exit}" @accept="${this.save}">
1618
<div class="outer">
@@ -73,17 +75,16 @@ class SettingsEdit extends SettingsMixin(LitElement) {
7375
<div class="fields">
7476
<md-filled-text-field label="Midi volume exp scale" .value=${this.midiVolumeExponentialFactor} id="midiVolumeExponentialFactor"></md-filled-text-field>
7577
<md-filled-text-field label="Midi volume linear scale" .value=${this.midiVolumeLinearFactor} id="midiVolumeLinearFactor"></md-filled-text-field>
76-
<md-filled-text-field label="Volume (msb)" .value=${this.midiVolumeMsb} id="midiVolumeMsb" allowedPattern="${rawMidiPattern}"></md-filled-text-field>
77-
<md-filled-text-field label="Volume (lsb)" .value=${this.midiVolumeLsb} id="midiVolumeLsb" allowedPattern="${rawMidiPattern}"></md-filled-text-field>
78+
<md-filled-text-field label="Volume" .value=${this.midiVolumeValue} id="midiVolumeValue" allowedPattern="${rawMidiPattern}"></md-filled-text-field>
7879
<br>
7980
<md-filled-text-field label="Preview Start Time (in %)" .value=${this.songListPreviewStartPercent} id="songListPreviewStartPercent"></md-filled-text-field>
8081
</div>
8182
<div class="fields">
8283
<label>Midi for VDJ stem responsiveness</label>
83-
<md-filled-text-field type="textarea" label="BPM updates (Deck 1)" .value="${this.virtualdjMidiBpmDeck1}" id="virtualdjMidiBpmDeck1" rows="3"></md-filled-text-field>
84-
<md-filled-text-field type="textarea" label="BPM updates (Deck 2)" .value="${this.virtualdjMidiBpmDeck2}" id="virtualdjMidiBpmDeck2" rows="3"></md-filled-text-field>
85-
<md-filled-text-field type="textarea" label="Position updates (Deck 1)" .value="${this.virtualdjMidiPositionDeck1}" id="virtualdjMidiPositionDeck1" rows="3"></md-filled-text-field>
86-
<md-filled-text-field type="textarea" label="Position updates (Deck 2)" .value="${this.virtualdjMidiPositionDeck2}" id="virtualdjMidiPositionDeck2" rows="3"></md-filled-text-field>
84+
<md-filled-text-field type="textarea" label="BPM updates (Deck 1)" .value="${this.virtualdjMidiBpmDeck1}" id="virtualdjMidiBpmDeck1" rows="3" allowedPattern="${rawMidiPattern}"></md-filled-text-field>
85+
<md-filled-text-field type="textarea" label="BPM updates (Deck 2)" .value="${this.virtualdjMidiBpmDeck2}" id="virtualdjMidiBpmDeck2" rows="3" allowedPattern="${rawMidiPattern}"></md-filled-text-field>
86+
<md-filled-text-field type="textarea" label="Position updates (Deck 1)" .value="${this.virtualdjMidiPositionDeck1}" id="virtualdjMidiPositionDeck1" rows="3" allowedPattern="${rawMidiPattern}"></md-filled-text-field>
87+
<md-filled-text-field type="textarea" label="Position updates (Deck 2)" .value="${this.virtualdjMidiPositionDeck2}" id="virtualdjMidiPositionDeck2" rows="3" allowedPattern="${rawMidiPattern}"></md-filled-text-field>
8788
</div>
8889
</section>
8990
<section>
@@ -179,8 +180,7 @@ class SettingsEdit extends SettingsMixin(LitElement) {
179180
this.midiPauseAudio = this.settings.getString('midi.pauseAudio');
180181
this.midiVolumeExponentialFactor = this.settings.getString('midi.volume.exponentialFactor');
181182
this.midiVolumeLinearFactor = this.settings.getString('midi.volume.linearFactor');
182-
this.midiVolumeLsb = this.settings.getString('midi.volume.lsb');
183-
this.midiVolumeMsb = this.settings.getString('midi.volume.msb');
183+
this.midiVolumeValue = this.settings.getString('midi.volume.value');
184184
this.songListColBpm = this.settings.getBool('songList.column.bpm');
185185
this.songListColBpmShift = this.settings.getBool('songList.column.bpmShift');
186186
this.songListColComments = this.settings.getBool('songList.column.comments');
@@ -322,8 +322,7 @@ class SettingsEdit extends SettingsMixin(LitElement) {
322322
this.puts('midi.pauseAudio', this.shadowRoot.getElementById('midiPauseAudio').value);
323323
this.puts('midi.volume.exponentialFactor', this.shadowRoot.getElementById('midiVolumeExponentialFactor').value);
324324
this.puts('midi.volume.linearFactor', this.shadowRoot.getElementById('midiVolumeLinearFactor').value);
325-
this.puts('midi.volume.lsb', this.shadowRoot.getElementById('midiVolumeLsb').value);
326-
this.puts('midi.volume.msb', this.shadowRoot.getElementById('midiVolumeMsb').value);
325+
this.puts('midi.volume.value', this.shadowRoot.getElementById('midiVolumeValue').value);
327326
this.putb('songList.column.bpm', this.shadowRoot.getElementById('songListColBpm').checked);
328327
this.putb('songList.column.bpmShift', this.shadowRoot.getElementById('songListColBpmShift').checked);
329328
this.putb('songList.column.comments', this.shadowRoot.getElementById('songListColComments').checked);

0 commit comments

Comments
 (0)