home j h h l . n e t home
jhhl.net's other iOS apps
polyharp splash screen
splash screen

PolyHarp 1.0.14 (June 27, 2020)

PolyHarp is available in the App Store!
See App Store Details


PolyHarp is an extended chorded zither in software for iPads.

PolyHarp takes the idea of a collection of strings and chords and extends it to greatly expand the number of strings, the kinds of chords it can use, the layout, fretting, damping vs. undamping and more!

You can use the Glossary_ for quick hints.
Polyharp uses its own internal synthesizer, but can also drive MIDI synthesizers as a controller.
You can either just use the preset instruments, or build custom chords, layouts, and behaviors!

It tries to explore the question:

What if musical scales are not as important as the relationships between pitches? What if those relationships can be defined in a lot of ways, and combined into arbitrary chords, and built into languages of music based on these relationships?

PolyHarp is a software instrument which is very like a chorded zither (usually known as an Autoharp, which is actually a name once trademarked by the U.S. Music Corporation/Oscar Schmidt). PolyHarp lets you explore these concepts, and play music in a way that frees you from organizing notes into scales while still allowing you to access the relationships between pitches.

Pushing virtual buttons allows sets of virtual strings of any pitch to be played by strumming them.
Like its real-world equivalent, PolyHarp lets you strum with all your fingers and you can also press several buttons at once. It can even play the damped strings percussively! Unlike a real chorded zither, there are no conceptual limits to the number of strings or the pitches assigned to them. PolyHarp uses its chords to create the strings that it needs — and a PolyHarp can have multiple-string courses, be precisely tuned, and fretted! PolyHarp also lets you isolate string sets in different areas of the screen, and gives you great flexibility with the size and placement of the chord buttons. PolyHarps can be archived, and they can also be used as MIDI controllers, if you don't mind losing some of the microtonal capabilities.

PolyHarp uses AudioBus 3 and can save its configurations there. It can also integrate with AudioBus3's MIDI support.

The PolyHarp Tutorial Videos Playlist

Play them all or tap the "table of contents" icon inthe upper let corner to pick a specific topic.
Topics include: Playing PolyHarp, Undamped Chords, Chord Areas, Strum Modes, The Synthesizer, Pitch Bend, and MIDI.
More to come!



I've been playing the Autoharp for more than 40 years. I have about 10 of them right now. Each one has different tunings and chord bar sets. Yes, they go out of tune a lot, and each one has 36 strings (except for thoser little ones and an off screen Omnichord).

I do a lot of experimenting with tuning the strings and making chords. You can read about those experiments here. But at some point, you run up against physical constraints related to the number of chords, the number of strings, and how to tune them.

The Suzuki Omnichord (that white plastic thing in the front) is a kind of a hardware solution to some of those problems. It has 36 Chord Buttons, a lot more than can fit comfortably on an Autoharp, and can actually play about 84 chords. It's now called the Q-Chord and has MIDI output. PolyHarp's internal synthesizer actually sounds a lot like the Omnichord's.

PolyHarp can be thought of as an update to my old Commodore Amiga program LYR, which was a chorded zither simulator I wrote in the late 80s. It played MIDI synthesizers and had some pretty bizarre chords and features, including a strum sequencer. But LYR never got to a stage where it was user configureable.
It nevertheless was a pretty impressive MIDI controller. It was especially good at providing an easy way to control MIDI velocity, which sounded especially good on the Yamaha DX7.

You can read about LYR and other old Amiga software of mine using this link.



term explanation
Glossary You are reading it! Tap the Glossary link again to make this go away!
Autoharp A popular form of chorded zither, invented in the 19th Century. Autoharp® is a registered copyright of by Oscar Schmidt
PolyHarp A Polyphonic, microtonal-friendly chorded virtual instrument.
Base Key A frequency that all the chords are relative to.
Just A system of intonation where all the intervals can be expressed as integral ratios.
EDO Equal Divisions of an Octave. Modern Western music is mostly written in 12 EDO, also known as 12 tone equal Temperament (12 TET).
EDI Equal Divisions of another Interval. PolyHarp lets you divide any interval into equal parts, e.g. 1:4@5/4 is the first degree of a 5/4 (perfect third) divided into 4 equal parts.
TET Tone Equal Temperament. The overwhelming number of Western music uses 12 TET, also known as 12 EDO (equal divisions of an octave)
Interval A difference in pitch between two frequencies.
Interval Spec A coded name for an interval, like "V" or "3/2" or "7:19".
On String A virtual string that is positioned where the On String Interval places it, but with the tuning of the string's interval.
Chord Bar A Chord Type that is transposed by an interval related to the Base Key. If the Base Key is C, a V7 chord would resolve to be a G7.
Chord Bars A set of Chords.
Chord Button A button that represents a Chord Bar.
Chord Type A set of intervals. For example, a Major (M) chord would be based on the intervals I, III, V.
Lock Bar A bar which stays down until you touch it again.
PolyHarp patch A configuration of PolyHarp: ChordBars, chords, colors, and layout
Course Several "strings" behaving as (nearly) the same pitch.
String Area A rectangle or other quadrilateral with virtual strings to strum.


PolyHarp's main features are:

  • PolyHarp runs on iPad only. It's too big for an iPhone, even a big iPhone!
  • Plays synthesized audio, as well as MIDI. The synthesized chords can be made of any musical intervals, not just those in a 12EDO scale. MIDI uses only tones from 12EDO (rounding whatever the actual pitch may be).
  • "Strings" on the PolyHarp correspond to the strings of the chords.
  • Any chord setup as whole can be transposed.
  • You can make up PolyHarps with a great number of Chords. The intervals used in these chords can be chosen in many ways, and also taken from the huge number of scales in the Scala collection.
  • A Chord Bar is a collection of intervals which themselves are transposed by a relative interval, which is resolved relative to a Base Key.
  • You can layout the Chord Buttons (which control the Chord Bars) all over the screen.
  • Strings are resolved within an adjustable frequency range.
  • You can have several discontinuous ranges of string areas.
  • A chord can treat strings like a fretted instrument, assigning several pitches to the same string.
  • Stringed instruments with more than one string per course can also be built, with up to 7 strings per course, with random or non-random variations on the intended pitch.
  • You can assign MIDI note-ons and controls to the chord buttons and use an external controller to "push" them
  • Uses Audiobus 3.0 and IAA!
  • Works with Audiobus Remote to put many chord buttons onteh Remote panel.


There are a lot of concepts in PolyHarp that are a little unusual or rather, not a little unusual.

Before you start, you might want to take some time to customize your iPad in the Settings App in the following ways:

  • Turn off keyboard clicking!
  • Turn off the "Multitasking Gestures" and "Allow Multiple Apps" controls! PolyHarp depends on multi touch, and if these are left on, swiping all over the screen will send special messages that will send you to the Home screen, open the multitasking console, swap between apps, or have other consequences!

