"Rotor Organ"

A Csound simulation oriented to live playing

Latest release — July 2009

Reproducing the sound of a Hammond Organ in all its moods seems not to be a particularly simple task. Not only does an emulation have to provide adjustable 'Drawbars', but, to recreate all the throatiness a Hammond can pour out, it has to have capabilities such as a "Leslie" and Vibrato as well. This Csound emulation has now evolved to a point where I believe it matches the "Hammond sound" quite creditably -- considerably better than other software I've tried previously. The latest version (7.3) has further adjustments to bring it even closer

This emulation is intended to be driven from live MIDI input, with further control through 'score' commands, either from a file or sent during performance to the program's stdin. It allows for the two keyboard manuals that a Hammond has, each with its own drawbars. Hammond-type Vibrato and 'Percussion' are available, and output can be through a "Leslie" rotary speaker simulation and 'Reverb'.

The approach has been to try to simulate the actual mechanism of a Hammond as closely as possible. Even tone generation now goes the whole nine... umm ...drawbars... and uses "tone wheels" in code that have the exact "gearing" and "teeth" of those in the original. (Hammond tone wheels generate neither exact harmonics nor true equal-temperament output, possibly contributing to the "Hammond sound".) The Percussion scheme and Vibrato follow the same principle, the latter using a "scanner" that modulates frequency and amplitude the same way the hardware does. Much of the code is based heavily on Hans Mikelson's 'RotorOrgan', though it has metamorphosed considerably. I've added a page with more technical background if you're interested.

Live keyboard MIDI input is normally on channels 1 and 2 ("Swell" and "Great" manuals respectively). Swell pedal control for these is Controller 11 ("Expression"). Drawbar settings can be made through a bank of MIDI controllers on the respective channel, or through score commands. A short range of channel 3 notes can be used to set Leslie speed — by default the lowest 8 keys of an 88-key piano. (Or, again, score commands can be used.)

If your system isn't capable of supplying all these inputs, you can just use a single MIDI channel, and control everything else through (real-time or file) score commands. All defaults are constants at the beginning of the Orchestra file or set in the Score, so they can easily be changed as well.

If you want to get a quick idea of what the emulation sounds like, you can grab an mp3 here (485K). (It's about a minute long, in three, somewhat choppy, parts — the first two about 15 secs each. It was generated from the midifile that Hans Mikelson included as a demo with his original code. The midi and score files for it are downloadable below. This, and the following demo were actually made with an earlier version, so they're a bit top heavy and weak in the bass, but you'll get the idea.)

For fun, I've also made an mp3 of "Jerusalem" in "EL&P" mode. This was generated from a variant of a midifile sequenced by Takahumi Sugimoto, with the organ parts driving the emulation instead of the General-MIDI synth. (I have no idea how close this is to Keith Emerson's drawbar settings, as I don't have a copy of the original piece. I just flipped between some registrations that sounded reasonable.)

If you're not familiar with Csound, it is a cross-platform, open source, (and now rather venerable) sound synthesis package.

For reference, I run Csound 4.23 (without a GUI) under my own MusicWeaver package on BeOS [OK, so I'm a nonconformist... (:-)], which lets me have a single configuration that both runs Csound as a shell command, and does some preprocessing of the live MIDI stream. With this setup, I can feed Csound both from MIDI and stdin, so Instrument commands can be sent to it while playing. I have a window of "Presets" where I can quickly select a line (or create a new one) and send it to Csound at any time.

[If you're one of the noble few who stick with BeOS (:-)) and want the above Csound version for it, it's on BeBits, or you can get the x86 zip archive directly. (I haven't published my MusicWeaver configuration, because it is so personally tailored, but contact me if you're curious.)]

(There seem to have been some changes to Csound 5, relative to Csound 4, that prevent the original scheme of sending new 'start' commands to change parameters of running Vibrato etc. from working, but this version has an alternative way of achieving this.)

Read a more detailed description in the README.

These four other files are in the package:

  • rotororgan.orc The Csound Orchestra file, containing all the Instrument code. (in which a typo preventing the 5th harmonic from sounding was fixed on 27 July...!)
  • rotororgan.sco The Csound Score file. Contains only basic initial setup. Other parameters can be sent in real time to stdin.
  • presets A text file containing many example drawbar, Leslie, and Vibrato parameter settings, configured as Score "i"-format commands for the Rotor Organ app, ready to be sent to a running Csound. These include the "Standard" and "Popular" Drawbar Registrations that were originally comments in Hans' Score file.
  • other_presets Some other registrations gleaned from the Hammond Wiki that might be fun.
All the above files are packaged as archives, if you prefer:
Download a zip archive of all files (25K)
Download a gzipped tar archive of all files (22K)
The midifile and score used to generate the short audio demo above are in a separate package:
Download a zip archive of the demo files (4K)
Download a gzipped tar of the demo files (3K)
(Apologies for the broken demo package that was up for a while. Fixed 2010 Jan 10)
If you have any questions or comments, you can send me a note here ,
and I'll be glad to help if I can.

                                Pete Goodeve
                                Berkeley, California

                e-mail: pete@GoodeveCa.NET
                         pete.goodeve@computer.org

Back to Main Page
Programs for BeOS