j h h l . n e t |
jhhl.net's other iOS apps
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.
PolyHarp uses AudioBus 3 and can save its configurations there. It can also integrate with AudioBus3's MIDI support.
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.
You can read about LYR and other old Amiga software of mine using this link.
PolyHarp's main features are:
USING THESE INSTRUCTIONS:
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:
When you start up PolyHarp, it tries to reload the last PolyHarp patch that you were working with.
POLYHARP PATCH DIALOG
Loading and saving PolyHarp patches is done via this dialog.
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.
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:
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.
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.
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.
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.
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.
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.
How the modulatation is applied:
Each modulation links the source of modulation to a destination, mapped with a scaled curve. You can pick what kind of curve it is,
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:
CHORD BUTTONS AND BARS
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.
This lets you set these Chord Button properties:
Chord Button Shape and color
String Area Assignment
Setting the Transposition Interval
The Tone Spiral is a pretty simple one, it lets you set guides to snap to. The choices are:
Arranging Chord Buttons
Once the chord button dialog is done (tap outside it), you can arrange the positions of the buttons.
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
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.
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.
This edit mode screen labels all the String Areas and their corners. It also labels all the Chord Buttons.
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).
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:
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.
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.
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.
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.
These are merely guides, you get to choose intervals out of them to make your own chord types.
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.
INTERVAL USE IN POLYHARP
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:
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.
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.
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!
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.
Effective date: October22, 2018
PolyHarp collects no personal data. It requests not personal data and does not store personal data or send any such data to any website or other external location.
• 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!
© 2016 Henry Lowengard.