3

Overview

I am using a Midi Fighter 3D to play notes into Ableton Live (Lite in this situation, but I have a license for Suite if needed). The MF3D outputs 16 sequential MIDI notes for each of 4 banks as follows:

Bank 1: C1(36), C#1(37), D1(38), D#1(39), E1(40), F1(41), F#1(42), G1(43), G#1(44), A1(45), A#1(46), B1(47), C2(48), C#2(49), D2(50), D#2(51)
Bank 2: E2(52)... G3(67)
Bank 3: G#3(68)... B4(83)
Bank 4: C5(84)... D#6(99)

This works well for playing drum kits, however, I would also like to use it to play bass lines and other melodic parts, similar to how you would on the Ableton Push.

The Problem

When I play a melodic part, I would typically like to play in a scale, not chromatically. However, I don't want to reprogram the MF3D to output different MIDI notes as this would

  • complicate using the standard drum racks,
  • make it difficult to change scales,
  • and probably mess up the way it works with other software.

I also want to maximize the number of in-scale notes available in the selected bank.

The Question

How can I re-map the sequential notes of the MF3D to sequential notes in a scale, starting at some arbitrary root note

I'd like a solution that I can put in a rack so I can use the chain selector to play a drum kit on one bank and an instrument on a different bank. Any other solution that lets me switch between drum kits and scales by changing banks on the MF3D would also be appreciated.

Example

For example, I might like to have bank 1 send the default note values, but map bank 2 to a C minor scale as follows:

E2 (52) --> C2 (36)
F2 (53) --> D2 (38)
F#2 (54) --> D#2 (39)
G2 (55) --> F2 (41)
G#2 (56) --> G2 (43)
A2 (57) --> G#2 (44)
A#2 (58) --> A#2 (46)
B2 (59) --> C3 (48)
C3 (60) --> D3 (50)
C#3 (61) --> D#3 (51)
D3 (62) --> F3 (53)
D#3 (63) --> G3 (55)
E3 (64) --> G#3 (56)
F3 (65) --> A#3 (58)
F#3 (66) --> C4 (60)
G3 (67) --> D4 (62)

What I've Tried

I tried using the Scale MIDI effect, but this doesn't work b/c it maps solely based on note name; i.e. I can map an incoming E to play a C in the same octave, but I can't have E2 mapped to C2 while E3 is mapped to G#3.

6
  • 16 notes could be doable with a MIDI Rack and a lot of Pitch effects forum.ableton.com/viewtopic.php?t=134286 ... and if you want to hack around with Python code, you could create a Remote Script, or modify one of the existing ones out there. Oct 27, 2020 at 8:18
  • Unfortunately a control surface or remote script wouldn't allow for a UI so no changing scales/root notes without an edit and restart of Live. The pitch effects could work, but I can't wrap my head around how to change scales... any ideas? Oct 27, 2020 at 14:54
  • Max4Live maybe? There you can even code stuff in JavaScript. For changing "scales" i.e. note-to-note mappings with the MIDI Rack contraption, you'd have to have a separate rack for each different mapping, and switch between racks using some sort of remote control means. Oct 27, 2020 at 16:14
  • 1
    This MIDI Note Mapper Max4Live patch seems to be exactly what you want. maxforlive.com/library/device/2273/midi-note-mapper The author says: "I use it a lot for MIDI file conversions between different drumkits." Oct 27, 2020 at 19:04
  • Good find - I missed that one. It's definitely an improvement over using individual pitch effects. I'm looking into making a custom M4L device first, but this will be my backup plan. Oct 28, 2020 at 14:46

1 Answer 1

1

To solve this problem, I came up with the following device which I have dubbed Scale Mode. It maps a range of sequential MIDI values onto a preselected scale.

Scaled Mode Max Device

It differs from the built-in Scale MIDI effect in that it doesn't repeat any notes; i.e. instead of just transposing 'bad' notes to the nearest 'good' note, it actually remaps the range so that there are no duplicates. This allows for playing a larger range of notes on pad controllers like the Midi Fighter 3D.

Unfortunately it does require Max for Live so it won't work with Live Lite.

There are still several bugs - it doesn't work correctly below the root note, it's unintuitive to define scales that don't start on C, and it behaves unpredictably when the output goes above MIDI note 127; however, it works for my purpose.

I will post the initial code here as part of this answer, however, I will only be developing it further on my GitHub page (I will post a link here later once it has been posted there).

Solution flow chart

