FM7 (Norns)


A Polyphonic Synthesizer for Norns With 6 Operator Frequency Modulation

Plug in a MIDI controller or a Monome grid and off you go. All 32 algorithms from the DX7 have been implemented. Check parameters menu for all the things you can change.

Future plans

  • Phase Modulation matrix modification using grid and arc controllers
  • Envelope editing via UI


  • Envelopes respond to MIDI velocity
  • Update GUI to correctly display the DX7 algo drawings
  • Default amplitude mix might be a bit high


Nothing required to hear sound but if you want to do something more than play random notes, you will need a MIDI instrument or a Monome grid.


– grid pattern player:
– 1 1 record toggle
– 1 2 play toggle
– 1 8 transpose mode
– enc 1: change presets
– key 2: random modulation matrix
– key 3: play a random note


v1.0.2 - FM7


I’m a huge fan of the dx7/ all things FM. I’ve been falling in love with KQ Dixie lately, since it’s the most faithful dx7 emulator I’ve heard to date, and also it loads every dx7 patch ever made.

Hence my question to you, could you program in fm7 to load dx7 carts? It’s so fun when you get going on these old patches. Here’s the archive I found of (I think) all of them. Each cart has around 100 patches inside.


Yes, this is totally possible. What is the data format do these dx7 carts? Check out the params menu and you’ll see all the things.

Here’s the old Brian Eno DX7 patches if anyone wants to program them in…


Some format info here:

Hmmm, the engine might need some additions to get to this place. For example I didn’t include an LFO.


Thank you for the wonderful patch!!! Also thanks for looking into it. Norns could become the FM powerhouse of 2019 haha. I think it’s got the goods tho.

1 Like

I’m having trouble working getting the midi connection working. I have a midi controller connected via usb (op-z), but no output when sending messages through. I added a small debug line to see if the OP-Z is sending midi using these lines:
m = midi.connect() m.event = function(data) tab.print(data) end
and see console out printing the midi data passing through, but am not hearing output from the FM7 patch. Is there something I’m missing configuration wise?

It appears the MIDI configuration has changed in the 2.0 update. I’ll sort this out. I hadn’t tested that.

Indeed, the MIDI handling I copy + pasted from the 1.0 earthsea script no longer works. Copy + pasting from the 2.0 earthsea patch also fails

I have also discovered that preset loading via params:read(path) no longer works as expected.

@j4ustin okay, fixed. I pushed to my repo master branch and made a new release for the zip file link at the top post. I don’t know if that’s how the Librarian script works.

@its_your_bedtime what happens if someone installs a script from this forum category and the zip file changes for bug fixes or features?

Also, the MIDI range is a little weird. I’m adding a todo to copy + paste from Molly The Poly rather than earthsea.

Excellent working now. Thanks! I’ve been installing scripts via git, ssh, and loading w/ sftp. Haven’t read any docs that pointed out otherwise.

I’ll fork and see if I can help out with the molly the polly copy paste.

Use a path local to the script or a full path. Or you can use a number.

Fwiw - I think Librarian would require a user to delete the current version and re-download the new one

You can update scripts with Librarian (via git pull), i guess it works with zip installs too.

1 Like

hola! getting a load fail with the following errors. any ideas what I’m doing wrong?

script load: /home/we/dust/code/fm7-master/fm7.lua


script clear

SCRIPT ERROR: load fail

/home/we/dust/code/fm7-master/fm7.lua:14: module ‘fm7/lib/fm7’ not found:

no field package.preload[‘fm7/lib/fm7’]

no file ‘/home/we/norns/lua/fm7/lib/fm7.lua’

no file ‘/home/we/norns/lua/core/fm7/lib/fm7.lua’

no file ‘/home/we/norns/lua/core/params/fm7/lib/fm7.lua’

no file ‘/home/we/norns/lua/lib/fm7/lib/fm7.lua’

no file ‘/home/we/norns/lua/softcut/fm7/lib/fm7.lua’

no file ‘/home/we/dust/code/fm7/lib/fm7.lua’

no file ‘/usr/local/share/lua/5.3/fm7/lib/fm7.lua’

no file ‘/usr/local/share/lua/5.3/fm7/lib/fm7/init.lua’

no file ‘/usr/local/lib/lua/5.3/fm7/lib/fm7.lua’

no file ‘/usr/local/lib/lua/5.3/fm7/lib/fm7/init.lua’

no file ‘/usr/share/lua/5.3/fm7/lib/fm7.lua’

no file ‘/usr/share/lua/5.3/fm7/lib/fm7/init.lua’

no file ‘./fm7/lib/fm7.lua’

no file ‘./fm7/lib/fm7/init.lua’

no file ‘/usr/local/lib/lua/5.3/fm7/lib/’

no file ‘/usr/lib/arm-linux-gnueabihf/lua/5.3/fm7/lib/’

no file ‘/usr/lib/lua/5.3/fm7/lib/’

no file ‘/usr/local/lib/lua/5.3/’

no file ‘./fm7/lib/’

stack traceback:

/home/we/norns/lua/core/norns.lua:185: in function </home/we/norns/lua/core/norns.lua:185>

[C]: in function ‘require’

/home/we/dust/code/fm7-master/fm7.lua:14: in main chunk

[C]: in function ‘dofile’

/home/we/norns/lua/core/script.lua:140: in function </home/we/norns/lua/core/script.lua:140>

[C]: in function ‘xpcall’

/home/we/norns/lua/core/norns.lua:186: in field ‘try’

/home/we/norns/lua/core/script.lua:140: in function ‘core/script.load’

/home/we/norns/lua/core/menu.lua:423: in field ‘key’

/home/we/norns/lua/core/menu.lua:164: in function </home/we/norns/lua/core/menu.lua:141>

script clear

Did you download the whole repo? Zip file or git pull?

Errors sound like youre missing the lib folder/engine

1 Like

You’re not doing anything wrong. I wasn’t clear on the format of how the Librarian script searches for links. I’ll update the format. @its_your_bedtime what is the regex looking for in the post?

1 Like

Its looks for github link with zip ending (as there are few of them in the page source code - discource, etc)

understood. I put the link to the master branch of my code repo. updated.

this is working for me now as I had similar issues.
It’s a fantastic synth and well worth taking the time to explore the many parameters. Here’s an improv i did today


I’ve tried using Librarian and Cyberduck but keep getting the message: error: load fail. I have a feeling it’s a simple fix…I hope. Thoughts?

EDIT: I fixed this using maiden and changed line 14 to : local FM7 = require ‘fm7/lib/fm7’ instead of: local FM7 = require ‘fm7_norns/lib/fm7’

1 Like

the require suggests the name of the FM7 folder should be:


if it’s called anything else it’s not going to work.