Skip to content
Permalink
main
Switch branches/tags
Go to file
 
 
Cannot retrieve contributors at this time
TODO:
- pad "8" on rolls page is still not not turned on
- Beat FX: (golden lady italy) "memory"+beat Arrow - changes selected effect in FX unit4
idea for CMDR:
- reports: collapse on purpose:
- remove device page to see just commands
- replace command number (hotcue 1 type) with X to collapse on purpose
- remove all conditions command
for v7.5
- have nothing going out at first step of installation
- 4 beats / 8 beats default loop
- backspin: already found it it’s with the m2 modifier put it the sensitivity on 20 %now the backspin is much longer
- implement loop midi: https://www.native-instruments.com/forum/threads/mappable-traktor-lfo-beatsynced.167529/
- check LINE selector for volume turn off safety feature (beatFX is ok)
- move backwards loop to pad modes - remove lag
- loops active long press
- move jog adjust to its own constant state (like cdjs)
-----------------
rekordbox mode:
go to start of track: shift+cue
navigation features just like rekordbox
quick search (holding search)
quick search (search+jog turn)
volume zero - by some reason it still did not read the fader position at lower
move needle with pitch bend message as well.
documentation:
quick search: expain how it is done
move to front: explain how it is done
how to change the clock value
Steps to release a new version:
-------------------------------
- pdfs: regenerate all pdfs
- bome settings: re-export, remove paths and project
- bome: DISABLE dev mode
- traktor: check 4x default mixerFX <<<<<<<<<<<<<
- traktor: enable HC-4500
- traktor: select 2-decks classic (smaller screen)
- cmdr: check encoder relative
------
- mac version: copy paste TSIs by hand in cmdr
- mac version: set mac bit
performance improvement - graphs:
---------------------------------
The sequence of actions is as follows:
a) play deck A normally.
- Outputs are needle turning and the mixer "VU meter"
b) kill gain to remove the "VU meter". Deck is stll playing
c) do some basic scratch
Blink timer Performance:
------------------------
blink clock -> t_blink (coalesced = 1) -> t_blink1
t_blink -> led sync -> solid on -> if coalesced -> exit
pressed button -> calc () -> cascade (coalescend = 0 ) -> t_blink1
"xx": 0 = by normal; 1 = by blinking (are we trying to blink?)
"hm"/1: 0 = woke by timer; 1 = woke by button (did we trigger by button)
"ww": blink scaled delay
"hn"/1 - blink slowdown master (5ms
configuration user feedback:
----------------------------
- tempo emarger - master tempo doesnt blink
- auto layout - impossible
- ttfx - play doesnt blink
- superknobs - no feedback
- sync aid - yes
- external cue - yes
----------
Fake array variables (per channel):
ABCD EFGH IJKL _M_ _N_ OPQR STUV XYZW _0_ 1234 5678 _9_
normal loops, again:
--------------------
pads:
- loop set+size
- if no loop -> set at that point
- if loop:
- same size -> turn OFF (even if we changed the edges!)
- new size: chnge out point
direct command:
- loop size selector:
- if same size, does not change anything
- loop set - disables loop if we are there!
Dual deck mode:
---------------
"ln"/1 - config: dual deck
0: disabled
1: only scratch
2: +pads
3: +mixer as well
CDJ-3000 loops:
--------------
https://www.native-instruments.com/forum/threads/support-odd-numbered-loops-for-polyrhythms-like-the-cdj-3000.425399/
DESIRED OUTCOME:
1: 3/4 ; 2: 1 ; 3: 1.5 ; 4: 3;
5: 5 ; 6: 6 ; 7: 7 ; 8: 9
METHOD:
1: 1-1/4 ; 2: 1 ; 3: 2-1/2 ; 4: 4-1
5: 4+1 ; 6: 8-2 ; 7: 8-1 ; 8: 8+1
IN move size: CC "71"
(0 = xfine ; 1= fine; 2 = 1/16; 3=1/8;
4=1/4; 5=1/2; 6=1; 7=2; 8=4; 9=8; 10=16;11=32; 12=loop)
fixed: note 88, no shift
2 1 1/2 1/4
4 8 16 32
variables:
"g5"/4 - polyrhythms - current selection (0: none; 1= 3/4; 2=1; ....
TSI side:
h0 = 1..4
------
TSI commands:
92: POLY - MOVE SIZE (IN, direct)
113: POLY - Loop size + Set DIRECT
114: POLY - Loop size selector DIRECT
115: POLY - Loop active ON/OFF
116: FREE
operations:
cancel:
loop active: 115
Set poly:
a) set 32 beats (ch1)
b) set base beats (ch1)
c) set move loop out (ch8 = pad page)
d) set move size (ch1)
e) do it (ch8)
TSI settings:
-------------
source: TP3 manual
- Keyboard Mappings:
- Export / import settings for keyboard mappings as configured in Preferences Controller Manager.
- Controller Mappings:
- Export / import settings for Controller Mappings as configured in Preferences > Controller Manager.
- GUI Layout:
- Export / import settings for GUI layouts as set in Preferences > Layout Manager.
- 2 decks, advanced mode
- deck header
- mixer layout
- File Load- And Write- paths:
- Export / import settings for file directories as configured in Preferences > File Management > Directories.
- Favorites:
- Export / import favorite browser details as configured in Preferences > Browser Details.
- preparation playlist
- Broadcasting:
- Export / import Proxy, Server and Metadata settings from Preferences > Broadcasting.
- Audio Device Settings:
- Export / import audio setup device details from Preferences > Audio Setup.
- routing
- external mixing mode
- MIDI Clock settings:
- Export / import MIDI clock setting from Preferences > MIDI Clock.
- Effect Settings:
- Export / import effects setting including
- FX Unit routing,
- FX Unit mode and
- FX pre-selection as configured in Preferences > Effects.
- MixerFX
- Other Preferences and settings:
- Export / import all other preference and settings such as Global settings for example,
- Tooltips on or off, or
- if TRAKTOR starts in Fullscreen mode etc.
- Browser columns
- sync mode: beatsync
- only on-air can be tempo master
- deck header fields
- remix decks (all set)
What files and folders on the traktor installtion:
--------------------------------------------------
https://support.native-instruments.com/hc/en-us/articles/210274225-What-Files-and-Folders-does-TRAKTOR-Install-on-my-System-
DEBUG: keyboard shortcuts:
--------------------------
ctrl+shift+A - Re-init ALL BOME variabes
ctrl+shift+Z - stop clock
ctrl+shift+X - start clock - very fast
ctrl+shift+C - start clock - slow
ctrl+shift+V - start clock - very slow
ctrl+shift+F4 - Bome debug
DEBUG: DDJ buttons:
-------------------
PFL monitor cue:
3: start blinking
1: start needle
2: stop clocks
4: do a reset
BOME variables:
---------------
Abecedario: https://i.pinimg.com/originals/d0/ff/a6/d0ffa62f47ddae6abc349b9941ba14f9.png
INPUT:
"QQ" / "OO" / "PP"
OUTPUT:
"XX" / "UU" / "PP"
BOME Local:
"oo"
"pp"
"qq"
"rr"
"ss"
"tt"
"uu"
"vv"
"ww"
"xx"
BOME Global:
"g0"-"g9"
"ha"-"h9"
"ia"-"i9"
"ja"-"j9"
"ka"-"k9"
"la"-"l9"
"ma"-"m9"
"na"-"n9"
"ya"-"y9"
"za"-"z9"
Fake array variables (per channel):
ABCD EFGH IJKL _M_ _N_ OPQR STUV XYZW _0_ 1234 5678 _9_
note: XYWZ is not on right sequence!!! Z = deck 4.
1234
5678
ABCD
EFGH
IJLM
OPQR
STUV
XYZW <<<< note! "W" is not in sequence
BOME Global variables (do not follow array notation):
HZ / HY / ...
Information Sources:
--------------------
- BOME implementation notes.txt - This text file
- FAQ: both user FAQ and Technical FAQ
- DJ tech tools technical discussion: http://forum.djtechtools.com/showthread.php?t=96024
Correct Initialization Sequence:
--------------------------------
- Correct Initialization Sequence:
- First DDJ device
- then BOME
- then Traktor
- then CMDR (if needed)
- Restarting
- you can now close and reopen traktor at will.
- do not close either BOME or CMDR (if it is running)
- Any Problems?
- check "port closed" on BOME log window (click "outgoing")
- press shift+quantize (=wake up) to force a "send monitor state"
Notes from VDJ DDJ-1000 mapping:
--------------------------------
padFX:
pale color. pressing color = bright that color
beatFX:
channel and master = software effects
ON/OFF = per effect, changes to OFF when changing
small screen is updated to VDJ effects
supercombo beatmasher: https://blog.native-instruments.com/how-to-map-instant-effects-in-traktor/
STANDARD FOR TEMP VARIABLES:
----------------------------
Basics:
RAW: RR OO PP
NOTES: QQ OO PP
CC: QQ OO PP
Output: SAME
Meanings:
RR = first byte
TT = note (9) / CC (b)
QQ = channel
OO = note
PP = vel
DEMO deck A only:
-----------------
IN deck b..c:
page 1: m4=7
page 2: m8=7
BOME Project structure:
-----------------------
[MIDI.routes]
In0=From DDJ
Out0=To Traktor
In1=From Traktor
Out1=To DDJ
[Preset.0]
Name=Blend Demo
Active=1
Name0=See MIDI mesages
Incoming0=MID2MIDA0001000C From Traktor qq oo pp
Outgoing0=None
Options0=Actv01Stop00OutO01StMa00000001 oo=oo
[Project]
DefaultInPorts=MIDA00020008From DDJ000CFrom Traktor
DefaultOutPorts=MIDA0002000ATo Traktor0006To DDJ
Traktor seetings comparison:
------------------------------
differneces:
- audo device
- IN/OUT routing
- recording
- controller manager is OK (use BMT1 device)
BOME Settings structure:
------------------------
Comparison to macOS:
- alias are the same
- devices are the same
needs to be removed by hand:
Section current: - CurrentProject, SettingsFilename, LastProjectDir, MRUlist
Section MRUList
Section "presets" (these are a lot!)
Crucial settings:
[Current]
AutoStart=Y
ShowSplashScreen=N
StartMinimized=Y
FirstTime=0
OneInstance=Y
DoNotShowLoggerWarning=Y
DontAskForClose=Y
DontAskForDeletePreset=Y
DontAskForDeleteTranslator=Y
DontShowSaveInfo=Y
DontShowSaveNoPortsWarning=Y
VirtualMidiPorts=Y
VirtualMidiPortsCount=2
VirtualMidiShortNames=N
[LogWindow]
LogMidiOut=N
LogOut=N
LogIn=N
LogRules=N
LogMidiIn=N
LoggerStarted=Y
[MIDI.routes]
(EMPTY) ----> These are redefined by the project. But not the aliases!
[MIDI.alias]
Name0=From Traktor
Device0=1:Bome MIDI Translator 1 Virtual In
Name1=To DDJ
Device1=2:DDJ-1000
[MIDI.in]
Name0=Bome MIDI Translator 1 Virtual In
Options0=FTTF44494D42T
Name1=DDJ-1000
Options1=FTFF4944494DT
...
Vinyl stop implementation:
--------------------------
commands are:
- tempo bend [hold] UP, M1=0
- toggle M1=0 to M1-5
sequence is:
- press B4
- tempo bend up
- m1=5
- release B4
- none
- press B4
- m1=0
- release B4
- tempo bend release
Modifiers TSI page 1: VINYL BREAK, JOG FX, CENSOR OUT, ROLL, GRID ADJUST, BROWSER, SX2
---------------------
M1: BROWSER CONTROL: (all decks)
0: nothing pressed
1-4: deck A-D SELECTED <<<<< MEMORY shift2
this is used for waveform zoom. this is because browser has no deck number!
note: use M1=1 == deck A, M1=2 == deck B, etc. Assumes dedicated Memory button!
5: vinyl stop in progress (REQUIRES PROGRESSIVE TEMPO BEND = extra settings)
6: grid adjust down | slide down (ANY OF THEM)
(this is specified on M2 = 5=adjust / 6=slide)
7: doing PREVIEW PLAYER
M2: JOG CONTROL: (all decks):
0: SCRATCH enabled (HOT CUE mode)
1: Jog FX armed - touching the jog will still make scratch!
2: Jog FX is being touched
3: Loop adjust in progress <<<<< NEW
4: Memory/search pressed (for quick search)
5: Grid ADJUST pressed -> this cancels jogfx mode ch1..4 note F7
6: Grid SLIDE pressed -> this cancels jogfx mode ch1..4 note E7
7: __FREE__
XDJ-XZ case: this is used by reverse (to confirm?)
M3: JOGFX SELECTION (SHARED BETWEEN ALL DECKS)
0: none
1-7: which jog FX
M4: AJUST LOOP __IN PROGRESS__ (ALL DECKS) ---- TO DEPRECATE
0: nothing
1: Doing loop IN+OUT adjust
2: Doing loop OUT adjust
M5: JOGFX/SLICER MODE:
(what happens when we enter shift+mode8?)
0: jogFX
1: Slicer
M6: SLICER MODE
0: mode1: 8 slices, 1/1
1: mode2: 16 slices, first 1/2 <<<<< default for rekordbox
2: mode2: 16 slices, second 1/2
M7: GRID IN PROGRESS? <<<< can this be simplified. Because the jog commands have channel
0: no grid in progress
1-4: which deck A-D active + 2x grid
M8: ECHO OUT FAVORITE
(sequence is 3,1,2,0 )
selected by
this is shared with play pause FX <<<<<<< why?
3: never ending echo
1: slow fade
2: quick fade
0: custom (this is cue 4)
Modifiers TSI page 2: KEYBOARD, PAD FX, REMIX DECKS, MANUAL FX, TTFX, BeatFX,
---------------------
M1: PADFX selected: which pad is being pressed (TO SHOW RED COLOR)
0 - none
1-7: which pad FX
8: not used
M2: PADFX subpage:
0: one with 3x Gater
1: one with 2x delay
2: one with 1x filter pulse
3: Rolls page
(note: this is overriden on decks 3&4)
M3: KEYBOARD LEFT PAGE: red button (0: NONE; 1=ZERO;...7)
(this is used for OUT only)
M4: CURRENT PADMODE (FOR PADPAGE SHORTCUT) <<<< to deprecate?
0: HC
1: ROLL
2: SLICER
3: SAMPLER
4: other (=shift)
M5: KEYBOARD RIGHT PAGE: red button (0: NONE; 1..=8 )
(this is used for OUT only)
M6: KEY KEYBOARD MODE:
0: mode: CUP keyBOARD (pressing pad triggers CUP - same as rekordbox)
1: mode: CUE keyHOLD (press pad triggers CUE; release stops music)
2: mode: PLAY keySHIFT (music never stops - same as rekordbox)
m7: remix decks - PATTERN RECODER TOGGLE
0: not running = OFF
1: running, not recording = SOLID
2: recording = BLINK
3: rec paused (holding a pad to change sample) = SOLID
M8: SHIFT2 (=MEMORY BUTTON )
0: off
1: memory pressed
USB-A/USB-B/Line blocking:
--------------------------
what the firmwre blocks:
browser
decks
mixer VU meters
not blocked:
all mixer, cross fader
deck select
beatFX
sampler volume
channel 1..4:
85 = usbA
86 = line
87 = usbB
variables:
"ge"/4 USB/line selector
"gi"/4 USB/line real USB
"gs"/4 USB remember fader level
Preview player dynamics:
------------------------
TSI page1: (no modifiers)
- note F7 (hold)
- CC 64 (seek)
BOME:
- fader deck 4 - "jr" -> blocks ch7 101
REMIX DECKS PATTERN RECORDER / STEMS:
-------------------------------------
BOME side:
page 1:
first row: Punch 1, 2, 3, 4
second row: STEM modifier
page 1, +SHIFT:
first row: Mute slot1..4
second row: Delete slot1..4
page 2:
first row: Swing
second row: Pattern Lenght
page 2, +SHIFT:
first row: Keylock
second row: OneShoot/Loop
STEM MODIFIERS: ((GLOBAL)
"n9"/1 - CONFIGURE STEMS: use hardware mic EQ to change stems) (0: enabled; : enabled)
"n0"/1 - which DECK (0: none; 1: deck A; 2: deck B; 3: deck C; 4: deck D)
"m9"/1 - which SLOT (0: slot1; 1: slot2; 2: slot3; 3: slot4)
when the variable is not used, see "n0=0"
samples: these are is sent directly to channel 8 or 10
"j0"/1 - deck select shortcut - remix decks
SELECTED SAMPLE: (PER DECK)
"m1"/4 - sequencer/stems (selected sample for LEFT, slot 1..4)
"m5"/4 - sequencer/stems (selected sample for RIGHT, slot 1..4)
traktor-side modifiers:
m7: remix decks - PATTERN RECODER TOGGLE
0: not running = OFF
1: running, not recording = SOLID
2: recording = BLINK
3: rec paused (holding a pad to change sample) = SOLID
MIDI - sampler cue button:
regular: ch7 A7 (dec 105/69)
+shift: ch7 D8 (dec 110/6E)
STATE MACHINE OF RECORD BUTTON:
A: ANY -> SHIFT -> STOP
B: STOP -> PRESS -> REC
C: RUN -> PRESS -> REC
D: REC -> PRESS -> RUN
E: REC -> PAD -> HOLD
F: HOLD -> RELEASE -> REC
Z: RUN -> PAD -> RUN (THIS IS A NOP)
update 2020-11-02:
RMX entres = deck1 and 3 shortcuts
RMX2 enntries = deck2 and 4 real ones
out LED: RMX punch B 1 (led 1)
m7=1
m7=2
m7=3
LEDS:
punch: color off = 0; color ON=31
timeline: 0/62
in BOME, pads are processed only for setting modifiers
-> action = deck_change, to automatically open deck_4
update 2021-03-08:
------------------
added pattern recorder to sampler cue (on shift)
shift+press = simple press (TO REC/only PLAY)
shift+souble press = send shift + press (TO OFF)
TODO from F1 and DDJ_SZ:
------------------------
F1:
send to FX
keylock
DDJ-SZ:
beat tap
in remix decks, in hotcue mode you have toggles:
- slot keylock
- slot FX on/off
- slot monitor on/off
- slot punch mode
4': VELOCITY_SAMPLER == KEY_SHIFT
page1:
E8 F8 F#8 G8
G#8 A8 A#8 B8
page2:
C9 C#9 D9 D#9
E9 F9 F#9 G9
shift = channel + 1
https://books.google.pt/books?id=yBymDwAAQBAJ&pg=PT1&lpg=PT1&dq=mapping+step+recorder+to+any+controller&source=bl&ots=ZSlmhNvIvX&sig=ACfU3U3ERfbPsxbTf943Z6co6YGXwdb_2A&hl=pt-PT&sa=X&ved=2ahUKEwiu3q-Ai_PpAhXYAWMBHYVTCcEQ6AEwCHoECAgQAQ#v=onepage&q=mapping%20step%20recorder%20to%20any%20controller&f=false
- do not use "gated play"
- do not use loop
Pioneer DDJ pad colors:
-----------------------
0: off
1: blue
3: blue
7: cyan
12: cyan-blue
17: green
22: dark green
25: green
27: yellow-green
29: yellow
31: yellow
33: yellow
36: orange
38: orange
40: orange-red
41: red
45: roxa choque
52: pink
58: pink dark
59: violet
62: dark viloet
63: off
64: white
>65: add 64 for the same colors, darkened
76: bottle green
79: turquesa
82: bottle green
89:: m
98: dark yellow
113: dark
115:
122:
>>>> 126: gray
127: default color for that mode
DDJ-SZ to DDJ-1000 translation:
-------------------------------
update 2020-11-02:
pads translated: 7..11 -> 7..14
channel 1..4: specific
channel 7: specific
channel 15 -> sent to 11
DDJ KEYBOARD EMULATION:
-----------------------
KEYBOARD:
shift = shift
1..4 = channel
z..v = mode
qwerty = pads
DDJ-SZ keyboard: ---> DO NOT USE!
"mo" - which channel (0..3)
"mp" - which mode (0..7)
"mq" - which sub-page (0..1)
"mr" - shift enabled? (0..1)
"ms" - which pad pressed (0..7)
"mt" - up/down pressed (0..127)
----------------------------------
DDJ-SZ to DDJ-1000:
"me" - TRANSLATED channel
"mf" - TRANSLATED note
"mg" - TRANSLATED velocity
"mh" - TRANSLATED Shift
"j9" - 0: DDJ-1000 mode; 1: DDJ-SX2 mode (internal); 2: DDJ-SZ mode (external)
"mi" - ORIGINAL channel
"mj" - ORIGINAL note
"mk" - ALREADY SET BIT
0: Idle, waiting for new value
1: received but still "Undecided" (will default to "Untranslated" if nothing happens)
2: Decided: Translated
3: Decided: Swallowed
4: Decided: Overflow
5: Decided: White-list
"ml" - ORIGINAL velocity
Translation table: (deck 1..4)
------------------
deck 1..4 -> "memory": 114/115 -> 61/62
grid adjust -> key sync : 121/100 -> 101/28
grid slide > key reset : 10/101 -> 100/31
autoloop -> autoloop: SAME
loop 1/2 -> shift_in : 18/97 -> X/76 (hex)
loop 2x -> shift_out : 19/98 -> X/77
loop in -> in : SAME
loop out -> out: SAME
pad left arrow -> search --: 36..43/1..8 -> 112/81
pad right arrow -> search ++: 44..51/9+122..127+0 -> 113/83
pad quantize -> deck quantize: 106/NONE -> 53/57
OSC param -> sampler volume: 29 -> 3
load prepare -> view: 103/104 -> 122/104 (long=103) (back = 101/102)
panel -> double click deck change: 120/121 ->
Translation table: (channel 7)
------------------
noise: 4/12 -> 0/8
cymbal: 5/13 -> 1/9
siren: 6/14 -> 2/10
horn: 7/15 -> 3/11
DDJ-1000 differences between MIDI and HID mode:
-----------------------------------------------
(note: this was moved to mixxx wiki)
(note1: IN/OUT is from the point of view of the software)
(note2: tests done in virtual DJ)
- BeatFX ON/OFF button:
- MIDI:
- OUT: This button has its own state machine. It doesn't react to sending a MIDI message, so we can't reset it
- IN: There is no visibility of the blinking status. Pressing the button always output a TOGGLE message
- HID: VirtualDJ has full control
- BeatFX Screen:
- MIDI: No visibility or control. The screen always shows the Pioneer effects and their values. These Pioneer effects are ONLY applied on the master channel
- HID: VirtualDJ has full control. Master channel is VDJ effects. If an analog source is choose, the Pioneer effects return for that channel.
- SoundColorFX buttons:
- MIDI:
- IN: button blinks by itself, even when using shift+button
- OUT: button reacts to stop blinking
- HID: Unknown
- JogScreens:
- MIDI:
- OUT: fair amount of controls. Sync led doesn't react (firmware bug acknowledged by support)
- HID:
- OUT: adds Waveforms, tempo range, cuescope, cover art
- Deck select:
- MIDI:
- IN: no visibility on the active deck; the firmware always return channel 3/4 regardless of the active channel. The active channel needs to be inferred by later messages.
- OUT: no reaction
- HID: unknown
- Pad Page:
- MIDI:
- IN: it has its own state machine, per pad mode
- OUT: no reaction
- HID: Full control; Hotcues have 2 subpages; Loops mode have >4 sub-pages
Jog Needle State machine:
-------------------------
inputs:
- play/pause
- cue
- jog touch
states:
if yo==0 then Goto "cur_stopped"
if yo==1 then Goto "cur_playing"
if yo==2 then Goto "cur_cueing"
if yo==3 then Goto "cur_paused"
if yo==4 then Goto "cur_play_jogging"
if yo==5 then Goto "cur_paused_jogging"
if yo==6 then Goto "cur_stopped_jogging"
state machine:
stopped -> [play] -> playing
playing -> [/play] -> paused
paused -> [play] -> playing
stopped -> [cue] -> cueing
cueing -> [/cue] -> move to front -> stopped
playing -> [cue] -> move to front -> stopped
paused -> [cue] -> set new cue -> stopped
playing -> [jog] -> jogging
jogging -> [/jog] -> playing
states:
stopped: 0
playing: 1
cueing: 2
SWALLOW - which rules do apply to all inputs:
---------------------------------------------
- double click
- long press
- auto layout
- CFX pads (pad channels only)
- Remix decks pads
BOME - Possible action outcomes:
--------------------------------
skip outgoing action
execute outgoing action
pass message, no further action
pass message, AND do further action
do swallow, no further action
do swallow, AND do further action
IMPORTANT: always do swallows at the END.
If you can't, the other rules need to "skip" or "exit with swallow" as well
MIDI routing:
-------------
- All messages are routed by default (main project / settings / midi router)
- processed messages use "swallow" to not be broadcasted
- all processed messages are on the BMT1->DDJ direction
- exception: jog turn is on the DDJ->BMT1 direction
- all outputs on the traktor side need "blend"
- "mod 360" calculations: after mod, negative values need to be made positive by adding 360
- oo = oo % 360
- if oo < 0 then oo = oo + 360
- Main path: Traktor -> (BMT1) -> bome -> (DDJ-1000)
- Reverse path: Traktor <- (BMT1) <- bome <- (DDJ-1000)
I believe the unexpected problem here is that the “swallow” flag is only activated
if both incoming trigger AND the Rules section pass. If “exit rules, skip Outgoing Action”
is hit, then even if “swallow” is checked, it won’t swallow from this translator.
You can, as you’ve done in your test preset, activate “swallow” from a different
translator without rules and without outgoing action.
In other words, the swallow flag is only evaluated when the Outgoing Action is executed
(even if it\'s the \"None\" action).
SYNC modes Elastic Beatgrid:
----------------------------
sync: E6 88 (toggle)
master: G#6 92 (trigger)
cue - note C0 12
jog turn - CC 33
sync: note g5 (79) (NEW message - HOLD style)
"l0" elastic beatgrid sync (global setting)
0: normal
1: cue and jogturn change sync
"la"/4 "sync_state" (state)
"li"/4 "is_master" (state)
Memory+Tempo = tempo override
show actual tempo + bpm
RESET SCREENS PROCEDURE:
------------------------
Pressing shift+quantize: ch1..4 A3 (57)
@BOME:
sends Ch16.A-1 to DDJ-1000
sends ch1 A3 to traktor (ie, no swallow)
@TRAKTOR:
send monitor state
reset at initialization:
"hx" = 0
at first press of any DDJ button:
"hx" = 1
call reset
at first receive of anything from traktor: (TODO)
"hx" = 1
call reset
Debug log follows. Sometimes blends gets stuck.
13185688 - MIDI IN [Bome MIDI Translator 1 Virtual In]: 9F 00 7F
13185689 - MIDI IN [Bome MIDI Translator 1 Virtual In]: 9F 01 00
13185690 - MIDI IN [Bome MIDI Translator 1 Virtual In]: 9F 02 7F
13185688 - MIDI IN [Bome MIDI Translator 1 Virtual In]: 9F 03 00
96 46
96 47
96 48
96 49
DDJ-1000 undocumented notes:
----------------------------
PC APP Connect: ch 16 note A-1 (=9)
MIDI OUT [DDJ-1000]: 9F 09 00
(mapping: page 1, linked to master volume)
UDPATE: Sending ANY value to this note makes the device answer in 2.5 seconds later.
This includes sending "zero".
Multiple DDJ resets are latched in the 2.5s window to avoid choking.
shift+quantize: ch 1..4 note A3 (=57) IN/OUT (modifier #4)
(mapping:)
reset timeline:
0ms: send Traktor reset
0ms: send DDJ reset
30ms: Traktor start answering
100ms: second DDJ reset
140ms: Traktor stop
2500ms: ddj start answering
2510ms: ddj stop
bome demo:
CTRL+Q: reset TK
CTRL+W: reset DDJ
CTRL+E: reset both
CTRL+A: toggle sync led
DDJ-SZ undocumented notes:
--------------------------
PC App connect:
ch12.CC 24 - needle marker ch1
ch12.CC 25 - needle marker ch2
ch12.CC 26 - needle marker ch3
ch12.CC 27 - needle marker ch4
ch12.cc.004 = phase deck A
ch12.cc.005 = phase deck B
ch12.cc.006 = phase deck C
ch12.cc.007 = phase deck D
selector knobs sent at reset:
-----------------------------
Crossfader:
ch1..4:
A#0 22/16 = in Usb-A
F1 29/1D = in thru
C1 24/18 = in USB-B
beatFX channel:
ch5 note
16 E0 ch1
17 f0 ch2
18 f#0 ch3
19 g0 ch4
20 g#0 mst
21 a0 mic
22 a#0 sample
beatFX selector:
ch5 note 32..45
USB select:
ch1..4:
c#6 85/55 USB A
d6 86/56 LINE
d#6 87/57 USB B
mic/talkover:
ch7 106..108
on a reset, DDJ only sends the CURRENT value with 127. No zeros are sent.
midi device reset:
------------------
https://www.bome.com/support/kb/explicitelly-reset-a-device-or-the-whole-midimanager
Is there a rule to explicitly reset (close+open) a midi devices in Windows, in bome 1.8.4 ?
Alternatively, is there a way to schedule a restart of the whole midimanager?
my issue:
Unplugging the USB cable of my DDJ-1000 results in the leds becoming dead. This is completely repetable.
The MIDI_IN initially comes up as well, but then somebody (the driver or the FW) gives it a reset, which makes it work without any manual interaction.
In this situation, the only workaround is to manually restart the midi_manager on the big red button.
------
When I swap the USB cable of my DDJ-1000, both the Audio and the Midi_IN device recover automatically. This is very good.
However the MIDI_OUT device remains dead, and no LEDs change any more.
To fix this I need to manually restart my software, reopening all the MIDI devices.
I've inspected what happens in BOME, and the difference is that either the driver or the firmware reset the MIDI_IN device a second time.
Can I ask the same to happen for the MIDI_OUT device as well?
below the BOME log.
thank you!
new bome version:
-----------------
restrat traktor
restart bome (all)
restart bome red button
remove usb:
1487885 - 0.18:3 closed_ddj_out
1487886 - 0.17:4 closed_ddj_in
1487886 - 0.12:3 unplugged_ddj_out
1487886 - 0.11:4 unplugged_ddj_in
plug usb:
1631813 - 0.15:3 opened_ddj_out
1631815 - 0.14:4 opened_ddj_in
1634840 - 0.17:4 closed_ddj_in
1634840 - 0.20:4 open_error_ddj_in
1634841 - 0.14:4 opened_ddj_in
power off ddj
swap cable (same port)
swap cable (other port)
conclusion:
windows:
ddj_in error -> restart ddj_out
mac:
new leds ok
old leds are lost because optimization
ddj_in open -> reset @ 10seconds
lost reset messages:
issue:
- fader or crossfader messages did get lost
solution:
- reset DDJ
- reset TK @ 50ms
- reset BOME @ 150ms
NEW TIMERS:
-----------
master clock -> (calc_needle) -> CC 20
INIT -> reset_blink_clock -> (125ms) blink_clock
press "MEMORY" ->
Blink_clock -> (Calc_CLK) -> t_blink1
-> t_blink2 -> Show_cue
-> Show_jog
(jog_touch) -> t_calc_state1 -> (Calc) -> show_state1
(sync) -> t_blink1 (immediate)
NEW SHIFTS METHODS:
-------------------
deck select: f#8
SHIFT1: IN: "D#4" -> "ga" (button shift) //TODO: to deprecate, no need for this
SHIFT2: IN: "C#4" -> "gb" (button memory)
SHIFT3: IN: "D4" -> "gc" (button shift+memory)
COMBINED: -> "gd" 0 = none; 1 = shift1; 2 = shift2; 3 = shift3
NEW CLOCKS and BLINK METHODS:
----------------------------
what blinks:
cue button: flashes when a new cue can be set
play/pause: lighted when playing track, and flashes when paused
end warning: 30s;
fast end warning: 15s
variables:
"g0" - master t_blink counts to 16, 125ms, period 2 seconds
"zx" - very slow - 0.5 full blinper second - nothing
"zy" - slow - 1 full blink second - cue, play
"zw" - fast - 2 full blink second - everyting else
"zz" - very fast - 4 full blinks per second - jogring (now DEAD)
about leds and blinks:
All blinking leds are fully managed inside BOME. This includes in some cases the shifted version.
to blink, we iterate the values in a timer.
On these leds its easy to show the configuration status (on the shifted value)
best example: sync / shift master, for sync aid and tempo enlarger features.
Some leds are not managed by BOME, but they could in the future.
While the configuration is done in BOME, that one is not shown.
best example: shift+play, for TTFX.
debug dump of clock:
--------------------
1513 - RULE 0.39:35 assignment: (oo=g0) = 0
2601513 - RULE 0.39:36 assignment: (oo=zx) = 0
2601513 - RULE 0.39:37 assignment: (oo=zy) = 0
2601513 - RULE 0.39:38 assignment: (oo=zw) = 0
2601513 - RULE 0.39:39 assignment: (oo=zz) = 0
2601763 - RULE 0.39:35 assignment: (oo=g0) = 1
2601763 - RULE 0.39:36 assignment: (oo=zx) = 0
2601763 - RULE 0.39:37 assignment: (oo=zy) = 0
2601763 - RULE 0.39:38 assignment: (oo=zw) = 1
2601763 - RULE 0.39:39 assignment: (oo=zz) = 0
2602013 - RULE 0.39:35 assignment: (oo=g0) = 2
2602013 - RULE 0.39:36 assignment: (oo=zx) = 0
2602013 - RULE 0.39:37 assignment: (oo=zy) = 1
2602013 - RULE 0.39:38 assignment: (oo=zw) = 0
2602013 - RULE 0.39:39 assignment: (oo=zz) = 0
2602263 - RULE 0.39:35 assignment: (oo=g0) = 3
2602263 - RULE 0.39:36 assignment: (oo=zx) = 0
2602263 - RULE 0.39:37 assignment: (oo=zy) = 1
2602263 - RULE 0.39:38 assignment: (oo=zw) = 1
2602263 - RULE 0.39:39 assignment: (oo=zz) = 0
2602513 - RULE 0.39:35 assignment: (oo=g0) = 4
2602513 - RULE 0.39:36 assignment: (oo=zx) = 1
2602513 - RULE 0.39:37 assignment: (oo=zy) = 0
2602513 - RULE 0.39:38 assignment: (oo=zw) = 0
2602513 - RULE 0.39:39 assignment: (oo=zz) = 0
2602763 - RULE 0.39:35 assignment: (oo=g0) = 5
2602763 - RULE 0.39:36 assignment: (oo=zx) = 1
2602763 - RULE 0.39:37 assignment: (oo=zy) = 0
2602763 - RULE 0.39:38 assignment: (oo=zw) = 1
2602763 - RULE 0.39:39 assignment: (oo=zz) = 0
2603013 - RULE 0.39:35 assignment: (oo=g0) = 6
2603013 - RULE 0.39:36 assignment: (oo=zx) = 1
2603013 - RULE 0.39:37 assignment: (oo=zy) = 1
2603013 - RULE 0.39:38 assignment: (oo=zw) = 0
2603013 - RULE 0.39:39 assignment: (oo=zz) = 0
2603263 - RULE 0.39:35 assignment: (oo=g0) = 7
2603263 - RULE 0.39:36 assignment: (oo=zx) = 1
2603263 - RULE 0.39:37 assignment: (oo=zy) = 1
2603263 - RULE 0.39:38 assignment: (oo=zw) = 1
2603263 - RULE 0.39:39 assignment: (oo=zz) = 0
SEEK - redone with HC4500:
--------------------------
High resolution: CC 90..99
major bugs history:
-------------------
bugs:
- tempo adjust bug = tempo adjust is 7 bits and 14 bits at the same time
- modifier blend: screen modifiers lacked blend
- "deck is loaded" blend: eventough it is boolean, it needs BLEND
history:
v1.00 pioneer SX2:
tempo adjust: ?
modifier blend: (only single pads)
deck is loaded: yes
v6.3.3
tempo adjust: no
modifier blend: no
deck is loaded: no
v6.5
tempo adjust: yes <<<<<
modifier blend: no
deck is loaded: no
v6.8 released 25 april 2020 / 21 oct 2019
tempo adjust yes <<<<
modifier blend: no
deck is loaded: no
v7.0.2 fran
tempo adjust no
modifier blend: no
deck is loaded: YES <<<<<
7.1 latest
tempo adjust: no
modifier blend: no
deck is loaded: no
TIME MODE CYCLE:
----------------
TIME MODE: variable "za"
0: elapsed
1: remain
PHASE FEATURE:
--------------
0 = -0.1
100 = +0.1
x - 50 (center zero)
x / 5
0 --> -10
50 --> 0
100 -> +10
TK IN phase CC "85" -> "je"
-0.1 - 0
-0.09 - 1
-0.08 - 2
-0.01 - 9
0 - 10
0.01 - 11
-0.02 - 12
-0.10 - 20
DECK IS LOADED TRIGGER:
--------------------
TK IN LOADED: channel 7
deck A: A#4 70 / 46 / C5 -> "ks"/4 (0: unloaded; 127: loaded)
deck B: B4 71 / 47 / C#5
deck C: c5 72 / 48 / a#6
deck D: c#5 73 / 49 / d#8
TK IN loaded: channel 16
note 0,1,2,3 (note: this is a copy)
This message is sent twice because of overflow issues!
note2: variables have alredy been condensed in "ks"/4.
This is being latched for the time being.
CCs messages sent FROM traktor TO BOME:
---------------------------------------
JOG NEEDLE:
CDJ/VINYL MODE "ko"/4 (<<< catched and filtered on DDJ!!!)
SLIP: "ke"/4 flux (AKA slip)
IN LOADED: note A#4 / C5 B4 / C#5 (these are the load codes)
-> "ks"
IN CUE: CC "68" -> "z1" (cue being pressed)
IN beat phase CC "67" -> (NOT USED)
IN
IN PLAY CC "77" -> "zo" (deck playing)
IN JOG touch CC "78" -> "zs" (deck jog)
IN HOTCUE ANY CC "79" -> "immediate" (when we press hotcue)
IN JOG turn -> "y1" (accumulated every 10ms)
OUT white needle -> "y5" (360 deg JOG)
OUT marker needle -> "z5" (360 deg CUE)
STATE of the deck -> "yo"
(0: stopped; 1: playing; 2: cueing; 3: paused;
6: stop+jog; 4: play+jog; 5: pause+jog)
SEEK:
IN seek position: CC "90".."99" -> "na"/"no"/"ja" RANGE
BPM implementation:
IN tempo adjust: CC "101".."108" -> "g1"
IN BPM value: CC "110".."120" -> "h1"
IN tempo range: CC "66" -> "i1" (real?) "i5" (60/100/160/etc)
(NOTE: THIS IS NOT "i1" - TO DEPRECATE)
CALC tempo perc: -> "k1" (for external)
CALC current BPM: -> "k5" (for external)
Tempo range enlarger:
---------------------
Tempo Range enlarger STATE: "io"
0 = nothing
1 = to ENLARGE in next iteration
3 = to RESET 6% in the next iteration
2 = waiting to move back
Tempo Range enlarger CONFIG: "gm"
ch1..4:
119 "B8" - enlarger: tempo range Reset to 6%
96: "C7" - enlarge: next tempo range (stantard shift+master tempo)
15
Soft Takeover:
--------------
"k1"/4 ACTUAL value
"i5"/4 CURRENT tempo range
"ji"/4 WANTED tempo value (soft takeover)
"js"/4 tempo is different (soft takeover)
0 - same tempo
1 - different tempos
"ls"/4 soft takeover timer running (0: none; 1: timer running)
(DOESNT mean it is blinking - see "js" for that)
"kx"/4 Previewing after auto enlarge (0: none; 1: loop/move changed; 2: auto-enlarge triggered)
parei aqui (??). todo: deprecate kx,
Loops:
------
IN is active loop: CC "76" -> "le"
pressed IN button -> "lo"
IN loop size: CC "70" -> "l1"
IN move size: CC "71" (0 = xfine ; 1= fine; 2 = 1/16; 3=1/8; 4=1/4; 5=1/2; 6=1; 7=2; 8=4; 9=8; 10=16;11=32; 12=loop)
-> "n1" (0..12 => 0,1,2,3,4,8,16,32)
-> "n5" (flag that signifies "move size" equals "loop size") (TO deprecate)
(TODO: simplify this structure)
IN Key adjust CC "81" -> (direct)
Jog Ring (End warning):
TK IN END warning CC "82" -> (GENERATED ON BOME ITSELF)
TK IN volume fader CC "83" -> "jo"
DDJ IN volume fader: ch1..4 CC 19+51 -> "jo" (0..16553 = position)
TK IN jogFX state ch5 CC "126" -> "z9" (this could be a single variable) (THIS IS IN PAGE #1!)
______ todo: why /4 bpm ???? <<<<<<<<<<<<<<<<<<
BOME CLOCK:
-----------
"JM"/1 - preview bome clock duration (
state: reconfiguring clock: "k9"
SEEK IMPLEMENTARION:
--------------------
AUTO-RESET:
auto reset - DDJ side "hx" (0=init; 1= done DDJ reset)
auto reset - TK side "yn" (0=init; 1= done TK reset)
CLOCK:
clock period (milliseconds): "hy" (global)
frames per second: "jn"
master debug "hw" (global)
current clock value: "hz" (global)
SEEK POSITION: CC 90..99 (HR); CC 100 (LR)
HR LOCK: "no" (values: 0 = none; 1 = LR ; 2 = HR)
NEW POS: "na" (range: 0..10000)
30ms timer (for BPM): "hs" (lock)
30ms timer (seek): "he" (lock) (to merge?)
HC45000:
HC4500 minutes "ne"
HC4500 seconds "ni"
HC4500 frames "ns"
CALCULATIONS:
PREVIOUS POS: "ja" (range: 0..1000)
REFERENCE location: "ya"
reference clock value: "ka"
clock units per SEEK: "ha" ("ho" == "lock)
which step we are: "ia"
OUT CC:
elapsed timestamp: "ma" (unit: seconds)
remain timestamp: (inferred)
FINAL total time: "lx" (unit: seconds)
FINAL total (lock): "nx" (0: init ; 1: wait 1 seconds; 2: wait 1 minute; 3: wait middle)
(this is reset at deck load message)
total track length calculation:
-------------------------------
proportion:
ma_cents/var = na/10000
ma_cents/na = var/10000
var = ma_cents * 10000 /na
var = ma_cents * 100 /na (adjust)
NEW CCs - High resolution (TK OUT):
-----------------------------------
SEEK POSITION:
CC 89 (HHR 0.0 -> 0.01)
CC 90..99 (HR); CC 100 (LR)
(see above for variables)
TEMPO ADJUST: CC 101..108 -> "g1"
- NEW TEMPO: "g1"
- LOCK: "go" (0 = none; 1 = LR ; 2 = HR)
CC 101 -1 -0.75
CC 102 -0.75 -0.5
CC 103 -0.5 -0.25
CC 104 -0.25 0
CC 105 0 0.25
CC 106 0.25 +0.50
CC 107 0.50 +0.75
CC 108 0.75 +1.0
CC 109 -1..+1 (fallback for corner cases)
BPM VALUE: CC 110..120 -> h1
- NEW VALUE: "h1"
- LOCK: "ho" (0 = none; 1 = LR ; 2 = HR)
(algorithm: accept any LR if not HR; accept any HR if not 0 or 100)
CC 110 - 0..75 (75)
CC 111 - 75..100 (25)
CC 112 - 100..110 (10)
CC 113 - 110..120 (10)
CC 114 - 120..125 (5)
CC 115 - 125..130 (5)
CC 116 - 130..135 (5)
CC 117 - 135..140 (5)
CC 118 - 140..145 (5)
CC 119 - 145..155 (10)
CC 120 - 155..200 (45)
CC 121 - 0..200 (200) FALLBACK FOR BPM CORNER CASES
JOG DYNAMICS:
-------------
TURNS:
SIDE turn:
vinyl on: CC 33 LARGE
vinyl off: CC 33 LARGE
TURN:
touch, vinyl ON: CC 34 SMALL <<<<<
touch, vinyl OFF: CC 35 LARGE
+SHIFT:
touching top:
vinyl on: CC 31 SMALL
vinyl off: CC 31 SMALL
SIDE:
vinyl on: CC 38 SMALL
vinyl off: CC 38 SMALL
+SEARCH:
side: CC33 LARGE
touch:
vinyl on: CC41 SMALL
vinyl off: CC41 SMALL
TOUCH:
normal: note 54 F#3
+shift: note 103 G7
------------
BOME SIDE:
"ys" accumulated jog value, with full ticks resolution.
"tt" how many degrees to send
"rr" remainder degrees for next iteration
"y5" TO SEND needle position (360 deg)
utilities mode:
- NO USB cable
- press left play+shift + turn on device
- left slip reverse OFF = automatic
- left slip reverse ON = always MIDI
DDJ-1000 OUTPUTS:
-----------------
shift:
modifier 1 -> 0..1 (tk) -> 0..1 (midi) -> global varible (bome)
tempo range: (COM SHIFT)
0..13 (TK) -> 0..13 (midi) -> 2..100 (bome, integer) -> speed (ff_2.2)
tempo position:
-1..+1 (TK) -> 0..100 (midi) -> -1..+1 (bome, fractional) -> speed (ff_2.2)
stable bpm: (COM SHIFT)
100..200 (TK) -> 0..100 (midi) -> 100..200 (bome, fractional) -> bpm (ff_3.1)
actual bpm:
-> tempo_position * bpm (bome, fractional) -> speed (ff_3.1)
beat phase:
-0.5..0.5 -> 0..90 (midi, relative) -> 0..360 (bome, incremenatl) -> ff_2.2
cue:
0 (off)..127 (on) -> set cue to current position
OLD TIMERS:
-----------
SHIFTS:
DDJ: button
-> calc0
-> calc1
-> calc2
....
MAIN_PAGE:
DDJ: tempo fader changed:
-> tempo1:
-> calc1
TK: HR tempo received / BPM HR received
-> calc1
-> calc1_d
-> send BPM / send % to DDJ
-> calc_clock_1
SEEK_PAGE:
TK: HR SEEK received
-> calc_clock1
-> send_timestamp1
-> send sign/MM/SS)
STATE_page:
DDJ: jog touch
-> jog_touch1/refresh_jog1
-> refresh_jog -> sends_needle
-> master_clock
-> refresh_jog
TK: Received hotcue/cue/ buttons
-> calc_state_1
-> calc_state1
-> jog_ring1 (every 125ms) <<<<<
TK: received sync/flux buttons
-> t_blink1
-> calc_state1
-> refresh_cue1
-> refresh_cue1
-> refresh_jog1
---
BLINK PAGES:
jog_ring1: -> send jog ring
jog_ring1: -> send jog ring
jog_ring1: -> calc1
calc_state1: t_blink1 500ms
CCs DDJ-1000 SCREENS: STANDARD (https://www.youtube.com/watch?v=RnHqnGWEXfE&t=637s)
---------------------
needle position: CC 20: 0..2 / 0..0x67
cue position: CC 23: (same) (to hide: send 0x7f 0x7f)
bpm value: CC 21: 0..0x4E / 0..0x0F
playing speed: CC 22: (same)
current minute: note 66 (F#4)
current second: note 67 (G4)
time mode: note 68 (G#4) (elapsed = 0 ; remain = -1)
key value: note 73 (C#5) (0..0x18)
key change: note 74 (D5) (1..0x19)
(fake high resolution CC outs to add here)
CCs DDJ-1000 TO KEEP:
---------------------
led_normal = [0, 2, 4, 5, 7, 11, 15, 19, 31, 33, 34, 35, 38, 41]
led_screens = [20,21,22,23]
led_bome = [51,52,53,54,55,56]
MORE NOTES:
-----------
CC3 - tempo range
0..13 -> same
--> 2%..25% (%, integer) --> G3
CC1 - G1 - tempo adjust
-1..+1 -> 0..100 (%, fake floating point)
z1 = sign (1 == "+"; 2 == "-")
z2 = value 0..100 (on the half side)
--> calculated tempo percentage (%)
y1 = sign
y2 = value
y3 = 0..20000
CC2 - G2 - current bpm
100..200 -> 0..100
-> 100..200 (bpm, integer)
--> Y2 = calculated BPM
HOW TO CONVERT RANGES:
----------------------
Input = 0..127
Output = 20..90
O = int(( I * out_range) / in_range) + offset)
= I * 70 / 127 + 20
(to add more precision: use 1E3 before and after)
bome bugs / limitations:
------------------------
PIONEER:
--------
needle position:
0..360deg = 14 bit value integer
MSB - 0x2
LSB - 0x67
bpm value:
0.0 .. 999.9 bpm
MSB - 0x4E = 19_998
LSB - 0x0F
play speed:
-100.0% .. 100.0%
MSB: SAME
LSB: SAME
EXISTING CCs already sent by the DDJ mapping:
---------------------------------------------
CC 1 -> ???
CC 2 -> channel level meter
y5 = needle
z5 = cue positon
future work:
- needle show slip mode
bugs:
- memory - blocks master tempo!
- keys mal: 1, 4, 7, 10,
ADVANCED BOME INTEGRATION - 14-bit out messages:
------------------------------------------------
Q2: The BPM and Percentage values are very close, but not exactly the same, of what it displayed on the laptop screen
A2: Reason: Traktor lacks high-resolution MIDI out messages. Even so, a trick was already implemented to improve accuracy 10x times (compared to a naive mapping).
T2: Traktor receives 14-bit messages just fine (combo messages), but cannot send it.
This was confirmed by hacking CMDR to generate a valid TSI of a combo message - nothing got sent by Traktor.
As a workaround, accuracy was improved 10x by creating 10x separate 7-bit ranges, each on a separate CC, and reacting to only a part of the whole range, eg: 0.0->0.1; 0.1->0.2; 0.2->0.3; ...
This lead to the next problem: when the value crosses multiple ranges, potentially all, then all of them independently react with their extreme values. Note that these output values also follow a non-deterministic order.
This was addressed as follows: collect all outputs until a 10ms timer expires, and ignore the extreme values, keeping only the final intermediate value (which can come in any order).
If really going to an extreme value, in particular 0.0 or 1.0, collect that with 11th low resolution CC that encompasses the whole range.
After the timer expires, process the single value as normal
Q3: The time elapsed/remain is approximate to what is displayed on the laptop screen. Ans/Or, the seconds advances either too fast or too slow.
A3: Reason: Traktor doesn't send the absolute minutes:seconds position, only the relative percentage position instead.
The mapping guesses the total track length using an internal clock.
press shift+quantize (="Wake up") while the track is playing to reset the measurement process.
ADVANCED BOME INTEGRATION - Absolute track position emulation:
-------------------------------------------------------------
T3: even with the high-resolution trick explained above, it is still a relative position.
To transform this into an absolute value, we implement a master clock in BOME with a timer every 100ms. On the seek position code we measure how many ticks elapsed when 0.5% of the track has elapsed without any jumps or interruptions.
When we have this value, a simple multiplication by 200 gives the estimated track length, to which is then trivial to calculate elapsed/remain values in MM:SS format.
As mentioned, pressing shift+quantize triggers a "send monitor state" command that resends all values, restarting the measurement process.
ADVANCED BOME INTEGRATION - Needle progress emulation:
------------------------------------------------------
Q4: Needle position sometimes jumps around after scratching.
A4: Traktor lacks a "jog turn out message", so this is emulated in BOME. Please join the DJTT discussion to improve this in the next version.
T4: The best message to implement the needle position is "beat phase". Significant amount of time was spend using this message.
It only sends the -45deg..45deg information. This is accumulated internally to a 0deg..360deg value that is displayed for the user.
When the user seeks away, we just get a new 45deg position, unlinked to the actual 360 position. (this could be improved by merging with the 1000 points seek
relative position descried above).
Instead, we implemented the full state machine of the deck (stopped, playing, cueing), interpreted the jog touch and jog turn messages directly
from the device (instead of traktor), and advanced the needle using the internal fake clock.
EXPERIMENTS ON MIDI LINKED MODIFIERS (MLM):
------------------------------------------
please read the MLM discussion on page 86 and following of
"RUDI-Js ELEPHANT TSI for VCI-400SE + Maschine (MK1) + BCR 2000 v2.0"
experiment:
CC 1..4 - sync on
modifier 1..4 = sync on, per deck
CC 11..14 - master on
modifier 8 = master deck
cc 21 - send value of modifier 8 out
page 2: modifier 8 = global modifier
to send a value directly to a MODIFIER:
bome: set variable to 0..7; send it as a value
traktor: modifier IN / Fader / Relative / 100% sensitivity / 0% Acceleration
to send a value directly to a deck layout:
bome: set variable to 0..4; (send it + 0) * 127 / 4
traktor: modifier IN / Fader / Direct
(doing this to a modifier will print garbage, and use the last digits only)
to send simple boolean ON/OFF:
traktor: modifier IN / button / hold / 1
DENON HC4500 INFO:
------------------
traktor key harmonic: https://github.com/bertfrees/traktor-harmonik
midi out idea: https://forum.djtechtools.com/showthread.php?t=28523
midi codes: https://raw.githubusercontent.com/Sonnenstrahl/traktor-now-playing/master/readme-img/denon_midi_commands.jpg
run out of global variables: https://www.bome.com/forums/viewtopic.php?t=5193
- multiple MT instances
- bitwise manipulaton: "XOR" to clear, "XOR" to write, "AND" + "DIV" to read
find all used variables: https://www.bome.com/support/kb/cross-reference-list-of-all-variables-in-a-mt-pro-project
clear HC45000 video: https://www.youtube.com/watch?v=jJI-fCfn-6M
mapping overview: https://www.bax-shop.nl/downloads/downloads/NI-TRAKTOR_DN-HC4500%20ConfigurationManualpdf.pdf
S11 smooth echo:
----------------
crossfader, hotcue, silent cue
channel dader, gate cue, load
number of beats to trigger: 1/2
number of beats to trigger (crossfader):
demo: https://youtu.be/_Sp47QU6pyw?t=1073
////////////////
sampler cue:
- press: ON/OFF toggle ("mn" swap)
- double click: SET ENTER/EXIT ("mm" swap)
- shift+cue = disabe everything
"gx"/1 - smooth echo: TYPE (echo or vinyl break)
"zm" - smooth echo: CONFIG: FADER
0: do nothing
1: do echo
"zn" - smooth echo: CONFIG: CROSSFADER
0: do nothing
1: do echo
"mm" - SMOOTH ECHO: CONFIG: JOG/HOTCUE
0 - DO NOTHING
1 - ENTER: dry_wet; EXIT: cancel
2 - ENTER: cancel; EXIT: feedback
"mn" - SMOOTH ECHO: ACTIVE
0: disabled (but can still do cancels)
1: enabled
"m0" free - SETUP: duration of EXIT out (TBD - To be done)
"i0"/1 - SUBROUTINE: echo_out command
<< note: there is no "disabled". because this is a function call >>
0 = cancel
1 = dry wet
2 = feedback
99 = error
"jo"/4 - real fader volume
on "press reset" -> Safe cancel
on "press off" -> Real volume send
crossfader positions:
0 10 50 90 100
0 echo_B
10 cancel_B
50 cancel_A
90 echo_A
releaseFX - echo out (on censor):
---------------------------------
NEW IN:
step 0: ch5 F#5 (78)
select echo effect
routing off
WAIT 50 MS
step 1: ch1..4 F#5 (78)
set routing
step 2: ch5 G5 (79)
set M8 parameters
step 3: ch5 G#5 (80)
set backfill (HOLD)
step 4: ch5 A5 (81)
unit 3 ON (HOLD)
store preset
OUT: CC 69 (unit3 state)
BACKWARDS LOOPS:
----------------
1/2x: (DDJ-SZ ONLY)
regular F#0 (18)
shift1 c#7 (97)
2x: (DDJ-SZ ONLY)
regular G0 (19)
shift1 d7 (98)
unknown:
10 A#-1 - loop 1/2x (DDJ-SZ adaptor)
13 C#0 - loop 2x
----------------
AUTO:
regular: G#0 (20) 4-beat FWD
long press: C#1 (25) loop activate
shift1: G#5 (80) 4-beat REV
shift2: A1 (33) loop that size
IN: DDJ_1000
regular: E0 (16) Loop in / 1/2x FWD
long press:D0 (14) jog adjust / reloop (no loop)
shift1: e5 (76) size 1/2x REV
shift2: G0 (19) size 1/2x FWD
OUT: DDJ_1000
regular: F0 (17)
long press: F#0 (18)
shift1: F5 (77)
shift2: D#0 (15)
CC:
normals: CC 34/35/
new modifier:
m4: nothing
continuous seeking:
-------------------
actions:
shift0 - beatjump of that size
shift1 - 1 beat
shift2 - select size
shift3 - next track
SUMMARY: when pressed, it sends "LONG".
When released quickly it ADDITIONALLY sends "QUICK".
arrow LEFT:
long: E8 112/70
quick: A#6 94/5E (== REIG BORG)
shift: A5 81/51
arrow RIGHT:
long: F8 113/71
quick: B6 95/5F (== REIG BORG)
shift: B5 83/53
DDJ-1000 tap:
1180974 - MIDI IN [DDJ-1000]: 91 71 7F (press)
1181060 - MIDI IN [DDJ-1000]: 91 71 00 (release)
1181060 - MIDI IN [DDJ-1000]: 91 5F 7F (<<< in addition)
1181060 - MIDI IN [DDJ-1000]: 91 5F 00
DDJ-1000 long:
1271459 - MIDI IN [DDJ-1000]: 91 71 7F (long press)
1272983 - MIDI IN [DDJ-1000]: 91 71 00 (release)
first implementation:
ddj long press -> beatjump, move by +1, etc
second implementation:
ddj long press -> first beatjump / loop move same
bome long press -> send same message repeatedly (if configured)
release = done
------
e8 = beatjump/loop move combo
a#6 = always beatjump (reigborg mode)
a5 = shift1
"nm"/1 - ARROW CONTINUOUS SEARCH (0: no continuos search; 1: continuous search)
"nn"/1 - ARROW IGNORE LOOP (0: loop move if active; 1: always beatjump (for reigborg: )
"ym"/1 - DEFAULT 4-beat/8-beat
UNUSED VARIABLES (both "/1" and "/4"):
--------------------------------------
"g9"/1 - manual debug (toggle)
"g0"/1 - MASTER blink clock
"gm"/1 - config: tempo enlarger enabled
"gn"/1 - config: advanced config enabled
"g5"/4 - polyrithms - current selection 0: none; 1= 3/4; 2=1; ....
"ga"/4 SPECIAL SHIFTS -> TODO: simplify this
"ga" shift1 (shared to all decks)
"gb" shift2
"gc" shift3
"gd" COMBINED Shift
"ge"/4 USB/line selector
"gi"/4 USB/line real USB
"gs"/4 USB remember fader level
"gx"/4 SPECIAL
"gx"/1 smooth echo: TYPE (0: echo; 1: vinyl break)
"gy"/1 beatFX - real ON/OFF button state
"gw"/1 free
"gz"/1 free
*****
"h0"/1 free
"h9"/1 beatFX - which deck selected
"hm"/1 - blink coalesce
"hn"/1 - blink slowdown master
"h5"/4 Advanced panel
"hi"/_4 SPECIAL GESTURES support
"hx"/_4 SPECIAL GROUP: Timers / INIT
"hx" auto reset - DDJ side
"hy" clock period (milliseconds)
"hw" master debug
"hz" current clock value
"jn" frames per second: "jn"
*****
"i0"/1 - SMOOTH ECHO: subroutine action type
"i9"/1 - external monitor cue
"im"/1 - used by layout
"in"/1 - CFX buttons are blinking (was fran martin lock jog - BAD!) <<<<<<<<<<<<<
"ie"/4 (double click per deck -> these are 4 separate variables all related to double_clik)
"ii"/4 SPECIAL: active deck firmware bugfixes -> 4 separate variables
"io"/4 tempo range automatic enlarger (0: nothing; 1: next iteration; 2:waiting)
"is"/4 macroFX Knob value (14 bit)
"ix"/4 pad MLM - previous pad pressed - NOT USED ???
*****
"J0"/1 - deck select - remix decks
"J9"/1 - DDJ-1000 mode; 1: DDJ-SX2 mode (internal); 2: DDJ-SZ mode (external)
"JM"/1 - preview bome clock duration
"JN"/1 - BOME FPS - Frames Per Second
"J1"/4 - CFX related
"J5"/4 - CFX related
"je"/4 deck Phase
"ji"/4 WANTED tempo value (soft takeover)
"js"/4 tempo is different (soft takeover)
0 - same tempo
1 - different tempos
(see also "ls")
"jx"/4 pre-shifted polarity. This is to deprecate!
*****
"k0"/1 - TTFX enabled 0: disabled; 50 = 500ms; 100 = 1 second (1 second)
"k9"/1 - Clock Timer config
"km"/1 - mouse injection X
"kn"/1 - mouse injection Y
"ko"/4 vinyl mode
"ke"/4 flux (AKA slip)
"ki"/4 Reverse
"kx"/4 Previewing after changing loop values (0: none; 1: loop/move; 2: tempo range)
*****
"l0"/1 Global: mode elastic beatgrid
"l9"/1 16x filters configuration OFF/ON
"lm"/1 - TEST GLOBAL - DO NOT USE - ONLY FOR TEMPRARY TESTS
"ln"/1 - config: dual deck
"l5"/4 filter polarity
"la"/4 "sync" off/ON
"le"/4 LOOP: is in active loop
"li"/4 "master" off/on
"lo"/4 LOOP: just presed loop in
"ls"/4 we just changed tempo (DOESNT mean it is blinking - see "js" for that) (0: none; 1: timer running)
"lx"/4 total track length
*****
"m0"/1 - SMOOTH ECHO
"m9"/1 - sequencer/stems
"mm"/1 - SMOOTH ECHO
"mn"/1 - SMOOTH ECHO
"m1"/4 - sequencer/stems (selected sample for LEFT, slot 1..4)
"m5"/4 - sequencer/stems (selected sample for RIGHT, slot 1..4)
"ma"/4 timestamp elapsed (number of seconds since zero)
"me"/4 DDJ-SZ translator (x4)
"mi"/4 DDJ-SZ translator (x4)
"mo"/4 FREE (DDJ-SZ keyboard)
"ms"/4 FREE (DDJ-SZ keyboard)
"mx"/4 FREE (DDJ-SZ keyboard)
***** HC-4500
"n0"/1 - USED BY STEMS
"n9"/1 - USED BY STEMS
"nm"/1 - ARROW CONTINUOUS SEARCH (0: no continus search; 1: continuous search)
"nn"/1 - ARROW IGNORE LOOP (0: loop move if active; 1: always beatjump (for reigborg: )
"na"/4 NEW POSITION (range: 0..1000)
"ne"/4 HC4500 minutes
"ni"/4 HC4500 seconds
"no"/4 SEEK lock
"ns"/4 HC4500 frames
"nx"/4 HC4500 total length lock <<<<< (0: init ; 1: loaded; 2: ...)
*****
"y0"/1 - MIXER_FX reconfigure lock
"y9"/1 - MIXER_FX buttons lock
"ym"/1 - DEFAULT 4-beat/8-beat
"yn"/1 - AUTO RESET (tk side)
"y1"/4 MIXERFX mouse selection
"y5"/4 JOG NEEDLE
"ye"/4 DECK FLAVOR (STEM) (1: track deck / 2: remix / 3: stem / 4: live input)
"yi"/4 FREE
"yx"/4 FREE (note: this includes yy, which is not local!)
*****
"z0"/1 - OPERATING SYSTEM CONFIG: 0: Windows; 1: MacOS
"z9"/1 - JogFX state (this is global for all decks)
"zm"/1 - smooth echo
"zn"/1 - smooth echo
"za"/4 time mode elapsed/remain
"ze"/4 FREE
"zi"/4 FREE
"zx"/4 blink sub-clocks divider
HC4500 CCs:
-----------
if oo<64 then exit rules, skip Outgoing Action
if oo>73 then exit rules, skip Outgoing Action
if oo==64 then Goto "track_number_msb"
if oo==65 then Goto "track_number_lsb"
if oo==66 then Goto "time_minutes"
if oo==67 then Goto "time_seconds"
if oo==68 then Goto "time_frame"
if oo==69 then Goto "pitch_polarity"
if oo==70 then Goto "pitch_msb"
if oo==71 then Goto "pitch_lsb"
if oo==72 then Goto "track_position_normal"
if oo==73 then Goto "track_position_rev"
layout deck shift:
------------------
TK OUT: ch05 CC 124 [1..5]
TK IN: ch05 CC 30 [0..127]
"ii"/1 - ACTUAL active left deck (0: init; 1: deck A; 3: deck C)
"ij"/1 - ACTUAL active right deck (0: init; 2: deck B; 4: deck D)
"ik"/1 - PC APP CONNECT TIMER (disables forced side because of auto-detect)
"il"/1: AUTO-LAYOUT ENABLED?
0: DISABLED
(=Constant layout)
Double click active; shift+deck ctive
1: ENABLED
(=Automatic layout)
All gestures enabled + automatically change on simple press
"im"/1 - CURRENT LAYOUT. This is read on the init phase.
0: init
1: auto, 2D Parallel
2: auto, 4D Paralell
3: auto, 2D Classic
4: auto, 4D Classic
5: preparation
"j0"/1 - deck select shortcut - remix decks
0: normal
1: we pressed a remix deck shortcut on deck A&B.
this is then Latched until we press deck select explicitly
on traktor init: previous layout is kept
on bome init: initial config is set
on changing on the gui to another value: automatic is disabled.
shift_deck = turn on again auto
update march 2021:
------------------
firmware 1.12 sends:
93 72 (= 114 dec / F#8) (this is deck select)
93 3C (= 60 dec / C4) (this is new in 1.12. It tells the new selected deck on the correct channel)
Generic Double click support:
---------------------
"ie" - DlbClick: in progress (0: None; 1: Inside timer; 2: DblClick was Triggered) <<<<<<
"if" - DlbClick: which channel
"ig" - DlbClick: which NOTE
"ih" - previous track (with 2 seconds) --- emulation of previous track / next track. UNFINISHED
Generic long press support:
-------------------
"hi" - long press: current state (0- nothing; 1 - waiting for first trigger; 2 - waiting for second trigger)
"hj" - long press: which CHANNEL
"hk" - long press: FREE
"hl" - long press: which NOTE
Turntable FX - TTFX:
--------------------
IN PLAY CC "77" -> "zo" (deck playing)
IN JOG touch CC "78" -> "zs" (deck jog)
a) deck is paused:
pass B-1 normally
b) deck is playing, but flux ON:
does C#7 action
does C#7 INV action when the user releases the button
c) deck is playing, but flux OFF:
received from DDJ:
B-1: filter out if its playing
B-1 invert: filter out always
----------------
step_1: sends C#7 (97) (normal)
activates FX
set TTFX
dry wet 100%
wait 400ms
step_2: sends B-1 (11) (normal) (these actions can be swapped)
pauses track
dry wet 0%
wait 150ms
step_3: sends C#7 (97) INVERT
beatjump
turns off FX
wait 150ms
step_4: sends B-1 (11) INVERT
dry wet 100%
update 2020-11-02:
------------------
TTFX delay is now controlled as follows by the sampler volume.
Step1:
Sampler value:
- INPUT:
- value is first scaled to a percentage 0..100 -> "k0"
- for user feedback, original value is sent unchanged
- OUTPUT:
- for TIME: 9xP + P*P/10 (semi exponential)
- for TTFX, percentage is scaled to 16K..5,4K (note: 16k = "none")
-> ch07 CC 22+54 - Sampler volume + shift3 (NEW BOME) <<<
step2:
- delay 150ms
step3:
- delay 150ms
Turntable FX - Stewe version: https://maps.djtechtools.com/mappings/9325
-----------------------------
sequence is m4= 0..7 -> 0
step 1: C#7
wet 100%
knob 0.62
button ON
step 2: B-1
play/pause = PAUSE
beatjump -1
step:
beatjump -1/2
step: C-7 INV
dry = 0%
knob=1
button=off
store preset
step:
same
Gestures on CFX ColorFX selectors:
------------------------------
NORMAL:
C-1 0 C#-1 1 (all on ch7)
D-1 2 D#-1 3
SHIFTED:
G#-1 8 A-1 9
A#-1 10 B-1 11
Pad MLM and macroFX knob:
-------------------------
"is" macroFX Knob value (14 bit)
"ix" pad MLM - previous pad pressed
sequence is:
change knob -> "is"
press pad: remember pad ("ix") -> timer 30ms -> send knob -> send pad again
ColorFX state machine:
----------------------
4 buttons = 0..3
+shift = 8..11
when "0" is active, pressing "0" sends "0 off"
when "0" is active, pressing "1" sends "0 off"/"1 on"
when "0" is active, pressing "shift+0" sends "8 off"
when "0" is active, pressing "shift+1" sends "8 off" then "9 on"
Filter Dual Polarity (16x filter):
----------------------------------
Input (from DDJ):
button: ch7 notes 0/1/2/3
filter: ch7 CC 23+55/24+56/25+57/26+58 (14-bit)
pads: ch8/10 note 60/61/62/63
Output (to Traktor):
ch1..4 CC (ALL NEW CCs)
shift:
no shift: all special operations
shift1: FULLRANGE of that effect
shift2: BYPASSES deck 3/4 mixerFX
Variables:
"z0"/1 - CONFIGURATION: 0: Windows; 1: MacOS
"l9"/0 - CONFIGURATION: are 16x filters enabled? (0: disabled; 1: ENABLED)
"j1"/4 CFX which SET we selected (per channel) (0: set #1; 1: set #2; ...)
"j5"/4 CFX enabled/disabled (per channel) (0: disabled; 1: enabled on CFX buttons; 2:enabled per channel)
"y0"/1 - MIXER_FX reconfigure lock
"y9"/1 - MIXER_FX buttons lock (wait 30ms to receive all inputs, then cascade final answer to all 4x decks)
"in"/1 - CFX buttons are blinking
//////////
"is"/4 CFX knob REAL value (14 bit, centered in zero)
is - CFX1
it - CFX2
iu - CFX3
iv - CFX4
"l5"/4 CURRENT Polarity
1: positive; 2: positive (we need refresh)
-1: negative; -2: negative (we need refresh)
l5 - CFX1
l6 - CFX2
l7 - CFX3
l8 - CFX4
"jx"/4 PRESHIFTED Polarity
0: no shift pressed; 1: positive (right); -1: negative (left)
jx - CFX1
jy - CFX2
jw - CFX3
jx - CFX4
Use cases: macOS version:
-------------------------
macOS version - 16x filters OFF:
no translation done
pressing color button = changes single mixerFX for all chanels
turning knob - no translation
16 filters ON:
color buttons select both mixerFX and macroFX
filter#1 is kept to mixerFX
filter#3 translated to macroFX (new code)
pad buttons do the same, BUT FOR THAT DECK ONLY
FINAL SETS:
0: DubEcho: wormhole (echo) 81 / polarwind (flanger) 86 dot delay 7 / barberpole 6
1: Pitch: flighttest (echo) 89 / Eventhoriz (filter) 88 dualdelay 2 / flanger 5
2: Noise: laserslicer (BM) 83 / zzzurp (BM+flanger) 82 reverb 1 / noise 3
3: Filter: resonant filter 78 crush 8 / gater 4
4: darkmatter 87/ bass-matic 85
5: granuphase 84 / streetch fast 91
6: streetch S 90 / streetch fast 91
macroFX:
Wormhole = ECHO heavy filter + heavy flanger + delay (Buildup//breakdown)
PolarWind = FLANGER heavy flanger (coloring) + light filter + reverb (Mixing/punch in)
FlightTest = ECHO heavy echo + resonant filter (Punch In)
EventHorizon = FILTER HEAVY filter + echo (Breakdown/punch in)
LaserSlicer = BEATMASHER heavy beatmasher + flanger (Punch in/buildup/breakdown)
Zzzurp = BEATMASHER related to Ringmodulator (masher + flanger + crush + reverb) (Punch in/breakdown)
DarkMatter = CRUSH heavy crush + delay + compression (for Mixing)
Bass-o-Matic = BEATMASHER heavy triplets slicer (Punch in/breakdown)
GranuPhase = BEATMASHER delay to 2nd and 4th beat (Punch in/buildup/breakdown)
Strrretch (Slow) = loop sampler (Buildup/breakdown)
Strrretch (Fast) = loop sampler (Buildup/breakdown)
mixerFX:
Reverb 1: ECHO resonant reverb + heavy filter
Dual Delay 2: ECHO 1/2 delay + filter
Noise 3: NOISE white noise + filter
Time Gater 4: GATER ON/OFF BPM-sync + filter
Flanger 5: FLANGER 4-beat flanger + filter
Barber Pole 6: FLANGER soft Shepard Tone
Dotted Delay 7: ECHO heavy delay (staccato)
Crush 8: CRUSH bit crush (no pitch increase) + filter
monitor cue config:
-------------------
note: ch1.c6 - normal monitor cue
note: ch1.g#7 - external configuration ON/OFF
"i9"/1 - external monitor cue
CC: ch7 44+12 cue mix
CC: ch7 45+13 cue volume
NEW CC: ch7.Note 60 C4 (NEW TAKEN BY HAND)
M6: MONITOR CUE SETTING
0: EXTERNAL monitor mode (default for all 4-deck controllers)
1: INTERNAL monitor mode (DDJ-SR, DDJ-SB, etc)
BeatFX state machine:
---------------------
ON/OFF = ch05 B4 (=71)
traktor: hold (=remote control)
tested that this button always sends 127 when pressed, 0 when release. THUS NO VISIBILITY ON TRUE VALUE.
PC app connect - no reaction
channel select: ch05 E0..G0 (16..19); other = 20..22
"h0" = real ON/OFF button state
"h9" = which deck selected: 0 = master/mic/sampler; 1..4 = decks
input: 24 00 -> 25 FF (turn off previous one, turn on new one)
conclusion:
- do store preset on parameter up/down; dry/wet; master on/off
selector:
old FX 00 -> dry=0 (invert)
old FX 7F - select new effect
old FX 7f (delayed) - turn on button
(CH5 C-1 SPECIAL NOTE) <<<<<<
ddj_1000 knob beatfx: (dedicated kontrols for unit4)
no shift: CC10+42 beatFX dry/wet (ddj_1000 case, no shift)
shift1: CC11+43 beatFX parameter (dry/wet+shift1)
shift2: CC12+44 beatFX parameter2 (dry/wet+shift2)
shift3: CC13+45 (no action)
How beatFX works:
-----------------
DDJ SX2 uses channel 5 and 6:
CCs 0,2,4,6,
+shift: 16,18,20,22
this makes it access all 4x FX units
DDK-1000 uses channel 5 and CC 2.
There is no hardware shift. There is no other CCs. No channel 6.
-> in BOME we swallow that specifc message and replace with entirely new messages
ON/OFF: note ch5.b4 is also shared
-> we send ch5.C-1 instead (this was free)
To merge the mapping, I've added these messages back
traktor remote control by BOME:
-------------------------------
direct = 0/1 (change state)
hold = remote control : 127 -> 1 / 0 -> 0
toggle: (no visibility except if an OUT command as well)
pressing shift:
1: MIDI IN [DDJ-1000]: 91 3F 7F
2: MIDI IN [DDJ-1000]: 96 7B 7F <<<<< unknown
shift+jog platter turn (Vinyl mode=ON):
1: MIDI IN [DDJ-1000]: 91 3F 7F
2: MIDI IN [DDJ-1000]: 96 7B 7F
3: MIDI IN [DDJ-1000]: 91 67 7F
4: MIDI IN [DDJ-1000]: 96 7B 00
5: MIDI IN [DDJ-1000]: 91 79 7F <<<< unknown
6: MIDI IN [DDJ-1000]: B1 1F 41
7: MIDI IN [DDJ-1000]: B1 1F 41
...
68: MIDI IN [DDJ-1000]: B1 1F 41
71: MIDI IN [DDJ-1000]: B1 1F 3F
72: MIDI IN [DDJ-1000]: 91 67 00
73: MIDI IN [DDJ-1000]: 91 79 00
74: MIDI IN [DDJ-1000]: 91 0A 7F <<<<<<< unknown
Channel 1..4 FREE NOTES (TK IN):
--------------------------------
ch1..ch4 NOTES:
to generate this file:
cat ddj-1000\ notes\ low\ channels.txt | egrep "^NOTE" | awk '{print $2}' | sed 's|/|\n|g' | sort -un | awk 'BEGIN{a=0} { while(a<$1){print a; a = a +1;}; a = $1 + 1}'
10 "A#-1" - loop 1/2x (DDJ-SZ adaptor)
13 "C#0" - loop 2x
14 "d0" LOOP IN long press (NEW)
15 "D#0" LOOP IN shift2 (NEW)
18 "F#0" LOOP OUT long press (NEW)
19 "G0" LOOP OUT shift2 (NEW)
25 "C#1" LOOP AUTO longpress (NEW)
33 "A1" LOOP AUTO shift2 (NEW)
35 "B1" LOAD SELECTED INTO DECK (NEW) (127: load)
52
55
58
59
60 "C4" -> deck select firmwave 1.12 NEW!
65
69
75
78 "f#5" - PREPARE echo out (step 1: channel 1..4; step 2: channel 5 only
79 "G5" - NEW sync HOLD style
96 - master tempo
97 "C#7" - TTFX normal play/pause
11 "B-1" - STANDARD play/pause
117 "A8" - TTFX flux mode fake play/pause
114 "F#8" - STANDARD deck change message
115 "G8" - seek to front
116 "G#8" - FREE
117 "A8" - TTFX flux mode
118 "A#8" = tempo range down (NEW PEDRO)
("C7" = tempo range cycle up - as originally made by Pioneer)
119 "B8" - enlarger: tempo Reset to 6%
120 "C9" - previous track (standard = E8)
121 "C#9" - next track (standard = F8) (update fw 1.2: this is sent as well on shift+jog)
122 - STANDARD - page ">"
123 - STANDARD
124 - STANDARD
125 - STANDARD
126 - STANDARD
Channel 1..4 FREE CCs (TK IN):
-----------------------------
/// 14-bit CCs
0+32 - tempo
1
2 - PFL (out only)
3
4+36 gain
5+37 - tempo shift
7+39 EQ hi
11+43 EQ
15+47 EQ
19+51 - fader
20 - jog screen - position (out)
21 - jog screen - bpm value (out)
22 - jog screen - speed (out)
23 - jog screen - cue marker (out)
24+56 - free
25+57 - free
26+58 - free
27+59 - free
28+60 - free
29+61 - free
30+62 - free
31+63 - free
31 - jog
32+0 - tempo
33 - jog
34 - jog
35 - jog
36
37
38 - jog
41 - jog
51+19 - volume
....
56+24 - free
57+25 - free
58+26 - free
59+27 - free
60+28 - free
61+29 - free
62+30 - free
63+31 - free
------ NEW CCs start here (7 bit)
64: force delay T3 (slot2) (<<<<< NOT DONE)
65: force reverb (slot2)
66: force flanger (slot2)
67: free
68: free
69: free
70: free
71: Force mixerFX1
72: Force mixerFX2
73: Force mixerFX3
74: Force mixerFX4
75: Force mixerFX5
(windows version will do this at the BOME level ONLY)
76: FX Unit1 - CHANGE TO GROUP MODE
Press:
- set group mode
- Route FX units
- FX1: TTFX; FX2: = None; FX3: (CC 81..88)
- dry = 0%
Release:
- dry = 100%
- TTFX button1 = OFF
78: FX Unit1 - CHANGE TO SINGLE MODE
Press:
(as above, but in single mode and sets the buttons and resonance as required)
Release:
(see above)
77: FX UNIT 1/2 ON/OFF / GROUP SLOT 3 (HOLD style)
80: MIXER_FX ON/OFF (HOLD style)
(note CC 77: this is sent twice. One immediately, another after the delay)
(WHY? if dry wet is zero on purpose?)
sequence is:
71 (force mixerFX), 77 (mixerFX turn on)
76 (set group, dry=0), 76 INV (dry=100%), 81 (set macroFX)
79: Advanced panel set (HOLD style)
81: goto macroFX1 (all these are on slot3)
82: goto macroFX2
83: goto macroFX3
84: goto macroFX4
85: goto macroFX5
86: goto macroFX6
87: goto macroFX7
88: goto macroFX8
89: goto macroFX9
90: streetch slow
91: streetch fast
93: STEM FX - relative slot1 (NOT USED)
94: STEM FX - relative slot2
95: STEM FX - relative slot3
96: STEM FX - relative slot4
97: STEM FX - DIRECT slot1 (USED)
98: STEM FX - direct slot2
99: STEM FX - direct slot3
100: STEM FX - direct slot4
101: STEM VOLUME - relative slot1 (NOT USED)
102: STEM VOLUME - relative slot2
103: STEM VOLUME - relative slot3
104: STEM VOLUME - relative slot4
105: STEM VOLUME - direct slot1 (USED)
106: STEM VOLUME - direct slot2
107: STEM VOLUME - direct slot3
108: STEM VOLUME - direct slot4
109: INST DOUBLES - FROM "A" to this deck
110: INST DOUBLES - FROM "B" to this deck
111: INST DOUBLES - FROM "C" to this deck
112: INST DOUBLES - FROM "D" to this deck
92: POLY MOVE SIZE (IN, direct)
113: POLY Loop size + Set DIRECT
114: POLY Loop size selector DIRECT
115: POLY Loop active ON/OFF
116: FREE
117: STEM FILTER - relative slot1
118: STEM FILTER - relative slot2
119: STEM FILTER - relative slot3
110: STEM FILTER - relative slot4
121: STEM FILTER - direct slot1
122: STEM FILTER - direct slot2
123: STEM FILTER - direct slot3
124: STEM FILTER - direct slot4
Channel 1..4 CCs (TK OUT):
--------------------------
CC "02" - deck PFL volume (REGULAR)
CC "66" - tempo adjust
CC "67" - advanced panel status OUT -> "h5"/4 -> "CC 79"
CC "68" - cue (state)
CC "69" - deck flavor STEM
CC "70" - loop size
CC "71" - move size
CC "72" - FREE
CC "73" - FREE
CC "74" - FREE
CC "75" - any loop active -> (none)
CC "76" - is in active loop -> "le"
CC "77" - play/pause
CC "78" - jog touch
CC "79" - pressed any hotcue
CC "80" - free
CC "81" - key adjust
CC "82" - track end warning
CC "83" - deck volume
CC "84" - free
CC "85" - deck phase
CC "86" - free
CC "87" - free
CC "88" - free
----------
CC "89" - deck position LR
CC "90" --->> HR values, assume all is taken
CC "100"
CC "110"
encoder relative modes:
-----------------------
3Fh/41h
jog wheels
7Fh/01h
browser:
ch7 cc 64
ch7 cc 100
beats:
ch05 cc 0
ch05 cc 1
ch06 cc 0
ch06 cc 1
Channel 5 Free notes (TK IN):
-----------------------------
# cat ddj-1000\ ch5\ notes.txt | egrep "^NOTE" | awk '{print $2}' | sed 's|/|\n|g' | sort -un | awk 'BEGIN{a=0} { while(a<$1){print a; a = a +1;}; a = $1 + 1}'
0 C-1 - DDJ-1000 BeatFX HOLD mode (NEW) (0/127)
1 C#-1 - Select up/down (encoder 1/7f mode)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
23
24
25
26
27
28
29
30
31
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
65
66
68
69
70
76
77
78 f#5 channel 5 - ECHO OUT STEP 0
79 g5 channel 5 - ECHO OUT STEP 2
80 g#5 channel 5 - ECHO OUT STEP 3
81 a5 channel 5 - ECHO OUT STEP 4
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
106
(and above)
Channel 5/6 Free CC (In):
-------------------------
TODO MUCH LATER:
- support SX2 features "as-is"
- move all DDJ-1000 beatFX buttons to dedicated buttons
-
# cat ddj-1000\ ch5\ notes.txt | grep CC | awk '{print $2}' | sed 's|/|\n|g' | sort -un | awk 'BEGIN{a=0} { while(a<$1){print a; a = a +1;}; a = $1 + 1} END{print "And above"}'
0 DDJ-SX2 beats unit 1/2 (ch5_0 = unit1 / ch6_0 = unit 2 / ch5_1 = unit 3 / ch6_1 = unit 4)
1 DDJ-SX2 beats unit 3/4
2 DDJ-SX2 Knob1 unit 1/2 / (same as DDJ-SZ FX1 drywet)
3 DDJ-SX2 Knob1 unit 3/4
4 knob2
5 knob2
6 knob3
7 knob3
8
9
10 BOME_NEW beatFX dry/wet (ddj_1000 case, no shift)
11 BOME_NEW beatFX parameter1 (dry/wet+shift1)
12 BOME_NEW beatFX parameter2 (dry/wet+shift2)
13 BOME_NEW beatFX parameter3 (dry/wet+shift3)
14 BOME_NEW MFX FX1 knob3 <<<<< superknob macroFX
15 BOME_NEW MFX FX2 knob3 <<<<< superknob macroFX
16 sx2?
17
18 sx2?
19
20 sx2?
21
23
24
25
26
27
28
29
30 SET new layout
31
32
33
35
37
39
40
41
42 BOME_NEW beatFX dry/wet
43 BOME_NEW beatFX parameter1
44 BOME_NEW beatFX parameter2
45 BOME_NEW beatFX parameter3
46 BOME_NEW MFX FX1 knob3 (macroFX)
47 BOME_NEW MFX FX2 knob3 (macroFX)
48
49
51
53
(Everything above 53 is free)
channel 5 free CC (TK OUT): (MIXER)
-------------------------
(none were previously used)
CC 124 - current layout TK OUT
CC 125 - echoFX in progress -> "i0"
CC 126 - jogFX global status -> "z9"
23, 39, 55
Channel 7 free Notes/CC TK IN: (BROWSER, GLOBAL)
------------------------------
CC 1+33 - crossfader CURVE
CC 3+35 - sampler volume (REGULAR)
CC 7+30 - MIC high
CC 8+40 - master volume
CC 9+41 - booth volume
CC 10+42 - sampler volume + shift1 (NEW BOME) <<<
CC 11+43 - sampler volume + shift2 (NEW BOME) <<<<
CC 12+45 - cue mix
CC 13+45 - cue volume
CC 13+45 - UNK
CC 15+47 - MIC low
CC 22+54 - Sampler volume + shift3 (NEW BOME) <<<
TTFX TODO: move this to ch5.cc.2
cc 23+55 - Filter knob A
cc 24+56 - Filter knob b
cc 25+57 - Filter knob c
cc 26+58 - Filter knob d
cc 27+59 - Filter sampler
cc 28+60 - Filter osc
cc 29+61 - OSC param
cc 30+62 - osc volume
cc 31+63 - crossfader
cc 64 - browser
cc 64 - only browser on
cc 100 - browser tree
cc 105 - sampler+shift
(free values were not checked)
channel 8,10,12,14 free CCs (IN): punch
---------------------------------
0 triger slot 1 cell 1
15 triger slot 1 cell 16
16 triger slot 2 cell 1
31 triger slot 2 cell 16
32 triger slot 3 cell 1
47 triger slot 3 cell 16
48 triger slot 4 cell 1
63 triger slot 4 cell 16
64: goto page
65: FREE
66: FREE
67: FREE
68: select sample - slot 1 (USED)
69: select sample - slot 2
70: select sample - slot 3
71: select sample - slot 4
Applescript inject mouse clicks:
--------------------------------
The current change mixerFX feature is only supported by BOME on Windows.
However this is possible in macOS using applescript.
See page 61 and ff of the bome manual.
In particular how to pass variables to applescript.
mouse clicking at certain coordinates:
https://apple.stackexchange.com/questions/266784/how-do-i-make-the-mouse-click-at-current-location-using-applescript
mouse tools:
http://www.hamsoftengineering.com/codeSharing/MouseTools/MouseTools.html
if you are a macOS developer and want to help, please contact me.
"z0"/1 - OPERATING SYSTEM CONFIG: 0: Windows; 1: MacOS
"km"/1 - mouse injection X - location of preferences window
"kn"/1 - mouse injection Y - location of preferences window
Cross-Channel Compilation:
--------------------------
BOME problems:
echo out - deck 1
play pause - doesnt work
ver beatgriding
Timers:
"IN" TIMERS: ok
"OUT" TIMERS:
NEED TO END in "1". PUT "step_a" in the middle
knob3 -> still gets compiled into 2x times
superknobs CH2:
these are done by hand
Errors:
search "error" on whole BOME log
Time elapsed:
manually activate old method for deck C&D
CHANNEL >5 messages:
$ bome_analyse_project.sh -hc
Timer coalescing template:
--------------------------
////////////////////////
// coalescing support:
// xx: 0 = no blinking; 1 = blinking
xx=0
/////////////////
// BLINK TEMPLATE FOLLOWS
/////////////////
Label "do_blink_very_slow"
xx=1
if zx==0 then Goto "show_solid_on"
Goto "show_solid_off"
Label "do_blink_slow"
xx=1
if zy==0 then Goto "show_solid_on"
Goto "show_solid_off"
Label "do_blink_fast"
xx=1
if zw==0 then Goto "show_solid_on"
Goto "show_solid_off"
Label "do_blink_veryfast"
xx=1
if zz==0 then Goto "show_solid_on"
Goto "show_solid_off"
////////
Label "show_solid_off"
pp=0
Goto "end"
Label "show_solid_on"
pp=127
Goto "end"
///////////////////////////
Label "end"
////////////////////
// blink coalescing support
// are we blinking?
if xx==1 then exit rules, execute Outgoing Action
// did we wake up by a button?
if hm==1 then exit rules, execute Outgoing Action
// else
exit rules, skip Outgoing Action