----------begin_max5_patcher----------
3969.3oc2bs1aiabE8yq+UPXjh.z3kcd+nn4CsaPQWfjtEMA8KIEFzRzRLKE
o.Iks2MH+26cHonHEGRQJQZ6saPr2kbjlYNy8dtm4NO9sqdy02E+je50N+Ym
e14Mu42t5MuI+QlG7lx+8atdi2SKB8RyK10gAO36FsaioT2T7dunn3Lurf3n
7R7iqieL0IasuC7gxbR7e6Fusa8W5DuKaUbPzJGn39t6+zO3kD4swO+i9OgW
7gcY+sCe2aS7S8iJ91uMweQVQaEqPtXJWQEXkfgTZM6FGLE4RIDLRHwZDVhH
5abXLWD7JtKx4+V9cBsiP+rrOs0u3K65quw456Ci8fu78kYqW1h0PasVcRQR
WAQH0TMgKEDrjbiiTicQTllRzBLSP0To05LXYdGL9te8sZbUmyKA54Y9I25G
4cWXdyAW9N.hChflYZ8GVGMNpvEcp7RSJeZp2C9Ku0KKKI3tcY9G9aokiukC
vlwfvc9w2u+w6ed8VX553jrpAJXPprSznP6wTjk2sKJHKM6SE8RkkBDFGspg
kfSG0RPz8wixRq3q32u5pC+J+m+9U2LPq9Ewa1..+9AtL+mxNzLiqZliybEa
ybU6h0LEhyQDkFyYXnfpZFRC1vTncEJg.KDLsf.+S9MNboKEQoBJUQTXAEyO
5autYJ55K2TDcFX8F+zTuU9svZAphynsGbu3Ci6xYTLgHvbElQLfJA52bDfu
LIgANvZo.vGjwwkfriHJ6HBwZOG+ZnmS3ZWFAL.PHIkfXHp3r54R0L2yAVoL
vNpi.J9YN+ifUqcLda+RzuD8tvfEezIK1IEdiw8eM7VefAv3taddASf4uUQN
DDA9vsB9zg+J.aBvUBQvDDRvEJiCkxEyTXvIiyYDLioJn3OUvk67hVMdySrh
6B9+ZMLPAO.HP.FCRdbEyOsNHI5KtB5xclmkA1uO9wtGWCiebtGVAMCZFPCy
A2DNCHP44CnvHAG3IkLnTvPtsmcAC4V8KOmgb1qvg7QqPz9X3w5Beez.jEhc
U.uFWKPLNDRkPlcUgDMxxPIvXiQXfpPRDDDUiUmRUnf8kupv2G8LHJzdkzkl
virslOkf4AnBC1DjcZaTIQAR7HDl.kOeAtkPKBBPF.FvXklCDNP3gAHDzpPG
lzEAh8jJJvr.V+THVF3mPjLv.EK3Johq5VGnf9BoC7z7H+TsP+AQa2UFo3Sw
6bdLHccQHCHhgUNEy.16i9dyH1fHVNdPyldfIbxlVGJETSy.LKPbJmHklGdB
Zk+OXxllQp4kXI2486q47dD2RPVfWXabyNCzXsJsUWEFABXHclm6ZPz4DR01
LWAaSBiH4RSZP3fuB+zDV1CdxrD7DBnREHETeJIkQTxdl4JW7BwXE4+HT+s.
5zsgAfofSPmShKvL7T7q9fKXFafXUMC79wZgFIz.xPIBW.s3HA1PBQTFdndm
MGkXEen18umNbXWzVuEebV.AMyUngfabNHeFQThJhwt.AR+g0lMPXSvx.vcO
0+59BPr++qgIMex3gHA2UqwLshpDJ.lvPLLMwk2MDgGCDolVH5.ujU6jw6kH
b4PzaJH2AQkXkBXrnp9LPvnQz6wSauudFEGXGTQLbxJAQCbuftAl.nRY795g
rQzAmP5vdIAF+HqTfcQPzIBQQQHDz8MC23dI.m4rY0yH68wIa7xNEG3YfB1V
GBEoWFPqnfbxH.6R2weO3ImH+UP72G7KjFEe+8o9UELLHxeQ7tnr5CJ1DOfk
tfhXBghwPGFlECLyFPmhqDSDfzAJfOBEEH3DZf5SaRzYgVZD37SzcfJysWQW
vxOk3EktM9PfgNDjoAdbkRvj4SLDlGfpKAYDWLneRHnLDiAefgLCREp8RIvY
ZWiYEGpRAGqjHisE2Ez5wkTfsAh3BlhcKHiPdgDj0EVaR53YNWcrk7EdVRes
lZdKyUWHckPDKPNLLgOvDNeoi5BnQux.5ebgWnYRFK8epu.ZRH5Lz2TPGDIk
bhNekv.wIB.TUl+CBZKLzbLWfZCC.CClB.SoncCFX0L6I+wzvfk9Iclb6PnC
lmIJCImImTdYNvLa2Etz4NeGPDXFv7kWfTCLcprWqXVVCQaYutP8uh1WVHFn
Xav21Eb7QRAGDTHLZqMoLm.16bSlOPRlhwLyITkq1lWuR2DurQVF.BtUEOXO
qdIwesbUWe7CO5jaSFWpKlRMM.zcvT3rhqaEqYXhqBnugfV.ECEoNsrN0Xlc
W8lCz9OJUM2GD5+feRZSXDL02ts1ialEmMd+ZbRyrt.MihGcHuII9ODr+ySq
dpWB.JY.hrKoHwLOUkV7R6ojncAUxxxG3JaR4CQlD5jB5KK9vGRbno9psHPl
7kgxsWEfbAyuj03P.SfUgwK9n+x5IW553s9QAQGaYU85k926sKL616iixRC9
boctq02eeYKz5KqRJ0eMwjHn8EYURvx3HSinwHg4w6qte1x5QVVhHusV9vf0
B.Kc7xTnStK8NuDy.UoSGY+KyhiCa9ppOWn+8YkudaPTzQnXV71teYRvp087
YuKFd4l99tyeS5s6hJd6slk.3VSlIaVNuvvR+3le8O4EE.py8yBJFBHnpWVP
7rNcQRbXXi9awadvxaVB13K7eLXY157Jptw.T7fsUwJpFkWFrxOMq4yx7Vk1
7IUI1r1i1cWoO7sY9a1FB8hlEnwF8ptCacFuFO+HluBViJuwtRnW9bpYRoqP
CRCYJJkJM5OyWoUTwOqLNOdKmT+a2VPaaAtq8l8pP1mcy5ecEZP1y5WKmp6Y
+mOLAUlmAgIYKmFETSHJ7t74QYCFvSHLzHnXy.iYN2U+48uT4cNqDByED9By
vWS4DFVxgffTvFCrvDXPbHnDDl3OnNmTLiWR2nq7LP2oDqxqudgjSCG7bCJZ
Aa+oMnDc1kQc2k6wspgd9lVUzmUjpt50tmmUN9.A3YbiMjYVTRboN1Sgb7ID
49O9fnhfrOM6jRSDtUvZcd3FaBws+U.z1lcJrlSfsIG1GRVABC9res4xAHXr
imSZbRl+RmvfzFexFYvhdBbFmqGkRn4SZCWD9rankdVAIelPp2E56kjCSPka
V4yf6A.qDy7R7cV6GtrSjhcBZOYY5LyUtKKzu2iQHU9JFoZkcffnCYBnSDhz
OBgKUegbIlnkZkRowBD1rnpEzfTZO3E+EFu5UFwmCWXLt5kWaeYNI2VANQD4
XR4VesGMCD0KrngdPFvC6qBvNe625fLFPQN3AY8LdUG6AsxINWHAg2MnUs9Y
uBAs6hS7d5jgHu4L+0.CshoE6bGD8j1echjzNQR8yCR94PWSPv9Ezdy.Luvb
VgEUNIOCeRLoa1cRmfB4KnI8TBHDLJeM5O4DaHrWu9afUxlr0WtQx9zKPj4R
.zmBSv5WuFI.lrJId21oy0oPBI+jtNXwqWT4NuUW9TWn5bWlhv6D8d+mNwiy
.Nr43bHmqlvtcjrs71q481woz3cIK12YKyWgSyV9R+zrfnpLP+yGL0cp1ufm
XXZrMBw.aDsarwIKKVVA7KZCKGcv1aYnYokwGXKiTzvlk1.aDsg4xzwnc9k2
.l7pvMhLzADr341QZ3MstaYyiijw3jLfFl5YGxFXCyBzV0xHunsLyTzd9GLo
C2Ja1ZCrA1FlKl48zLmrQLmzQ3gF8bO647zJPCsUnlyVwHYlsJ+6p5aIgxSD
SwZr2ywgYTqE7pv367BKWo2pcJfkkJ97OtHcrCW9lye+Xq4tDovrxcBNlSjL
yVJD4R4bklqwbDES0xJk5crsV3rWlcsaYB19K6yu1WEPb7CS8MO05VVkNc6s
YtF4RZsaVEtThPyjXFmIHHF0Li3N.MzKCn4+z1jbX6axwKyOo8t+dG4M5fsa
7BARaNDH.FxTDN7HJM+DNfJ1N3V2A7xQrWolP34O5fIms+DgKrrumGuCESLy
1FcsoP+vhLyVxomdnh6BcEIWhnHDFQvcseP4TWgjxDBjRPU.ISOaNVF+k47N
7ml1QZlF2.GDb1IGom6C7v.Npt62c60Wcvhs8py6u24cNAoM1QrdKxOd.4k3
FmBl2r0PgBJNb2+v6+t2Wb3ALaGOmGMu2bBK2F58opUUyYQbRhOTsQKMGA7r
XmutZme+01NSvUsxOj2.O84B15lweluFprtE8Ex1aQ+9OYvT0W9mL3iOyDm2
wCFcpiG7Ai2B6ho3PB+Z0eXtOMxcPR9Gl1i62YPRR4uLRkd6DePG0LWsVpUZ
MWRAghnSJDfHe4COb3x9oyiL+a65lb.rgujKxAa2.PS38Ci0y4y3uHGNHX7K
W5ZXfZduGGLrYS403vXLIeotFG9t7cYtyC9IYAPzgiNWasMHyWTLPURwVPf1
5jjrNX4xFGEfqadpD.rKKNx4Gg3WN+f+xfcab929q1EVs2brsitGjj6ZUW0I
n.l3VMrJuQ1b00JftiS2SI.1JMOpFIapib7Hpk8wVCRCtlFPEYRowgUkxb9f
2FCj9k8Ml4dv33yCDmTb1evVxoBoAcUijeeQcC7I5FrFKtRqtgPXoaTr2WnX
oKtkVVZ9sc1ri9lYEMRz2btFLnuz17xjRavOZ16GFgKiseH.AA.jqIJJGhNQ
olqbPgMgTsKY69H4h5ixgzIwjIvmTJFPMsmh3xpI1.pIoZBpIAan8I7TabJF
bmDO0zRB7PbLZrNXG6XP4.c4w2vVli1J17GhDSUXpzbEQhMaB9V5raWxKbjj
OD3jiNrpTmeMMjnfp9.OLW1FRDBlKw7GLCDVSvHjICcPIkLP6q.H5gIkHM4x
a3kjgPtRDUhXDJDlPpIlDaXKjhkRdgvzQw05XA5ZZINQtVCppo8E10ZnU.pc
UlasNtvbl7zf7garOVZojSsOLaHrw4.QmA2HBtqrUpvKt1SnlbC2RaghbwZK
XzgztES.2NUMTD5R4dn7gJWEMJJg8xUQLW4vjqhdF5GH6trWl4LkL.ox85xZ
ONSwQBBSKLpa7ujl67IyeXDjDjMK0c5MebAuT6Ex.v45aafyulFREMA0CQNz
oLLNO.i96hvRlCupRaBUYk1pcAmZmiA0EOxCZhbNHCYXTLd9ELUmeKrxzXMA
ruAEElrcpc0stUIaWxIGeoCUT57fuCg7oyPoXHxXK3kXtAKL+gR.8sbPsEsh
7ou2ILzTFsbBBv4qY.uiY9kZKZFaWxK0QdH9wS.gAdPLSzonlHC0tpGgRp1t
Dlovn3Xf8gA+UIF7M5HK.VJ4TaAiGbDkQ1IknhltPhTbhPf6JUGVJ4TyPfwC
bhWWrICd.7ApIXpj3gLURbaufhL4dz8HjoRN59C5n6Nn12aPcemAc78ET9Fy
qq6Inq98q9evHtQ+a
-----------end_max5_patcher-----------

Update 2021-08

Here is a link to the final "Scale Mode" device I created to solve this problem: Scale Mode v2 on GitHub. This is a complete rewrite that addresses the issue of scales that don't start on C.

2
  • Just wondering if you finished the code for this. Also, if your self-answer is sufficient to your needs, please accept it; otherwise, it gets bumped periodically as awaiting an answer.
    – Aaron
    Aug 2, 2021 at 22:23
  • 1
    Sorry Aaron, life got in the way and I forgot to close the loop on this. Link posted. Answer accepted. Aug 12, 2021 at 13:39

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.