When you start up PolyHarp, it tries to reload the last PolyHarp patch that you were working with.

  • There are a lot of buttons and sliders on that big butterscotch toolbar. Sorry.
  • Over on the left is the PolyHarp logo and version number, and underneath, the current patch name. Touch the patch name and you'll get to the patch loading page. A long touch on the patch name will reload that patch in case an edit got out of hand.


Patch dialog

Loading and saving PolyHarp patches is done via this dialog.

Loading patches

The large and colorful list on the right side is the total list of all the patches. If the name has a diamond (◆) on it, that's a read-only patch that comes with PolyHarp. You can change it and try to save it, but it will be renamed with the word "new" appended to it.

You can narrow down this list using search tags. When you touch the Search Tags area, a keyboard pops up with a list of all the tags it knows in a scrolling list on top of it. You can click on the tag, and then refine your query, if needed, with the keyboard. Tag syntax and usage is detailed here. . To clear out the tag query, just type a blank as the query string.

There's a big "Empty" shortcut button that just loads a good starting point patch for building a new PolyHarp.

Saving patches

The left side of this dialog is devoted to saving patches, and setting some of their characteristics.

You can type a name for the patch in the name area, or alter an existing name and save it as something new. You can also generate a name that pairs an adjective with a noun (in English), making for some interesting combinations!

Here are few other features about saving patches:

  • The Save button will save this patch and close the dialog when touched.
  • The Export button will save a patch on the clipboard, so you can mail it or otherwise archive it.
  • The Import button will read in an Exported patch.

These exported patches also include all the custom chords that may have been used in the patch. They are simple JSON strings in case someone wants to make an external patch editor.
Import and Export will be expanded later to save these patches externally, or directly call up other text exporting options.

  • The description field is next, put something descriptive in there.
  • The rating field is on the side, keep it an integer (0-5)
  • The tag field is next, tapping here pops open a keyboard with all the tags it knows that aren't automatically created. You can of course make up a new tag if you like.
  • The date is below, it's read only, but useful when loading patches!
  • The Base Key is underneath that, a bit redundant, but there again mostly for comparison. Beside setting the frequency that everything is based on, a base key is also used by the chord namer to chose which enharmonic name to use in the chord, that is, it will use C# in the key of A, Db in the key of Ab.
  • The chord button name selector lets you use different naming conventions for the chord button labels.
    Patch dialog
    The buttons show examples of how the labels are formatted. They are as follows:

    • Simple: The chord interval is resolved in the current base key, then rounded to the closest standard named note. The chord is truncated to the part behind the last space (' ') if there are any. Thus, a chord like 5/4 just M in the key of D would look like F# M even though the chord is technically not an F#, and not a Major chord. But it's close enough, and fits on a key!
    • Full: This elaborated on the Simple format by adding the cents offset and octave to the standard note, and the full name of the chord, so 5/4 just M in the key of D would look like F#-13¢3 just M.
    • Ratio: This shows the ratio as a floating point number over the shortened chord name.
    • Hertz: This shows the resolved Hertz of the chord, over the shortened chord name.
    • Cents: This shows the interval in cents over the shortened chord name.
    • Spec: This shows the original interval spec over the shortened chord name. That way, if the interval is something like 1:4@3/2, you will see it that way!
    • Chord: This only shows the chord name! In some cases, the chords are built as a tuned version of a specific instrument, and so the fact that it's transposed is not important, and in fact a little confusing.
    • Label: You can actually put in your own custom name for a particular chord bar! If none is set, it'll use Simple.
  • The Damp/Undamp switch sets how the PolyHarp uses its chord bars: Damp is the usual way: all strings are open unless damped by the "felts" on a chord bar. Pressing multiple chord bars results in the intersection of the playable strings of those bars. Undamp works the other way (like a piano), That is, all strings are normally damped, and chord bars allow strings to be played. Similarly, multiple chords form a union of playable strings. This is very powerful, especially if you desing PolyHarps with deliberately simple chords which are meant to be combined.

  • And finally, the Skin controller, detailed here, which sets up colors for various elements of the PolyHarp.



The current internal synthesizer is a very simple one, so that it can have the high polyphony needed for simulating a massively stringed instrument. It's running by default at the effective processor friendly speed of 22050 Hz. (What it's really doing is running at 44100 Hz and only calculating every other sample to save some time.)

PolyHarp Synth (PHSynth) Algorithm

Each string area has a dedicated set of synthesizer parameters associated with it.

The synthesizer interpolates between four wavetables. The sound is divided into an attack wave and a sustain wave. The attack wave is interpolated into the sustain wave over a period of "attack time" seconds. This combination can be called a wave pair. Furthermore, these wave pairs themselves are interpolated depending on the frequency range of the string being hit. Between the extremes of these ranges, the two wave pairs are interpolated.

This basic waveform can be subject to configurable modulations. These modulations take characteristics of the strum, such as where on the string you have strummed and how fast, and use it to modulate characteristics of the sound in that string area.

PHSynth settings


The synth settings control can be used to set up a synth associated with the current string area.

You can choose one of the presets in the table at the top, and base new presets on them. A PHSynth doesn't have to be using a preset, and even custom PHSynth settings are saved with the PolyHarp, when you save the PolyHarp itself.

PHSynth wavetables

The four waveforms can be individually set to a number of preset waveforms by tapping their names. When you do, a waveform picker shows up with names and pictures of the available waveforms. Some are rather complicated! Noise and Silence are among the choices.

image When you have chosen a waveform, touch DONE to dismiss the picker.

To change the frequency values associated with each "high" or "low" waveform, the usual frequency picker is used:


You can set these frequencies to the same value and force an all low, all high, or sharp transition in the interpolated waves for a string. But usually, you can set them to be about the same as the range of frequencies you have set up for the string area.

Tip! Low strings often benefit from higher harmonic content, and so do attacks! But there's no obligation to do that.

PHSynth modulations


Where you "pluck" the string (the strum), and how fast you pluck it (the velocity) can be used to further modulate the timbre of the PHSynth. You can set up sources and destinations via the Modulation dialog. Tap the source and destination names to step through the choices.


  • velocity
  • strum position on the string
  • Frequency of the string (7 octaves normalized to 0 to 1 by octave, that is, C0 is 0.0, C7 is 1.0)


  • volume
  • distortion
  • pan
  • pitch bend
  • MIDI CC01 (control wheel)

How the modulatation is applied:

  • "EACH": only the strings that have been plucked is modulated
  • "ALL": all the strings in the string area are mdulated

