The latest version of Polymeter adds an optional Target pane in the Modulations bar. This new pane also supports editing of the targets, to a limited extent. The table below shows which types of editing the Target pane supports.
Edit | Supported |
---|---|
Change type or target | Yes |
Insert | No |
Insert Group | Yes |
Delete | Yes |
Cut/Copy/Paste | No |
Sort | No |
Drag Reorder | No |
Astute readers will notice that Delete is supported, but not Insert. This is most unusual and deserves some explanation. Also, Insert Group is supported, but not Insert. What is so special about Insert?... read more
The latest version of Polymeter adds a long-overdue feature: the Modulations bar now optionally shows targets as well as sources. This can be very useful for complex modulation networks. Until now, the only way to see the modulation targets of a track was via the Graph bar, with the graph’s Scope set to Targets or Bidirectional. The Graph bar requires installing Graphviz, so users who didn’t do that had no way of viewing modulation targets at all. But even if they did have Graphviz installed, the Modulations bar is easier to use, and it’s also the obvious place to look for this information.... read more
A new version of the Polymeter MIDI Sequencer (1.0.14) is now available, and it introduces some new features that I’m excited about and making extensive use of. Basically it adds a new track type, called “Internal” and along with that, four “internal controllers.” One result is that sustain and sostenuto can now be handled within the sequencer, instead of delegating them to the output device via MIDI control change messages.... read more
Version 1.0.12 of Polymeter is released today. One big change is that in the track view, the step duration (AKA Quant) can now be entered as a fraction, instead of in ticks. An option was also added to display quants as fractions, and show a drop-down list of common quants during editing. The quant fractions are visible in the screenshot below. Please download the new version here:
... read more
Milkii Brewster on GitHub asks "Linux version? Plugin version? Possibly maybe in the future?" and here's my answer:
The Polymeter source currently consists of 47,100 lines of C++ code. Of that, 80% is UI. How do I know that? To facilitate automated testing, I created a command line version of Polymeter, which can open and play a .PLM (Polymeter) document, and optionally export it to a standard MIDI file. After all of the UI is eliminated, 9,447 lines of code remain, and if you were planning to port the project, that would be the right place to start. The UI code is so dependent on MFC (Microsoft Foundation Classes) that it would almost certainly be easier to throw it away and start from scratch.... read more
Version 1.0.4 features a couple of cool enhancements to the Phase bar, both accessible via its context menu. The first is that the phase diagram can now indicate convergences slightly before and after they occur. The participating orbits are increasingly highlighted as the convergence approaches, and gradually return to normal as the convergence recedes. This is useful because the planets often move fast enough that it can be hard to tell when they’re lined up. Also the planets can appear lined up when they’re actually not, unlike the convergence indicator which is foolproof. And, because the highlighting changes both the width and the color of each orbit in proportion to its proximity to convergence, it’s very satisfying to watch. The second feature is that the Phase bar can now go full screen, without caption bar or borders, which is similarly visually pleasing. See this demo video.
Version 0.0.31 of Polymeter introduces a new feature called Offset modulation. This new modulation type allows a track's time offset to be changed by another track. This is useful for making the track periodically slow down and then catch up again, which helps emulate the feel of a live performer. Offset modulation is customizable per track, unlike tempo modulation which is global and affects all tracks the same. An offset modulator track's step values are interpreted as unsigned delays from 0 to 127 MIDI ticks. Note that by default this scheme only allows events to be delayed, not made earlier. To make events earlier, set the target track's Offset parameter to a negative value, e.g. -64, which is roughly an eighth note using the default time division of 120 PPQ. Because offset modulation is added to the track offset, this shifts the offset modulation range to -64 to +63 ticks, so that the target track's events can be made up to an eighth note early or late. For offset modulation to work properly you may need to set the "Note Overlaps" Master property to "Prevent."... read more
There's an updated version, 0.0.30.001, which will process complex modulation setups significantly faster, due to some sorely-needed optimizations in the sequencer core. If you occasionally get the error "Sequencer Callback took too long" this version may help. Basically the sequencer was doing three dumb things:
1. Muted tracks were processing their modulators, pointlessly.
2. Modulator tracks were processing their modulators, pointlessly.
3. If a mute modulator evaluated true, the track's remaining modulators were evaluated, pointlessly.
All three of these were wasting precious time in the callback thread for no good reason. Large projects often develop subtle flaws like this, due to iterative design over long periods of time. Periodic performance checks and code reviews are a must.... read more
Polymeter 0.0.30 optionally transmits MIDI clock, allowing you to synchronize your DAW or hardware sequencer with Polymeter. This was by far the most-requested new feature. The Start, Continue, Stop and Song Position messages are also sent as usual. Note that this feature must be enabled, via Options/Send MIDI Clock.
MIDI clock is old school, but it’s widely supported and works pretty well. There are some limitations, all involving the starting position. 1) Playback must start on a sixteenth note boundary; if you try to start from a position that isn’t evenly divisible by a sixteenth note, you’ll get a warning message and your starting position will be quantized to the nearest sixteenth note. 2) Playback can’t start from a negative position; this is MIDI’s limitation, not mine! 3) Similarly, playback can’t start from a position later than 16,383 sixteenth notes; again, not my fault. And 4) once playback is started, skipping forward or backward in the sequence will cause loss of synchronization; that’s because the MIDI clock specification doesn’t support position change during playback, alas.... read more
Polymeter 0.0.29 introduces a major new feature called Chord Modulation, explained below. There are many other additions and improvements, including the ability to remotely control each individual step of a track. The release notes are here.
A scale is a subset of the chromatic scale. Each scale tone is a note, expressed as an offset in semitones relative to some base note. Assuming a base note of C, zero is C, one is Db, two is D, three is Eb, and so forth.... read more
Re the issue with not being able to dock Piano and MIDI bars to a tabbed pane: I looked into that some more. It's a non-trivial issue with pros and cons that need consideration. But the short form is this: Currently, keeping many of the bars in tabbed panes may make the UI sluggish. This is especially true of the Step Values bar!
When a bar is docked to a tabbed pane, Windows considers it "visible" even if it's not the active tab, in which case it's not actually visible to the user. In my current implementation, such "visible but inactive" bars receive document updates (affecting performance), though they don't get "painted".... read more
Polymeter 0.0.28 adds two major new features: mapping, and scales. It also allows step values to be edited numerically, as opposed to by dragging bars in the Velocities pane.
Mapping
The mapping feature supports both translation and mapping to parameters. An input MIDI message can be translated to any other MIDI message, and/or mapped to any track parameter except track name.
An input MIDI message can have multiple mappings, i.e. it can be translated to multiple messages, or mapped to multiple track parameters, or to the same parameter in multiple tracks, or any combination of these. The reverse is also true: different input MIDI messages can be translated to the same output message, or mapped to the same track parameter.... read more
When writing in polymeter it’s useful to conceptualize rhythm patterns in terms of their density. In order to clarify this, let’s examine some simple patterns. To keep it simple, we’ll assume that each pattern step is either 0 (off) or 1 (on). We’ll ignore velocity variation, and also ignore duration variation (tied notes) and triplets. We’ll also ignore completely empty patterns (silence). The simplest useful example is the two step patterns, of which there would appear to be three: 01, 10, and 11.... read more
Polymeter 0.0.27 greatly increases the maximum track length, and adds new features such as recording of MIDI input and a convergence calculator.
A track can now have up to millions of steps, depending on its Quant. This was achieved by completely replacing the default profile read/write implementation. This upgrade also made reading and writing the document much faster, with the difference being most noticeable for very long tracks.... read more
The first polymeter workshop was held at Arkaoda in Berlin January 29, 2020. My presentation was about two hours long and you can view the slides and download the demo files. There will probably be other workshops soon, and they will be announced in the Polymeter Facebook group.... read more
At the end of this post is a demo file that demonstrates Polymeter's new tempo modulation feature. Tempo tracks are a bit tricky and need to be properly documented (like the entire application!) but for now hopefully this will help.
To create a tempo track, just change a track's Type to "Tempo". Set the track's steps to whatever shape you want the tempo change to have. Also set the Duration to some non-zero value, e.g. try 100. For tempo tracks, Duration is reused as the tempo change percentage. If you set it to 100, the tempo will vary from half-time (for a step value of -64), to double time (for a step value of +63). If you set Duration to 50, the range will be half as much. Tempo is logarithmic, much like frequency. The actual formula is:... read more
Today's issue is overlapping notes, by which I mean two or more overlapping instances of the same MIDI note on the same MIDI channel. The typical behavior is, when one the overlapped notes ends, it cuts off the other instances, even though they still have more duration to go. This causes unexpected rests (gaps) in the audio.
Some synths (e.g.Yamaha) do the right thing: they keep a reference count for each note on each channel, and only release a note when its reference count transitions to zero. But many hardware and software synths (including Reason) don't do this, so one can't count on it.... read more
Polymeter 0.0.23 introduces graphing, to help you visualize your modulations. The heavy lifting of generating the graph is done by Graphviz, an excellent free software that's used in many projects including Doxygen. The scope of the graph can be one of these:
Scope | Description |
---|---|
All | Show all modulations regardless of track selection |
Selected | Show direct modulators of selected tracks |
Recursive | Show direct and indirect modulators of selected tracks |
Bidirectional | Show direct and indirect modulators and modulatees of selected tracks... read more |
Polymeter 0.0.21 adds two dynamic visualizations that can help you grasp what you're hearing: a MIDI output bar that shows the output MIDI events as text, with filtering options, and a piano bar that displays the output notes on a piano keyboard, also with filtering. Both of these visualizations were proposed in a previous post.
The main issue with implementing visualizations is a multithreaded design problem, which stems from the fact that the sequencer runs in a different thread from the rest of the application (the sequencer callback thread). In order to safely transfer data from one thread to another, serialization is required, but the goal is to minimize the likelihood of the sequencer callback thread ever being blocked by the user interface thread. The most appropriate and performant architecture for this situation is a buffer swapping scheme. In order to reduce time spent in the critical section to the absolute minimum, only pointers to the buffers are exchanged, rather than the buffers themselves. Fortunately the dynamic array class already supports swapping buffer pointers with another array instance. The result is the best of both worlds: zero-copy exchange between a pair of growable arrays.... read more
Writing in polymeter can be very complicated. Often it's hard to visualize how all the patterns and modulators are interacting with each other to create the music. It might help if the software including more and better visualizations. Here's a list of visualization ideas I'm thinking about.
The core problem is that our ears are amazingly good at integrating multidimensional information in real time, whereas our eyes, not so much. People can comprehend a complex piece of music even at a fast tempo, but if that same piece is modeled visually it just looks like a blur. That's partly because vision processing is relatively slow compared to hearing, but mostly because the brain evolved to handle the demands of language and thus can easily process pitches, rhythm, and timbre all once in real time.... read more
Version 0.0.17 of Polymeter introduces a powerful new feature called recursive modulation, also known as modulation of modulation, or N-order modulation. For example, suppose you have a note track, and want its note to be modulated differently at different times. You could create two different modulator tracks, both modulating the note, and alternate between them by manually muting and unmuting them. But what if you want to automate the alternation? Now you can, by creating a mute modulator for each of your note modulators. If the two mute modulators have opposite step patterns, the result is that the two note modulators alternate, just as if you were alternating them by hand.... read more
Version 0.0.11 adds functionality to the Live view, including per-part progress bars. The purpose of the bars is to indicate your current position within each part. This is problematic because a part can (and often does) consist of multiple tracks, each of which may have a different loop length. A progress bar requires a single length, so it shows the current position in the part's longest track. It's simple and consistent and much better than flying blind.... read more
Polymeter 0.0.09 adds a live performance view, along with the ability to group tracks into parts, in order to simplify the interface. With this addition, the port is mostly complete. All of the three separate DOS programs that comprised the original software are now combined into a single Windows application: Bongo became Track view, Stencil became Song view, and Jock became Live view.
Polymeter 0.0.09 also adds inter-track modulation, an essential feature that allows a track in one meter to mute and unmute one or more tracks in other meters. Unlike the original software, which only supported mute modulation, the new sofware also supports note, velocity, and duration modulation. In note modulation, one track offsets another track's note values; velocity and duration modulation work similarly.... read more
Polymeter 0.0.07 is a major release, and introduces song view, which lets you arrange your tracks on a conventional timeline. The idea is that you can "paint" with your polymeter loops, and be confident that regardless of how they're dubbed in and out, their phase relationships will always be preserved; in other words, your tracks stay synchronized through all your transitions, just as if they had been playing continuously from the start of the song. And what a difference that makes!... read more
To get special results you need special tools, and the more sophisticated the tools, the more sophisticated the result can be. Most people are using technology to do things that humans can already do, just much faster. I'm interested in things that computers can do, that I can't do easily or at all, that let me extend my creativity into areas that I couldn't otherwise access or even fully visualize. It's not unlike building a bathysphere to visit the ocean depths. What's down there? How can we be sure if we can't get there?... read more