From 746cc72e985f25f0100495173fb70351d262dc0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1vid=20Szak=C3=A1llas?= Date: Sat, 1 Jul 2023 22:52:53 +0200 Subject: [PATCH] fix: remove circular dependencies --- packages/launchcontrol-common/src/eq.ts | 55 +++++++++++++ packages/launchcontrol-common/src/index.ts | 81 ++----------------- packages/launchcontrol-common/src/util.ts | 13 +++ packages/launchpad-common/src/App.ts | 2 +- packages/launchpad-common/src/Control.ts | 2 +- .../launchpad-common/src/ModifierSidebar.ts | 2 +- .../launchpad-common/src/PlaylistSidebar.ts | 2 +- .../launchpad-common/src/controls/hotcue.ts | 3 +- .../src/controls/samplerPad.ts | 3 +- packages/launchpad-common/src/device.ts | 14 +++- packages/launchpad-common/src/index.ts | 4 +- 11 files changed, 95 insertions(+), 86 deletions(-) create mode 100644 packages/launchcontrol-common/src/eq.ts create mode 100644 packages/launchcontrol-common/src/util.ts diff --git a/packages/launchcontrol-common/src/eq.ts b/packages/launchcontrol-common/src/eq.ts new file mode 100644 index 0000000..4dc691a --- /dev/null +++ b/packages/launchcontrol-common/src/eq.ts @@ -0,0 +1,55 @@ +import { range } from "@mixxx-launch/common" +import { absoluteNonLin, Component, MidiMessage } from "@mixxx-launch/mixxx" +import { ControlComponent, ControlMessage, root, setValue } from "@mixxx-launch/mixxx/src/Control" +import { LaunchControlDevice, LCMidiComponent } from "./device" +import { defaultVerticalGroupParams, VerticalGroupParams } from "./util" + +export enum Eq3Channel { + Low, + Mid, + High, +} + +const eq3 = (deck: number, col: number) => { + return [ + [`knob.0.${col}`, { type: 'eq3', params: { channel: Eq3Channel.High, deck: deck } }], + [`knob.1.${col}`, { type: 'eq3', params: { channel: Eq3Channel.Mid, deck: deck } }], + [`knob.2.${col}`, { type: 'eq3', params: { channel: Eq3Channel.Low, deck: deck } }], + ] as const +} + +export const makeEq3 = ({ template, columnOffset, numDecks }: VerticalGroupParams = defaultVerticalGroupParams) => (device: LaunchControlDevice): Component[] => { + const children: Component[] = [] + + const channelColorPalette = [ + [device.colors.hi_red, device.colors.lo_red], + [device.colors.hi_yellow, device.colors.lo_yellow], + [device.colors.hi_green, device.colors.lo_green], + [device.colors.hi_amber, device.colors.lo_amber], + ] + + for (const i of range(numDecks)) { + const col = i + columnOffset + const eqs = eq3(col, col) + for (const [midi, cd] of eqs) { + const effectParam = root.equalizerRacks[0].effect_units[cd.params.deck].effects[0].parameters[cd.params.channel] + const paramControlComponent = new ControlComponent(effectParam.value, true) + children.push(paramControlComponent) + + const killedControlComponent = new ControlComponent(effectParam.button_value) + children.push(killedControlComponent) + + const midiComponent = new LCMidiComponent(device, template, midi) + midiComponent.addListener('midi', ({ value }: MidiMessage) => { + setValue(effectParam.value, absoluteNonLin(value, 0, 1, 4)) + }) + + killedControlComponent.addListener('update', ({ value }: ControlMessage) => { + device.sendColor(template, midiComponent.led, channelColorPalette[i % 4][value ? 1 : 0]) + }) + children.push(midiComponent) + } + } + + return children +} diff --git a/packages/launchcontrol-common/src/index.ts b/packages/launchcontrol-common/src/index.ts index 0f9ee6d..ad4b34e 100644 --- a/packages/launchcontrol-common/src/index.ts +++ b/packages/launchcontrol-common/src/index.ts @@ -1,35 +1,15 @@ import { map, range } from '@mixxx-launch/common' -import { absoluteNonLin, channelControlDefs, Component, ControlComponent, MidiControlDef, MidiMessage, sendShortMsg, setValue } from "@mixxx-launch/mixxx" +import { channelControlDefs, Component, ControlComponent, MidiControlDef, MidiMessage, sendShortMsg, setValue } from "@mixxx-launch/mixxx" import { ControlMessage, createEffectUnitChannelDef, getValue, numDecks as mixxxNumDecks, root } from "@mixxx-launch/mixxx/src/Control" import { LaunchControlDevice, LCMidiComponent } from './device' import { makeEffectParameterPage } from './effectParameter' +import { makeEq3 } from './eq' import { makePadSelector } from './padSelector' import { MakePage, makePager } from './pager' +import { defaultVerticalGroupParams, VerticalGroupParams } from './util' export type MakeComponent = (device: LaunchControlDevice) => Component -export enum Eq3Channel { - Low, - Mid, - High, -} - -export const eq3 = (deck: number, col: number) => { - return [ - [`knob.0.${col}`, { type: "eq3", params: { channel: Eq3Channel.High, deck: deck, parameter: 'value' } }], - [`knob.1.${col}`, { type: "eq3", params: { channel: Eq3Channel.Mid, deck: deck, parameter: 'value' } }], - [`knob.2.${col}`, { type: "eq3", params: { channel: Eq3Channel.Low, deck: deck, parameter: 'value' } }], - ] as const -} - - -export const eq2kill = (deck: number, col: number) => { - return [ - [`pad.0.${col}`, { type: "eq", params: { channel: Eq3Channel.High, parameter: 'kill', deck: deck } }], - [`pad.1.${col}`, { type: "eq", params: { channel: Eq3Channel.Low, parameter: 'kill', deck: deck } }], - ] as const -} - export const gain = (deck: number, col: number) => { return [ [`fader.0.${col}`, { type: "gain", params: { deck: deck } }], @@ -48,10 +28,10 @@ export const effectEssentials = (unit: number, col: number) => { } const controlIndex = { - 'eq3': (channel: Eq3Channel, deck: number, parameter: 'value' | 'kill' = 'value') => { - return parameter === 'value' ? root.equalizerRacks[0].effect_units[deck].effects[0].parameters[channel].value : - root.equalizerRacks[0].effect_units[deck].effects[0].parameters[channel].button_value - }, + // 'eq3': (channel: Eq3Channel, deck: number, parameter: 'value' | 'kill' = 'value') => { + // return parameter === 'value' ? root.equalizerRacks[0].effect_units[deck].effects[0].parameters[channel].value : + // root.equalizerRacks[0].effect_units[deck].effects[0].parameters[channel].button_value + // }, 'gain': (deck: number) => { return channelControlDefs[deck].volume }, @@ -88,53 +68,6 @@ const container = (children: Component[]) => { }() } - -type VerticalGroupParams = { - template: number, - columnOffset: number, - numDecks: number, -} - -const defaultVerticalGroupParams: VerticalGroupParams = { - template: 0, - columnOffset: 0, - numDecks: mixxxNumDecks, -} - - -const makeEq3 = ({ template, columnOffset, numDecks }: VerticalGroupParams = defaultVerticalGroupParams) => (device: LaunchControlDevice): Component[] => { - const children: Component[] = [] - - const channelColorPalette = [ - device.colors.hi_red, - device.colors.hi_yellow, - device.colors.hi_green, - device.colors.hi_amber, - ] - - for (const i of range(numDecks)) { - const col = i + columnOffset - const eqs = eq3(col, col) - for (const [midi, cd] of eqs) { - const control = controlIndex[cd.type](cd.params.channel, cd.params.deck, cd.params.parameter) - const controlComponent = new ControlComponent(control, true) - children.push(controlComponent) - - - const midiComponent = new LCMidiComponent(device, template, midi) - midiComponent.addListener('midi', ({ value }: MidiMessage) => { - setValue(control, absoluteNonLin(value, 0, 1, 4)) - }) - midiComponent.addListener('mount', () => { - device.sendColor(template, midiComponent.led, channelColorPalette[i % 4]) - }) - children.push(midiComponent) - } - } - - return children -} - const makeGain = ({ template, columnOffset, numDecks }: VerticalGroupParams = defaultVerticalGroupParams) => (device: LaunchControlDevice): Component[] => { const children: Component[] = [] diff --git a/packages/launchcontrol-common/src/util.ts b/packages/launchcontrol-common/src/util.ts new file mode 100644 index 0000000..7cadd6e --- /dev/null +++ b/packages/launchcontrol-common/src/util.ts @@ -0,0 +1,13 @@ +import { numDecks } from "@mixxx-launch/mixxx/src/Control" + +export type VerticalGroupParams = { + template: number, + columnOffset: number, + numDecks: number, +} + +export const defaultVerticalGroupParams: VerticalGroupParams = { + template: 0, + columnOffset: 0, + numDecks: numDecks, +} diff --git a/packages/launchpad-common/src/App.ts b/packages/launchpad-common/src/App.ts index 44befef..b6e9a36 100644 --- a/packages/launchpad-common/src/App.ts +++ b/packages/launchpad-common/src/App.ts @@ -2,7 +2,7 @@ import ModifierSidebar, { modes, retainAttackMode } from './ModifierSidebar' import type { Modifier } from './ModifierSidebar' import { Component, MidiMessage } from '@mixxx-launch/mixxx' -import { LaunchpadDevice, MidiComponent, RGBColor } from '.' +import { LaunchpadDevice, MidiComponent, RGBColor } from './device' import { Action } from '@mixxx-launch/mixxx/src/util' import { ControlContext, makePresetTemplate, Preset, PresetConf } from './Control' import PlaylistSidebar from './PlaylistSidebar' diff --git a/packages/launchpad-common/src/Control.ts b/packages/launchpad-common/src/Control.ts index 2c5cfba..9a707da 100644 --- a/packages/launchpad-common/src/Control.ts +++ b/packages/launchpad-common/src/Control.ts @@ -10,7 +10,7 @@ import { ControlMessage, MidiMessage, } from '@mixxx-launch/mixxx' -import { LaunchpadDevice, MidiComponent } from '.' +import { LaunchpadDevice, MidiComponent } from './device' import makeControlTemplateIndex, { ControlTypeIndex } from './controls' import { default as makeSamplerPad } from './controls/samplerPad' diff --git a/packages/launchpad-common/src/ModifierSidebar.ts b/packages/launchpad-common/src/ModifierSidebar.ts index 6afe6a1..a7711e6 100644 --- a/packages/launchpad-common/src/ModifierSidebar.ts +++ b/packages/launchpad-common/src/ModifierSidebar.ts @@ -1,7 +1,7 @@ import type { MidiMessage } from '@mixxx-launch/mixxx' import { Component } from '@mixxx-launch/mixxx' -import { LaunchpadDevice, MidiComponent } from '.' +import { LaunchpadDevice, MidiComponent } from './device' export type ModifierState = { ctrl: boolean diff --git a/packages/launchpad-common/src/PlaylistSidebar.ts b/packages/launchpad-common/src/PlaylistSidebar.ts index 8219d44..934b556 100644 --- a/packages/launchpad-common/src/PlaylistSidebar.ts +++ b/packages/launchpad-common/src/PlaylistSidebar.ts @@ -1,6 +1,6 @@ import { playListControlDef, Timer, setValue, Component } from '@mixxx-launch/mixxx' import type { MidiMessage, ControlDef } from '@mixxx-launch/mixxx' -import { LaunchpadDevice, MidiComponent } from '.' +import { LaunchpadDevice, MidiComponent } from './device' import { ControlComponent, ControlMessage, getValue, masterControlDef } from '@mixxx-launch/mixxx/src/Control' const longInterval = 240 as const diff --git a/packages/launchpad-common/src/controls/hotcue.ts b/packages/launchpad-common/src/controls/hotcue.ts index db0bf4d..99dec67 100644 --- a/packages/launchpad-common/src/controls/hotcue.ts +++ b/packages/launchpad-common/src/controls/hotcue.ts @@ -1,9 +1,8 @@ import { range } from '@mixxx-launch/common' import type { ControlComponent, ControlMessage, MidiMessage } from '@mixxx-launch/mixxx' import { getValue, setValue } from '@mixxx-launch/mixxx' -import { parseRGBColor } from '../color' import { Control, MakeDeckControlTemplate } from '../Control' -import { MidiComponent } from '../device' +import { MidiComponent, parseRGBColor } from '../device' import { modes } from '../ModifierSidebar' export type Type = { diff --git a/packages/launchpad-common/src/controls/samplerPad.ts b/packages/launchpad-common/src/controls/samplerPad.ts index aa129a5..a3647b0 100644 --- a/packages/launchpad-common/src/controls/samplerPad.ts +++ b/packages/launchpad-common/src/controls/samplerPad.ts @@ -1,7 +1,6 @@ import type { ControlComponent, ControlMessage, MidiMessage } from '@mixxx-launch/mixxx' import { setValue } from '@mixxx-launch/mixxx' -import { LaunchpadDevice, MidiComponent } from '../device' -import { parseRGBColor, RGBColor } from '../color' +import { LaunchpadDevice, MidiComponent, parseRGBColor, RGBColor } from '../device' import { Control, MakeSamplerControlTemplate } from '../Control' import { modes } from '../ModifierSidebar' diff --git a/packages/launchpad-common/src/device.ts b/packages/launchpad-common/src/device.ts index 67b954e..9dadfa6 100644 --- a/packages/launchpad-common/src/device.ts +++ b/packages/launchpad-common/src/device.ts @@ -1,5 +1,17 @@ import { MidiControlDef, MidiDevice, sendShortMsg, MidiComponent as mixxxMidiComponent } from '@mixxx-launch/mixxx' -import { RGBColor } from './color' + +export type RGBColor = [number, number, number] + +export const parseRGBColor = (number: number): RGBColor | null => { + if (number === -1) { + return null + } + const blue = number % 256 + const green = (number >> 8) % 256 + const red = (number >> 16) % 256 + return [red, green, blue] +} + export abstract class LaunchpadDevice extends MidiDevice { abstract colors: { [key: string]: number } diff --git a/packages/launchpad-common/src/index.ts b/packages/launchpad-common/src/index.ts index b12e075..8367cb0 100644 --- a/packages/launchpad-common/src/index.ts +++ b/packages/launchpad-common/src/index.ts @@ -15,6 +15,4 @@ export type ControllerControlDef = [number, number]; export const convertControlDef = (name: string, [status, midino]: ControllerControlDef): MidiControlDef => ({ name, status, midino }) -export type { RGBColor } from './color' - -export { LaunchpadDevice, MidiComponent } from './device' +export { RGBColor, LaunchpadDevice, MidiComponent } from './device'