Each modulation links the source of modulation to a destination, mapped with a scaled curve. You can pick what kind of curve it is,

  • Linear
  • Square
  • Square Root
  • Midpoint (it changes immediately at the midpoint

and the curves effective ranges for its input and output. The input is always going to be normalized from 0 to 1, but the output ranges may vary, based on the modulation. The pitch bends, for instance, are expressed in cents (+/- 1200 cents)

I'm experimenting with a special range control for setting these values. Just touch it and slide left and right to set it. You can also set the top higher than the bottom if need be: the shaded area will turn red. If you "long touch" it, it will reset to its default. It will quantize the value to something sensible, but moving the touch up or down will fine tune the offset of the current value. I may replace these with something else, but they are prety useful still.

PHSynths are associated with each string area, so different string areas can have different timbres. 

Each string also has an envelope applied to it, independent of the "attack" part of the PHSynth, and the signal may be clipped when it is loud enough, which adds some harmonics to the timbre.



Sliders control the envelope of the string: attach, decay and damping. The envelope is very simple: plucking a string puts an amount of energy into a "reservoir" which is dependent of the speed with which you strike the string. That reservoir feeds an envelope level at a certain rate set by the attack rate. That envelope level is also decayed by the decay rate. It's rather like filling up a bathtub with the drain open. The resulting envelope is entirely based on a reservoir level, an attack rate, and a decay rate. Plucking the string again just adds more energy to the original reservoir level.

The decay rate setting controls the decay rate of a strings amplitude, but when the string is damped, rather than just turning off the sound, it changes its decay rate to a faster decay. That damping decay amount is set by the Damp slider. When the slider is at the left, the damping is vary fast, at the right, it's slower. Thus, damped strings can cut off suddenly, or more slowly. This simulates "worn felts" on the chord bars of a physical chorded zither.


The Polyphony stepper controls the maximum number of simultaneous oscillators that can be playing, currently 1000. Polyphony also affects the volume, since the more oscillators you have going at full blast, the more likely it is to distort. You can automatically set the polyphony to the current maximum number of strings by tapping the "polyphony" label. Doing this guarantees there is no voice stealing, which is when an oscillator is reassigned to a new string while it's playing!

Usually, there aren't that many oscillators playing simultaneously, so I usually set the polyphony to something more like the number of strings that will actually be playing simultaneously. You can do this by DOUBLE tapping the polyphony label; which will then set it to the maximum of the number of strings used by any of the chord bars. This applies also to multiple string courses.

Making the polyphony less than the total number of strings may affect string damping, which after all, means the strings are still playing until they are damped out. This is especially true if you have "scrub" turned on.

Or, you can make them somewhat louder than would be prudent; the Volume slider lets you adjust the volume so in the case of massive, high velocity polyphony, it won't overload and distort. Or ... maybe you like that?

You can also use the stepper to add or subtract from this polyphony setting. The +10 and -10 buttons speed up this process a little, and holding a touch on a button and wiggling the touch repeatedly operates it.



Playing a PolyHarp is pretty easy — there are a set of virtual Chord Bars and a set of virtual strings. Each Chord Bar is controlled by a corresponding Chord Button in the interface.

You push a Chord Button to select a chord and strum or tap the virtual strings to play the notes which are in that chord. PolyHarp is multi touch, so you can do some fancy plucking! Not only that, but you can press Chord Buttons simultaneously, which results in chordal dampening (or undampening) effects. If strings are running under the Chord Bars, the Chord Bars have priority if you slide onto or tap them!

You can load different PolyHarps by tapping the name under the word "PolyHarp", which will cause a large dialog box pop up. Read more about this in the Patch section. If you long press on the name, the current PolyHarp will reload.

In the large dialog box, you can load, save, import, export, rename, delete, describe, tag and recolor a PolyHarp. You can set a preferred Base Key and also — this is important — whether the Chord Bars damp the strings, like most Autoharps do, or undamp strings, which makes it more like raising the dampers on a piano.

Multitouch extends also to the Chord Buttons: pressing two or more Chord Buttons on a damped PolyHarp will play only the common strings (the intersection) of the selected chords, and pressing two chords on an "undamped" PolyHarp will add (union) the strings of all the chords. This means you can construct some interesting experiments in polyphony.

There are a few control buttons that control how the Chord Buttons act:

  • If Stay Down

    Stay Down
    is enabled, Chord Buttons stay down when touched, until you touch a new Chord Bar, or you turn off this feature. Holding does not affect Lock Bar chords, or chords ephemerally locked by using the "Stick-on-4" button.

  • Stick-on-4
    If Stick-on-4 is enabled, tapping a Chord Bar 4 times will lock it down like a Lock Bar; tap it four times again to free it up.

    There's one more button, Scrub, which if selected does not ignore the damped strings when played, it plays them, but with a lot of damping, just as felts in a real autoharp do. The Damping slider changes how damped they are. This adds a little authentic noise to the playing, but also, you might be able to work out a way to make the damped "scrubbing" sound on purpose, and with more consonance!

    Chord Button Remote Control

    The Chord Buttons can also be associated with MIDI messages from external controllers, and controlled by Audiobus Remote. See Chord Buttons And Bars for more details.



PolyHarp uses Chord Buttons to control virtual Chord Bars that do the damping, undamping, and retuning of the virtual strings. Normally, Buttons are supercircle ("squircle") shaped, but different kinds of buttons have different shapes. The Label used on the button is controlled in the PolyHarp Patch Dialog.

Here is the editor for a Chord Button, which is accessed in Edit Mode, when you are in the "Move and Set" sub mode. Tap on the Chord Button you want to start with and this Chord Button dialog will appear.

Patch dialog

This lets you set these Chord Button properties:

  • The transposition interval: You can set that transposition interval by using the Tone_Spiral, or type in an interval specification directly.
  • The Chord Type . See Chord Types for details! You can just pick a Chord Type out of the big list, or sift the list by tapping one of the tags below, or type in the chord type name directly (it must exist, though).

  • The Hammer, Lock, Relative, and Sustain properties: these options toggle on and off.

    • Hammer makes the button into a hammer: every time you touch it, it plays all the playable notes. The undamped strings are still available to strum. I'm not sure what velocity values hammered strings get.
      Hammer Buttons have rectangular buttons.
      Hammer Button

    • Lock means tapping it once keeps the bar down and locks off damped notes, or even does transposition on the strings "permanently." You can use it to damp out strings in other scales. Tap it again to unlock it.
      Lock Bar Buttons have shield-like buttons.
      Lock Button

    • Relative means that the interval assigned to the button is applied to the base frequency, transposing the whole PolyHarp with one button. It's like the Capo feature. Setting the interval to 1/1 (0 cents) will reset the base Frequency to what it was before all the relative transposing.
      Relative Buttons have supercircle shaped buttons, but with the edge a different color.
      Relative Button

    • Sustain acts like a sustain pedal, which is to say, when it's on , and you strum a chord and change to a new chord, the notes not in that chord will keep playing (just like a piano sostenuto pedal). It's good to use this with Lock turned on, and only with Stay Down off. Technically, only the notes in the Sustain chord will still sustain, so it's a good idea to set it be the same as the scale all the other chords' notes are in, like 12EDO. It's also a good idea to use chords that are sparse, so it's not like banging on a piano with the dampers up.
      Sustain Buttons have a hexagon drawn on them.
      Sustain Button

  • Delete will delete the button.

  • Revert will reset the button to how it was when the dialog came up.

Chord Button Shape and color

  • The Chord Button's shape: The Button sizer lets you drag around the lower right corner to adjust the rectangular shape of the button. You can even drag out of the box if you want to make a really big or long button.
  • The current Chord Button's size can be set to the same as the last one you edited with the "Use Last Size" control button.
  • You can choose one of two colors for the button.

String Area Assignment

  • The string areas that this Chord Button will apply the corresponding Chord Bar to.
    Relative Button
    You can tap "all" or pick which one of up to eight string areas that this Chord Button will affect. This way you can have different string areas play different chords, or keep one area playing a locked chord.

MIDI Assignment

  • Learn You can associate a Chord Button with a MIDI event, either a NOTE ON/OFF or a CONTROL. This way you can control Polyharp Buttons from an external MIDI controller. before you start, make sure you have chosen a source for the MIDI in signals! To do that, go back to Play Mode and tap the Route button. Then enable or disable the MIDI Sources.
    Route Button - Route Button
    • Touch the "Learn" button and play a note or control on a MIDI controller. When it's set, touch "Done"!
    • Or, tap on the label Next to "Learn" and a dialog appears where you can set the MIDI command or Note that is associated with the Chord Button by hand. Select to clear the association.
      No MIDI MIDI
      Once a MIDI event is assigned to a Chord Button, it will display it at the bottom of the button:
      Relative Button

Setting the Transposition Interval

The Tone Spiral is a pretty simple one, it lets you set guides to snap to. The choices are:

  • 12 : 12 EDO scale. Note that it's only one octave, for intervals out of that octave, choose "=" with a base of 12.
  • J: Just intonation
  • S: the current Scala Scale. Sorry, you can't choose a Scala scale here, for that you need to use the Chord Maker
  • =: Equal intervals, specifies in the text area next to the "="

More editing

  • You can finish editing your bar and go to an adjacent bar using the "previous bar" and "next bar" buttons. The order is a little hard to determine though!

Arranging Chord Buttons

Once the chord button dialog is done (tap outside it), you can arrange the positions of the buttons.

  • You can move any chord button anywhere on the screen by just dragging where you want it.
  • You can move all the Chord Buttons in the chord box around by touching in the box where there are no buttons and dragging it. You can rescale the box and all the buttons by using two fingers anywhere to zoom, rotate, and move them! If you somehow lose the box, you can get it back (usually) by shrinking it with a pinch until it reappears.
  • Dragging and positioning can be affected by a grid if the grid is turned on, but it's not as simple as it looks! I have to tweak this grid behavior.

  • Double tapping in the chord box, but not on a button, will flip the buttons around their x axis, which is a transform you can't do with just two fingers. Then you can reposition them!

  • More sophisticated but somewhat bizarre chord button cleanup is done in the Clean Up sub mode.



Real chorded zithers have the little problem that they often have a good collection of chords, but then some fiddler or guitarist pops by and plays a little riff in E, or throws on a capo, and now they are in some other inaccessable key that you don't have chords for. That's very frustrating! PolyHarp has a virtual Capo feature that lets you transpose all the chords (and therefore, the strings) with the tap of a "+" or "-" button:

At the top is the current Base Key, the frequency that all the string pitches are based on. You can just touch it to bring up the frequency view.

Below that are the "-" and "+" buttons, which will transpose the Base Key by the interval specified below it. It's usually set to "V", and if you set that to I#, or 1:12, or 100 (cents), you can transpose by a semitone. If you are working with just intervals, you might want to set that to "3/2", and if you are working with some other equal temperament, like 19EDO, then you can set it to "1:19" or whatever is appropriate.

Note that you can also set chord buttons to "relativize" your chords, so tapping it will retune the strings on the fly!

Transposing will cause the frequency of the base tone to change, and in changing, it may creep into octaves that are higher or lower than make sense in your PolyHarp. The "=" button transposes the interval into the "third" octave.

However, some chord types are set up to not repeat (!) or repeat on intervals that are not octaves, and so which octave the base frequency is matters when using those chords.



Going into EDIT MODE exposes a lot of the features and customization of PolyHarps.

This block:

PolyHarp in Edit Mode

Configures the setup of the current String Area. Read String Area to read about those controls!

Here are the various edit sub-modes which interpret editing gestures differently, which you can pick from the radio control box.

Patch dialog

  • Play is a way to play the PolyHarp safely while still in editing mode. It's for testing while creating new layouts!

  • Move/Set lets you move buttons around, move all the Chord Buttons around, and scale and position them. Double tapping a Chord Button in this mode opens up a configuration editor(Chord Buttons and Bars ).
    This mode also lets you create, delete, move, duplicate, resize and otherwise configure String Area properties.

PolyHarp in Edit Mode

This edit mode screen labels all the String Areas and their corners. It also labels all the Chord Buttons.

  • Touching and moving a Chord Button lets you reposition it.
  • Double tapping a Chord Button opens up a Chord Button editor:
    Read Chord Buttons and Bars for more details.

String Areas

  • Touching a String Area makes it "current", its edges are outlined, and its properties are made editable in the menu at the bottom of the screen.
  • The String Areas have resizing circles on their corners. Move them to change the size of the String Area, and touch the middle of a String Area to just move it around. The resizing circles have the string area's number in it in the quadrant that puts it "inside" the string area. If you overlap them or flip them, you can get an idea of which corner is which! If you overlap some string areas' corners, you can drag them together and they will share the same spot.
  • The Quad button frees the string area from rectangular constraints. You can make any four-sided harp now, even twisting and overlapping the strings. It can be flipped, turned upside down, or twisted.

Touch Modes

  • The Touch Mode button determines how a touch on the strings in this String Area is interpreted.

    • Strum means you have to strum over a string. Simply touching it is not enough.
    • Tap means you can just tap a string and it will play it. Actually, it acts like a little strum of a range pixels under the tap, in order to be able to hit the string. The range depends on how hard you press on the screen - really, how wide the touch is. You can strum as well.
    • Slap plays all the strings right away. Like slapping them with a ruler, or like using a "hammer on" Chord Button.
    • Near Is like tap, but it plays the nearest string to where you touched. Again, you can strum it too!
  • There are a few buttons which help transform the string areas:

    • Dup makes a duplicate of the current String Area, inset slightly so you can move it more easily.
    • Delete removes the current String Area.
    • Shrink makes The Area smaller in case it exactly overlays another string area.
  • String Areas can not only be associated with a built in synthesizer, but also with a MIDI channel and MIDI program.

Clean Up

  • Clean is for helping to align Chord Buttons, which is a strange process.
    • first you "collect" a series of Chord Buttons by dragging over them. It helps to be pretty far from the first button you collect. It's a little like sticking food on a skewer.
    • Then with two touches, you can evenly align a row of them. It takes some getting used to!
    • When the grid is on, the endpoints are aligned to the grid (not the Chord Buttons).


  • Create is for creating and deleting new Chord Button.
    • Tapping on a place outside of the "range" of an existing button will create a new button. the "range" is marked with a circle.
    • It makes a copy of whatever you edited last, or a default button.
    • You can tap on an existing button and then tap in a blank space to make an instant copy of it.
    • You can use multi touch to make a lot of buttons and move them around.
    • If you hold a button for a little while, the mini editor comes up, as it does in "Move/Set" mode. In general, it's easier to do this in Move/Set mode.
    • If you tap four times, it removes all the buttons.

Other Buttons

  • The Chord Maker button is the editor for creating and editing types of chords, that is, collections of intervals. This is a powerful interface! See: Chord Maker
  • Grid puts up a grid that is 60x60, and successive taps make it 45x45, 30x30, or 15x15, (and then off). This may change! Certain movements for editing the PolyHarp are now snapped to a grid. For instance, moving Chord Buttons or the whole set of Chord Buttons will snap them all to grid marks. String are corners can be snapped to the grid as well.


PolyHarps are colored with skins that endeavor to have harmoniously related colors. It's not overwhelmingly successful, but it is better than nothing!

The largest circle on the color wheel represents a base color, the one all the other colors are related to. This is also the color of the background of the PolyHarp and the color seen in the list of patches.

The two smaller circles set the color of the string areas and chord buttons. Two contrasting colors are used in these cases. Touching and selecting with the double ringed circle will set both of these colors symmetrically. Touching the single circle will set just that color alone. You can similarly set the saturation semi independently or independently for these colors.

Around the edges are refinements in saturation and value for the selected colors.

The pairs of colors on the top left and right set the colors of the chord buttons. The top is the color of an unpressed button, the bottom is the color of a pressed button. You have two color choices for buttons (left and right).



String area controls

PolyHarp creates virtual strings in four-sided shapes called String Areas. There can be many String Areas on the screen, not just one! In Edit Mode, you can configure these String Areas, and each area has the following properties:

  • A range of frequencies that the strings are generated in. This way, you can break up a large set of strings into separate String Areas, organized, say, by one or two octaves. If the chords of this Polyharp don't repeat, it will start with the lowest playable "string" that is in range.
  • How many actual "strings" correspond to each virtual string. You can make each course have up to seven differently tuned strings in it. See: Course View.

  • Its own synthesizer setting. Each String Area can sound different!

  • A MIDI channel and program. You can have each String Area play on different programs on different MIDI devices!

  • Its shape! You can keep them rectangular, but also use the "QUAD" option to make them different 4-sided shapes and orientations.

  • The way it responds to your initial touch:

    • Strum: it waits until you strum a string to play it
    • Tap: a small span near the touch is played. If it's near a string, it plays it with the pluck position of where you tapped it.
    • Slap: it plays the whole area, again based on the poition of the tap.
    • with those last two, you can still strum afterward.

Chord Bars now can be associated to all String Areas or any combination of 8 of them (internally, more, but just 8 in the interface).

When you push a Chord Bar, all the strings in the String Areas are affected that correspond to the resolved notes in that chord, and strumming the strings in one area does not also strum the strings in another area, even if they are the same "note". It's as if they are on different channels or are separate devices!




This is a special control for setting the distribution of strings in a course. Normally, a string is one string that is set to a determined frequency. You can make it so that a "string" is actually a set of strings, either randomly or equally spaced.

This "logical string" can be represented by up to 7 "virtual strings". How many virtual strings are created is set by tapping the numbers in the segmented control.

The intervallic range of the virtual strings' spacing is controlled by the slider and the triangle buttons. All ranges are truncated to a tenth of a cent. You can set the range up to an octave (1200.0 cents) which extends both "sharp" and "flat". The slider is nonlinear, giving more accuracy at low values. Each tap on the triangle adds or subtracts one tenth of a cent for fine tuning.

The random feature even extends to 1 string! That way you can make a PolyHarp with out of tune strings, as if it were left in an attic for a few years.



Chord Types are named collections of intervals. For instance, a major chord (M) is a collection of the I, III, and V (0, 400, 700 cents) intervals. You can specify the intervals in a chord by using the very powerful Tone Spiral.

Chord Naming

Even though conventional chords can look pretty complicated, like FMaj9+11/C , PolyHarp has so many kinds of intervals, and no restrictions on which shall be collected with which, that you need some creativity coming up with chord type names. For example, you could have a chord that is 1/1, 5/4, 34:51, 9:5@5/4, 115.3434 (cents) and so on. These chord types are then used with transposition interval to specify a Chord bar.

A lot of chords built with different intervals function in similar ways - the aforementioned M (Major third), made of I-III-V works a lot like its just cousins 1/1-5/4-3/2 or the 19-EDO 0:19-6:19-11:19. It'd be interesting to set up "namespaces" so that the names of the chords match how they function more than how they are technically constructed - which you could discover if you could find its namespace. You can use the "tags" feature of the chord types to help with that. Also, you can give a chord type a name with a " " (space) in it, and it can peel off what's in front of the " " when it names the chord button, so it doesn't have a long name!

At any rate, I am hammering out a few PolyHarp-only chord naming conventions to help out somewhat.

The Chord Type name and Description are pretty self explanatory, and the tags are covered a little below, but there is also the repeat interval.

A chord type can either repeat within its repeat interval or exactly specify which intervals make it up. This helps in most situations, since you'd normally specify an octave's worth of intervals and transpose them by an octave up and down the scale. But there are exceptions! For example, to make a 31-EDO scale, all you'd have to do is specify a 1/1 , select "repeat", and make the repeat interval 1:31. You can make scales that repeat at all kinds of intervals, or not at all. Non repeating scales are useful for precisely setting intervals on specific strings.

On String

Each string that a chord type creates is normally placed where its pitch would normally place it, as if it were on a piano keyboard. That is, it is logarithmic with respect to octaves. But sometimes, you want to move that string, or reuse it with several pitches. For that, there's a separate interval spec available called the On String spec. This is like how, on a guitar, you can play a C on an A string. In PolyHarp's case, since you don't know the exact tuning of each string (kind of like using a capo...), you'd have to specify the string position using the interval of where the string ought to be. This way, different notes can be played on the same string (like a guitar). In a weirdly expanded way, you can build fretted chords and strum them.

Sometimes, I just set that up as equally divided intervals, like 0:6, 1:6, 2:6, etc. for a 6-stringed instrument, but you can bunch them up more and also put them in reverse order, or arrange them in chords as they are on a zither.

The On String string's physical location is as if 1/1 (0 cents) is based on C4. There may be a sensible way for these to repeat

As another consequence, you can make one of these retuning scales, repeat it, and add create a lock bar chord based on this scale (transposed by the chord interval). The effect is to retune the strings in all the chords that use those strings (and of course damp the strings that aren't in the lock bar).

You can swap the tone spiral's display from showing the Interval to the On String Interval by touching the name "Interval" or "On String". An unset On String just uses the interval to position the string.

Chord Parameters

  • Select a chord from the chord type list if you want to base a new chord on an old one. Built-in, read-only chords are marked with the "read-only" character, ✦.
  • There is a list of tags that you can use to associate chords together (rather like the namespaces I mentioned).
    Tap a tag name and it pops matching chords types to the top of the list. You can type in your own set of comma delimited tags to associate with this new chord type, and it will add them to the tag list if they aren't already there. There's a special tag keyboard that comes up, and you can tap an existing tag to add it to the list!

Tone Spiral

The Tone Spiral is a way to visualize intervals. Each whorl is a new octave, and intervals are laid out on the tone spiral as big white spots. There are guidelines that show you where some popular intervals are located on the spiral.

  • Add a new interval with the (+) button. It will be placed in the middle, unused portion of the spiral. You can then drag it to a place you'd like it to be.
  • Similarly, you can remove an interval with the (-) button
  • There are buttons to build guides that you can snap to:

    • 12 TET, which is pretty pervasive and easy to understand. This setting, though, always forces the interval to be between 1/1 and 2/1. For setting intervals in multiple octaves, which won't force it into 1/1 to 2/1, use Equal with an interval of 1:12.
    • Just, a selection of popular just intervals,
    • Scala, where you get to choose from thousands of Scala scales, collected by Manuel Op De Coul. By default, this comes up as Harry Partch's 43 tone just scale. You can either type in part of a scale's description of one of the included scales, or choose one from the massive list which is comes up in a special keyboard when you change the name of the scale using its text field.

    It searches the Scala list as you type, and you can preview the intervals in the interval list on the left!

    There is a crude tagging system that lets you look for some characteristics of Scala scales:

    • Search for "#j" to find scales that only have just intervals (numerator/denominator) in them, or
    • Search for "#w" to find scales that are "wide" and have intervals out of the range of 1/1 and 2/1.
  • Equal, equal tempered scales, based on an interval unit you type in, like I or 1:19 or 1:5@5/4.

These are merely guides, you get to choose intervals out of them to make your own chord types.

  • Tone Spiral
    Using the Tone Spiral button, all the intervals in the guide, which is usually a scale, are turned into actual, editable intervals. Any existing intervals are usually removed first (unless the Transpose Button is active). You can then remove intervals that you don't want in the chord.

    If you are looking at On String intervals, it creates them with On String Intervals as well. After that, you can go back to looking at Intervals and "retune the strings".

    • You can use the Free and Snap buttons to either perturb your intervals a little or make sure they snap to the guides. Perturb moves the pitch randomly within +/- 12.5 cents.
    • You can also just directly type in an interval that you have selected. You can select an interval by clicking on it, or, if they are too dense, by using the < and > buttons.
  • Transpose
    The Transpose button is used to transpose all the intervals simultaneously by the same interval. When it is enabled, touching any interval dot and moving it will transpose all the other intervals by the same amount. If snap is on, the other intervals are not snapped! This lets you take some unevenly spaced intervals and keep then that way.

If the Transpose mode is on and you tap the Tone Spiral button to create new intervals based on the guidelines, the new intervals will be added to the ones that are there! That way, if you want to make a few octaves of intervals, you can transpose, create, transpose, etc!




This is a special control for setting frequencies. By clicking on various boxes, you can pick a pitch and octave that translates into a frequency. You can also use the slider to adjust that frequency by +/- 50 cents (a quarter tone). If this is not accurate enough, you can tap on the name of the frequency in the upper left corner, and a normal keyboard will appear.

This control is used to set the Base Key, and the ranges of a String Area.



A musical interval is a measure of the distance between two pitches. Mathematically, it can be seen as the ratio of the frequencies of the pitches. For example, a note that is higher than another note by the interval of one octave will have a frequency twice the frequency of the other tone.

Intervals can be any size, and are often measured in "cents", which are 1/1200th of an octave. That makes a standard western semitone, like the interval between F and F#, equal to 100 cents. This makes it easy to compare intervals to each other and to the prevailing tuning system at the same time.

Most of the time, when talking theory about them, intervals are resolved to be between a unison (1/1, 0 cents) and an octave (2/1, 1200 cents) so that they can easily be compared to each other. PolyHarp does not constrain you to this range. More about that in the Chord Bar section.


Intervals are used for describing chords in a Chord Bar, and how that chord may be transposed relative to the Base Key.

A chord is made out of a set of intervals, for example, a Major (M) chord in 12 EDO is I, III, V, and that chord may be used in a chord bar by transposing those intervals with another interval, like IM, VM, IV7, etc. Those chords themselves get "realized" into sets of pitches when the Base Key is specified. Thus , if the Base Key is A, IM becomes AM, V7 becomes E7, VIm becomes F#m, etc.

Another place Intervals are used is to transpose the Base Key. The Base Key can easily be transposed up or down by a preset interval, so that you can make a small, but complicated set of chords and transpose them to a related set of chords really quickly.

Another place is in specifying the repeat interval of a chord bar, which you can read about elsewhere.


PolyHarp uses a special notation to help you describe an interval. Intervals are used in PolyHarp when creating Chords Types, the Chord Bars, and retuning. Here are the ways you can describe an interval in PolyHarp:

Standard Names
You can use these preset terms to describe an interval in PolyHarp:

Interval degree terms. Many of these terms are enharmonic: they describe the same interval, but in different keys. These resolve to a 12EDO intonation system. These term names can be in upper or lower case! To make typing easier, sharp can be expressed with '#' or 's', while flat can be expressed 'b' or 'f'.

Term cents description
I 0 cents the root interval (no transposition!)
I♯ 100 cents n augmented root
II♭ 100 cents a diminished or minor 2nd
II 200 cents a major second
II♯ 300 cents an augmented second
III♭ 300 cents a minor third
III 400 cents a major third
III♯ 500 cents an augmented third
IV♭ 400 cents a diminished fourth
IV 500 cents a fourth
IV♯ 600 cents an augmented fourth
V♭ 600 cents a diminished fifth
V 700 cents a perfect fifth
V♯ 800 cents an augmented fifth
VI♭ 800 cents a diminished or minor sixth
VI 900 cents a sixth
VI♯ 1000 cents an augmented sixth
VII♭ 1000 cents a diminished or minor seventh
VII 1000 cents a seventh
VII♯ 1100 cents an augmented seventh
I♭ 1100 cents a diminished root
off,? The interval is 0, or in other words, it turns it off.

Just Ratios
Almost all literature which discusses consonance, harmonics, and intonations usually has a large class of intervals specified as ratios. Systems of intervals using only rational intervals are known as just intonation systems.

A just ratio is specified as a fraction like 4/3, 7/4 or 12/1. You can be a little lazy in PolyHarp, and specify a harmonic as N/, like 15/ , meaning 15/1.You can actually use non-integers here also, like 4.5/3.

A cent is specified as a real number, based on 1/1200th of an octave. Many references use cents to describe an interval. I often use the character "¢" to save some screen space, but an interval specification does not use it, because it's hard to type. For example: 550.0, 1330.234. Remember, these are intervals, not frequencies!

Equal Temperaments
In PolyHarp, you can divide any interval equally, and describe degrees (multiples, really) of that interval. You specify the degree, followed by a colon (:), followed by the number of equal divisions. For example:
  • The third degree of a 19-tone EDO would be written 3:19, and would be equivalent to 189.47 cents.
  • The 22nd degree of 53 equal would be 22:53, (498.11 cents). Again, you are not restricted to integers, so 4.5:12 is fine (and equivalent to 9:24, but you may want to use decimals instead for clarity).
  • You can go a step further and specify the interval that gets divided by placing its description after an '@', as in 3:4@7/6, which is the third degree of a 7/6 divided into 4 equal parts (and at 200.15 cents, darned close to II (at 200 cents)).
  • The 0th degree of any equal division is always the same as the root, but it may help you to say 0:19 instead of I, or 0 or 1/1, which are also names for a root.

Powers Of Primes Notation
Because factoring a just interval provides some insight into its harmonic relationships with other intervals, I've made up a new way to specify a number so that you don't have to do so much math to figure out the ratios of complicated just intervals.
PolyHarp will never choose this on its own, it'll just do the math, but this will simplify some calculations and clarify them.

Unlike normal numerals in base 10, which add up successive multiples of powers of 10 , this notation multiplies successive powers of primes. Each prime's power is separated by a ";", (ugly, but it's on the numeric keyboard), and which prime it is increases from right to left, the way powers of 10 increase right to left in decimal notation.

PolyHarp supports primes up to 127, which is rather a lot, considering consonance is happiest with small primes.

You don't have to type "0" if the number has no factors for that prime. Also, you can use negative powers and real numbers for some truly perverse intervals.

A side effect of this is that a simple ";" is how to specify "0" (;0 would be 1), and there is no way to create negative numbers.

So, for example, here are some popular numbers expressed this way:


and here are some more examples showing fractions and roots:
Decimal3/2 cube root of 25/79/827/64
Power 1;-1;0.333333-1;1;;2;-33;-6

Remember, this is just another way to express a number, so you don't have to figure out factors between just ratios that have been transposed. Using a negative number in a numerator is like putting its absolute value as a denominator.

For example, to transpose 3/2 (1;/;1 or 1;-1/) by a 15/8 (1;1;/;3 or 1;1;-3/), you just add the "places" of the PoP numbers together: 1;2;/;4 or 1;2;-4/, which works out to 45/32.

Transposing by octaves just means fiddling with the 2's place (the last place).

These Pop numbers are difficult to compare or do any math with other than multiplying, but they provide some insight into comparing consonance of intervals that the decimal system doesn't!

This feature is completely optional! Feel no obligation to use it!



PolyHarp is a very tag-friendly program.

Tags can be applied to PolyHarps (.polyharp patch files) and Chord types (.phchord files).
As used in many other systems, tags are metadata which help describe the actual data. Tag searching is often made so that a logical combination of tags is used to winnow down a large list of things. PolyHarp expands this somewhat by allowing some tags to be parameterized , so that as well as just searching for a combination of tags, you can also make some simple comparisons on tag values.

PolyHarp file Tags

In the case of patch file tags, you can search on ratings, number of string areas, and how many divisions of an octave it may be using. For example, the search string "edo:>12" can be used to find PolyHarps that are tagged as using a scale with more than 12 divisions of an octave.

When you want to add or change tags on a PolyHarp file, the keyboard conveniently has a list of the tags in a list over the keyboard. The same is true when searching tags.

PolyHarp also creates a few tags dynamically for more specific searches.

You can also reverse the sense of a tag in a search by prefixing it with "!". Tag keys themselves are case insensitive, but the values are not, unless it's for author, name, description, or text, which is a combo of all three.

PolyHarp also automatically creates tags for "today" and "yesterday" if there are patches or chords that were created then.

Here is a more technical look at tags:

User-created tags are comma delimited, and case insensitive. If they have a ":" in them, the values will be searched for as an integer. That way, you can make up a parameter tag, and query it.

Each PolyHarp's metadata gets turned into searchable tags with these names:

Tag What it stands for Notes
name: Name searches for a substring
desc: Description searches for a substring
author: Author searches for a substring
text the text of name, description, and author so you can match on them all
cdate: Creation date searches as a date
mdate: Modified date searches as a date
rating: Rating searches as an integer
version: Version searches as a string
sa#: String Area Count searches as an integer
cb#: Chord Bar Count searches as an integer
built-in ro Built-in PolyHarps (read only) used in the distributed PolyHarp files
user-made rw PolyHarps saved by the user (read/write) these are custom PolyHarp files
hammer At least one chord bar is a hammered on chord a dynamically created tag
lock At least one chord bar is a lock bar a dynamically created tag
relative At least one chord bar is a relative bar a dynamically created tag
additive The chords are additive (undamping) a dynamically created tag
yesterday made since yesterday a dynamically created tag

Most of this is self expanatory, but date searches can be tricky. You can specify a complete date like "2015/12/22T12:45:22", but that can be cumbersome. You can instead use a shorter form like:

  • YYYYMMDD for year, month, day like 20160612 for June 12, 2016
  • YYYYMM for year, month like 201702 for February 2017
  • YYYY for just the year

Normally, all the other parts of a date are set to the earliest qualifying date-time, but if you use < in the query, and one of these shorter dates, it fills out the rest of it with the last second of that period. So cdate:<2017 means to look for objects created before the second before midnight Jan 1, 2018 (which to say, Dec 31, 2017 at 11:59:59). A search seeking the PolyHarps made on a specific day (May 3, 2014) would be: cd:>20140503,cd:<20140503

The text fields for entering and searching for tags have been enhanced with a list of all possible tags. It's just a faster way to type them in, and also, selecting a few tags will automatically comma delimit them. Parameterized tags like "rating:" will require you to provide a value, or a test if it's a search. there's a sidebar of buttons that let you clear (X) or type <,=,or > a little more easily.

More Examples of patch tags and Searching

These search queries are to be typed into the search area over the list of PolyHarps.

Search query example Explanation
ro show all read-only files
name:z show all files with a 'z' in their name
author:J H H L show files I authored (case insensitive value there)
today,!just files I made today without the 'just' tag
cdate:<2016 files created before the last second of 2016.


Polyharp can send MIDI messages instead of using its internal synthesizer.

Using MIDI is pretty simple: toggle the MIDI button and it clears the internal synthesizer, and starts sending MIDI information instead to whatever is listening for it. All string frequencies, whatever they resolve to, are turned into the MIDI note it is closest to, so you will lose all microtonal information.

Relative Button

PolyHarp does not use any MPE Microtonal MIDI commands yet. MPE allows individual strings to bend independently to almost any amount and apply other channel-level changes to individual notes. The polyphony is limited to 15 at best though.

Each string area can be associated with a MIDI channel, and a MIDI program on that channel, so it will send that information and let you play several channel-specific MIDI instruments at once. This is set up from the Edit Mode because that's how all parameters for String Areas are set.

Make sure the other apps you are sending to can run in the background! You can also send MIDI to a hardware MIDI interface.

Relative Button

  • The Route button brings up a menu of MIDI sources and destinations. You can use this to control which synthesizers are connected PolyHarp's MIDI stream. Destinations are synthesizers that will receive PolyHarp's MIDI, Sources are apps and devices that can send MIDI that will map to chord buttons.
    Relative Button Although there's no MIDI MPE, at the bottom of this dialog are the controls for a more experimental scheme called MIDI 192. Read about it here.
  • The Clear button sends Note Offs to all notes on all channels, because so few MIDI synths implement the "all notes off" message.

  • The Decay slider controls how long to wait before sending a Note Off for that string; otherwise you'd have a lot of stuck notes and never hear the decay portion of a note until it was damped by another chord. If you set it to the maximum, no Note Off will be sent unless a chord bar explicitly damps the note. There's a subtlety involved with this though: if you play the same note twice, the Note Off that was scheduled for the first time will be cancelled by the Note Off associated with the newer Note.

  • The Volume slider now sets the maximum MIDI velocity sent for a note.

PolyHarp can also receive MIDI messages, but only uses them to associate MIDI Notes and Controls to chord buttons as switches. See Edit Mode for more details!


MIDI 192

Relative Button

Polyharp can send MIDI messages instead of using its internal synthesizer.

MIDI now officially supports a standard called MPE, the idea of which is to bring more features to individual notes that are normally assigned to channels, for instance, pitch bends, CC values, and the like. This gives lots of Polyphonic Expression where it wasn't supported before. MPE works in a backward compatible manner by leveraging note assignment to put each note on its own channel, with all expression (like pitch bends) preset for it.

This is flexible, but it subject to subtleties associated with note assignment. MPE also divides the 16 MIDI channels into "zones", with one channel per zone reserved to receive commands and behave like each single channel normally would, but applied to all the channels in that zone. MPE software sits on top of MIDI and if you have a legacy device or set of devices that can do non-OMNI mode polyphonic multi-timbralism, like some old General MIDI synthesizers, you can play some microtonal music on them without any firmware changes.

While this is a powerful general solution, it has a big problem: it maxes out at 15 note polyphony. More than that and it'll start stealing notes.

PolyHarp is a polyphonic microtonal synthesizer. That means each virtual string can be set to a pitch that has nothing to do with the 12ED2 system that is hard coded into MIDI (and much other western music). PolyHarp's internal synthesizer doesn't care about 12ED2, it'll play any old pitches. But when acting as a MIDI controller, it has to be more careful. But beside microtonality, PolyHarps other big feature is massive polyphony. This is what lets it detune strings or make super dense chords. Limiting it to 15 notes is indeed limiting.

So I came up with another compromise that I call MIDI 192. Like MPE, it channelizes notes to get the pitch bends that apply to it. Unlike MPE, it cannot play an arbitrary microtonal pitch perfectly. MIDI 192 lets you set up a subset of the 16 channels and assigns each channel to a degree of an equal division of a semitone for each of the number of channels it uses. The subset is so it can exclude some channels that don't care much about pitch anyway, like channel 10, used often for percussion. Ths is done by tapping the appropriate channel buttons in the routing controller.

Like MPE, you have to use a polyphonic, multitimbral, non OMNI channeled MIDI synthesizer as teh destination. These are a little hard to come by, but BS-16 (Bismarck) works well.

When using all 16 channels, instead of 12 notes per octave, you get 192 notes per octave (whence the name). This means that for an arbitrary tuning, you are within 100/16 cents of the real pitch, 6.25 cents, and actually because it rounds it, its more like 3.125 cents or better. While not perfect, it's pretty good, and has no polyphony limit other than what the synth can handle. And for some equal temperaments that are multiples of 12, like 24, 72, 96 , it IS perfect, at least in theory. Just overtones perform pretty well up to a point (11/8 and 13/8 are pretty close to quartertones). Basically, it'll try to squeeze whichever tuning you use into 192ED2.

On the downside, intriguing PolyHarp effects like clusters of very close intervals on multi-string courses are not going to work. Also since it depends on all its used channels setting up the same program and otehr properties, the channel assignment for multiple String Areas is not going to work. MPE could handle some of those issues, but not withthe amount of polyphony that PolyHarp craves.

Every channel that's used gets a pitch bend sent to it when the MIDI 192 system is chosen. This amount is based on how much a "real" pitch bend, from the wheel, should bend. I'm using 6 semitones. There's some tweaking that goes on when a real pitch bend is sent - it adds the preset bend to the new bend and transmits it to all affected channels. Because of the polyphony, you can't bend individual notes though.

These settings, like the MIDI Routing, are currently not saved with I may add MPE in a later version, though.



PolyHarp uses:

  • Audiobus By Michael Tyson & Sebastian Dittmann http://audiob.us
  • The Amazing Audio Engine by A Tasty Pixel
  • MIDIBus 1.35 by Nic Grant
  • JSONModel by Marin Todorov, http://www.touch-code-magazine.com
PolyHarp is by the author of the highly praised synthicity itself, SrutiBox, Droneo, Tondo, Wind Chimes, Enumero, Minute, Yes Session, Banshee, and LakePiano .

• Questions? Write to PolyHarp "at" jhhl.net, or go to the contact page
• Read about my iPhone development in this blog

© 2017 Henry Lowengard

AudioBus © 2012-2017 Audiobus. Thanks, Sebastian and Michael!

jhhl's iPhone Apps
Main jhhl.net website
© 2016 Henry Lowengard.