A free, open-source, keyboard-focused digital audio workstation (DAW). Written in C, using SDL (https://libsdl.org/).
- Disclaimer
- Compatibility
- Dependencies
- Installation
- Keyboard command shorthand
- Quickstart (getting comfortable)
- User manual
- Command reference
Jackdaw is a work in progress and has not been officially "released." What's available here is surprisingly powerful, fun to use, and can definitely be used to make music, but I do not guarantee that everything will work perfectly or as expected.
Jackdaw collects no data and does not connect to the internet. Session logs are stored in temporary files on disk, but these are not visible to anyone unless you choose to share them.
In case this matters to you: AI has for the most part not been used to make Jackdaw. I would estimate that about 200 lines of code, out of ~67k total (0.3%) were substantially generated by AI.
Jackdaw is compatible with macOS and Linux.
Jackdaw currently depends on POSIX system APIs for threading and synchronization, directory navigation, timing, and inter-process communication.
Jackdaw depends on the following libraries:
- SDL2 for:
- graphics and window management
- event handling
- audio I/O
- misc other platform abstractions
- SDL2_ttf for text rendering
- PortMidi for MIDI I/O
Each dependency is included as a submodule.
Currently, the only way to install Jackdaw is to build it from the source code.
The 'standard' way to do this is to run the following commands:
$ git clone --recurse-submodules https://github.com/chvolow24/jackdaw.git
$ cd jackdaw
$ make(If you already cloned an earlier version of the jackdaw repo, you will need to run git submodule update --init --recursive to pull in the new submodules, and make clean before running make).
make will create static builds of each of the (included) dependencies, and will construct the jackdaw binary in the root directory of the project. The dependencies are built locally (i.e., nothing will be installed on your system).
If make executes successfully, you can open Jackdaw with
$ ./jackdawmake clean cleans all of Jackdaw's build objects, but leaves the dependencies in place.
make cleanall cleans all of the dependency build objects as well.
make debug builds a debug version of Jackdaw.
PortMidi uses CMake for its build process, and SDL and SDL_ttf use GNU Autotools, so both are required for make to execute successfully. For its part, Jackdaw just uses GNU Make.
If you have SDL2 and SDL2_ttf installed on your system already and would prefer to link to the system installs, you can do so:
$ make USE_EXTERNAL_SDLS=1Make will use pkg-config to locate the appropriate files and link to those instead of building them from the source code included in the submodules. You do not need to clone the SDL submodules if you build this way, but the PortMidi submodule is still required.
The USE_EXTERNAL_SDLS=1 setting does not persist, so you will need to include that flag every time you re-run make.
Although the mouse can be used for almost everything, Jackdaw is built around keyboard commands. Here are some examples of keyboard commands you'll see written in the application and in this documentation:
n......................................press the 'n' key
p......................................press the 'p' key
C-s...................................hold down 'command' OR 'ctrl', and press the 's' key
A-t....................................hold down 'alt' OR 'option' and press the 't' key
C-S-o.................................hold down 'command' OR 'ctrl', AND 'shift', and press the 'o' key
S-<ret>..............................hold down 'shift' and press the 'return' or 'enter' key
When a hyphen is present (as in C-s) it means you need to hold down one or more modifier key before striking the final key to invoke the command.
Capital C stands for the "Command" OR "Control" key. Jackdaw does not distinguish between these two keys.
Capital S stands for the "Shift" key.
Capital A stands for the "Alt" or "Option" key. (Again, no distinction is made)
Capital K indicates that you must hold down the 'K' key, which is used as a modifier in very specific circumstances.
So, C-S-o means hold down the control (or command) key and the shift key, and then press 'o'.
Most of the final keys are named by a letter or number, except for these:
<ret> means 'return' or 'enter'
<tab> means 'tab'
<spc> is the spacebar
<del> is the 'delete' or 'backspace' key (no distinction)
<up>, <down>, <left>, and <right> are the arrow keys
This will all be familiar to emacs users, and hopefully not too painful for everyone else.
This section is a brief tutorial meant to familiarize you with the most basic and frequently-used operations in jackdaw. From there, you can reference the user manual to learn about the other things you can do in the program.
When you open a fresh Jackdaw session, one track is created automatically. The track input will be set to the default system audio input device, but you can change the current track input if you like with C-S-i (ctrl-shift-i or cmd-shift-i). A list of available input devices will appear. Use n (for 'next') to go to the next item in the list, and p (for 'previous') to go to the previous. (These keys will be used a lot). Hit <ret> to choose the currently-highlighted device.
Tip
n and p are used globally for "next" and "previous", or "down" and "up". The f and d keys are mapped to all the same commands, and can be used instead if you prefer them.
Once you have selected an appropriate audio input device, you can start recording audio into jackdaw with r. After making some noise at your computer or microphone, stop recording with r.
You should now see a clip on your timeline, with an audio waveform representing the audio you just recorded. You can rewind over the clip, pause, and play it back with the j (rewind) k (pause) and l (play) keys.
If you tap l or j multiple times, the playback speed will double.
These are jackdaw's most important key commands!
Let's add a track or two. Let's also assume that you don't know the keyboard command to do so.
Hit the slash key (/) to open the command lookup. Start typing "add track", and you should see the list of available commands narrow. Hit <tab> to move down the list, and S-<tab> to move up.
You'll notice that the keyboard shortcuts for each command are listed on the right. Note that Add track is bound to C-t.
For now, select that line and hit <ret> (or "Enter") to invoke the command and add a track.
Now that you know the keyboard command, try that instead.
(Hold down cmd or ctrl and hit t).
You can again use the n and p keys to move the track selector up and down. Try rewinding back to the beginning of the recording you made (j to rewind, k to pause), selecting a different track, and recording some new audio.
Now that you've created some multi-track audio, you might want to export it to a wav file to show your friends.
First you'll need to place "in" and "out" marks on your timeline with i and o, which will place the mark at the current playhead position. You'll need to play/rewind/pause a bit (jkl! jkl!) to get the playhead positioned correctly to set the marks. To get more precise placement, you can hold down k-j to rewind slow or k-l to play slow. Once you have placed 'in' and 'out' marks such that some portion of the timeline is visibly marked, you can export to a wav file with S-w.
You will be prompted to type a file name. Hit tab or <ret> to apply the current name, and move down to the directory navigation pane. Then, use n and p to navigate through the filesystem to the directory where you want to save the file. Subdirectories are displayed in green. The double dots ("..") will bring you up one directory. Finally, use <tab> to move down to the "Save" button, and then <ret> to save the file with the current name, in the currently open directory. (Or, use C-<ret> to "submit the form" and save the file.)
If you want to revisit this project later, you can save a project file (.jdaw) with C-s.
You will be prompted to enter a project name (which must include the .jdaw extension), and can then hit <ret> or <tab> to move down to the directory navigation pane. Navigate to the location at which you want to save the project (with n and p), and submit the form with <tab> and then <ret>to complete saving.
- Command lookup
- Menus
- Timeline navigation and playback
- Recording
- Tracks
- Clips
- Click tracks
- Source mode
- Project navigation / multiple timelines
- Opening and saving files
- Track effects
- Automation
- MIDI
- Undo / redo
- Special audio inputs
- API
Jackdaw's user interface is built around keyboard commands, but you don't need to memorize them. Hit the slash key (/) to open an autocomplete dropdown list of available commands. You can start typing one or more keywords to see a list of matching commands. Use <tab> to navigate down through the list, S-<tab> to navigate up, <ret> to select an item, and <esc> to escape without selecting an item.
Each entry in the list includes the display name of the command on the left, and the bound keyboard command on the right. (See "Keyboard command shorthand" above if these confuse you.)
You can also summon a menu with a list of available actions organized by category with C-m or C-h ("m" for menu, "h" for help). Navigate with n, p to move the selection up or down, and j and l to move left and right between columns. Then use <ret> to select. Use m (or h or <esc>) to dismiss the menu.
You can also summon the menu by clicking on the "hamburger" in the upper-right corner of the window.
Timeline navigation commands are all within easy reach of your right hand:
j : rewind (multiple taps to rewind fast)
k : pause
l : play (multiple taps to play fast)
You can use the mousewheel or trackpad to achieve finer control over playback.
Note
These actions work best on trackpads with multi-finger touch detection, like those on macbooks.
S-<scroll horizontal> : scrub (fine)
C-S-<scroll horizontal> : scrub (coarse)
A-S-<scroll horizontal> : scrub (finer)
S-<scroll vertical> : adjust speed (fine)
C-S-<scroll vertical> : adjust speed (coarse)
A-S-<scroll vertical> : adjust speed (finer)
h : move view left
; : move view right
, : zoom out
. : zoom in
C-<scroll> : zoom in or out
These zoom commands will center on the current playhead position. Using the mousewheel/trackpad to zoom will center the zoom on the current mouse position.
[ : move playhead left
] : move playhead right
S-] : move playhead left (slow)
S-[ : move playhead right (slow)
Press and hold these commands to move the playhead around without playing back audio. The amount moved is relative to the window width, not a fixed time amount (unlike playback/rewind).
The track selector is how you indicate which track you are doing things to. The track console (left side) is highlighted in orange if the track is currently selected.
n : move selector down (next track)
p : move selector up (previous track)
The "cursor" (as in "[do thing] at cursor") is the location on the currently selected track under the current playhead position. So, "grab clip at cursor" means "grab the top clip on the currently selected track that intersects with the current playhead position."
Keystrokes that move the track selector or move the playhead can therefore also be thought of as ways to move the cursor:
n or f : cursor down
p or d : cursor up
j : cursor left
l : cursor right
The cursor concept is critical to how you interact with Jackdaw.
"In" and "out" marks can be set to mark a range on the current timeline. They also be used as handy jump-to points.
You can also jump to the start of the timeline (t=00:00:00000) with S-u, which is helpful if you get lost.
i : mark in
o : mark out
S-i : jump to in mark
S-o : jump to out mark
S-u : jump to t=0
S-j : jump to start of clip at point
S-l : jump to end of clip at point
When you move the track selector with n and p, the timeline will automatically refocus such that the selected track is visible. You can also scroll through tracks with a mouse or trackpad. Scrolling horizontally translates the timeline in the manner of h and ;.
Holding Cmd or Ctrl and scrolling on the timeline will zoom in or out.
You can play back a marked section of the timelines (see section above) in a loop by enabling loop playback.
C-8 : Enable / disable loop playback
Future versions of jackdaw will include more sophisticated looping mechanisms.
r : start or stop recording
When you hit r, audio recording will begin on all activated tracks, or, if no tracks are activated, on the currently selected track. Clips are created on each of these tracks beginning at the current playhead position. When you stop recording, these clips will be populated with the audio data you just recorded.
You can record from multiple audio devices at once, simply by setting different inputs on different tracks, activating each of those tracks, and hitting r.
Jackdaw tracks are flexible: they can accept mono or stereo audio clips, or MIDI clips. A Track is just a Track.
C-t : add a track
C-<del> : delete the currently selected track
Activating tracks (as opposed to merely selecting them) is a way to do things certain things to multiple tracks at once. Here are things you can do to multiple tracks at once:
- mute / solo
- adjust volume
- adjust pan
- record audio
- grab clips
<ret> : Activate or deactivate the currently-selected track
` : Activate or deactivate all tracks
Muted tracks will not be read during playback, or when exporting a .wav file.
If any track on the timeline is soloed, only tracks that have been soloed will be read. The S button will be red on any un-soloed tracks to indicate that they are effectively muted.
m : Mute currently selected track (or active tracks)
s : Solo currently selected track (or active tracks)
Track volume can be attenuated or boosted. Stereo tracks can be panned to the left or right. The pan implementation is fairly primitive; panning to either side will simply attenuate the opposite channel by an amount proportional to the pan amount.
Tip
These key combinations can be held down for continuous adjustment.
S-- : Volume down (selected or active tracks)
S-= : Volume up (selected or active tracks)
S-9 : Pan left (selected or active tracks)
S-0 : Pan right (selected or active tracks)
(Note that the pan adjustment keystrokes are the left and right parens.)
The track input can be set to any of the available system audio devices (e.g. built-in laptop microphone, external microphone), "Jackdaw out," which uses Jackdaw's audio output as an audio input (for what is sometimes confusingly called "resampling"), Pure data (experimental; described below) a connected MIDI device, or the QWERTY piano emulator.
C-S-i : Set track input
If you hold down shift while moving the track selector up or down, the selected track will move with you.
S-n : Move selected track down
S-p : Move selected track up
- : Minimize / expand selected track(s)
You can rename the selected track with C-r, or cmd/ctrl + click the track name label box.
C-r : Rename selected track
Renaming a track or other object will put the program into "text edit mode", in which most keystrokes are read as text input rather than as keycommands. Use <ret> to complete your edit and "escape" text edit mode.
There are some very limited additional text editing commands that can be used while a text field is being edited:
<ret>, <tab>, <esc> : Escape text edit mode (complete edit)
<del> : Backspace
<right>, C-f : Move cursor to the right
<left>, C-d, C-b : Move cursor to the left
C-a : Highlight all text
C-<del> : Delete the currently-selected track
A clip is a chunk of audio or MIDI data represented on the timeline.
In general, this document and the application itself refer to the rectangles on the timeline that contain audio data as "clips."
The audio data itself does live in a object called a Clip, but the information mapping that audio data to a position on the timeline is an object called a "clip reference", type ClipRef.
A clip can have many clip reference. The audio data associated with the clip is not duplicated; therefore, when copying clips or portions of clips using Source Mode, you are not actually copying any audio data; you are merely creating additional references to the clip.
The blue or green color of any given clip reference on the timeline is not particularly meaningful in this version of jackdaw (0.4) and can be safely ignored.
Clips that have been "grabbed" can be deleted or moved around on the timeline.
g : Grab clips at cursor(s)
Using this command will grab any clips that intersect the playhead position on the currently selected track OR all active tracks. If all intersecting clips are already grabbed, the command will un-grab all clips.
A clip can also be "grabbed" with C-<click>.
C-k : Toggle drag clips
If clip dragging is enabled, the clips will gently flash, and an indication will appear in the status bar at the bottom of the screen indicating how many clips are currently grabbed.
Moving the track selector will pull all currently-dragging clips along with it.
In addition to grabbing and moving clips themselves, you can also grab and move clip edges.
The keyboard commands use g (which is bound to Grab clip at cursor) as a modifier key, and j and l for "left" and "right", respectively (analogous to j = rewind and l = play).
So to grab the left edge, position the cursor over the clip and do g-j. To grab the right edge, g-l. If dragging is active (C-k), moving the playhead will also move the grabbed edges.
Arrows are displayed when there's "room" on either side of the clip, i.e. there's audio data beyond the current window.
You can cut a clip and automatically grab both edges of the cut to move the cut position with g-c (Cut clip at cursor and grab edges):
Audio from overlapping clips on the same track is simply added; i.e. audio from both clips will be played.
If you need to grab or otherwise alter a clip that is buried under an overlapping clip, you can bring it to the "front" with S-z
S-z : Bring rear clip at cursor to front
S-c : Cut clips at cursor
This will cut any clips on the currently selected track at the current playhead position in two, so that you can independently move or otherwise modify each part.
C-S-r : Rename clip at cursor
See "Editing text" for more on text edit mode.
You can add click tracks to your project to create a "grid."
C-S-t : Add click track
Click tracks fundamentally comprise a series of one or more segments, each of which can have its own tempo and time signature. A lot of music will only require a single click track and single time signature, but jackdaw allows you to create many click tracks, each of which can have many segments.
S-t : Edit click track
Edit the click track and segment at cursor with S-t, or by clicking the pencil icon on the left of the track.
Then, <tab> through the fields to modify any of the track parameters and "Submit" to confirm your changes to the time signature and tempo. (Changes to the track name do not need to be submitted.
Jackdaw doesn't use conventional time signatures because they're confusing and limited. Instead, you specify first the number of "beats" (coarse divisions of a measure) and then the number of subdivisions in each of those beats. So a 4/4 time signature, which has 4 beats, could be defined as 4 + 4 + 4 + 4, or 2 + 2 + 2 + 2. 6/8 typically has two beats, and would be defined as 3 + 3.
It is therefore very easy to define additive meters, like the Bulgarian Gankino horo (4 + 3 + 4):
If you need to change tempo or time signature partway through a song, you can do so by adding new click track segments.
To do so, cut the click track with S-c. (Note that this is the same command you would use to cut a clip, but if a click track is selected, it will cut the click track instead.
Now, you can modify each of the segments individually. When editing a segment, you can specify whether you want the end position to remain fixed, or the number of measures. If the number of measures is fixed, the end position of the segment may move, and all the segments to the right will move with it.
You can click and drag the boundaries between click track segments to reposition them, and you can delete a segment with <del>
While dragging, the segment boundary will automatically snap to the previous segment's subdivisions. Hold <shift> to disable the snapping.
Click tracks can be moved up and down on the timeline exactly like audio tracks: with S-n and S-p.
All of the audio tracks directly below a given click track are governed by that click track. In the current version of jackdaw (v0.5.0) this is only relevant when using the following navigation commands:
C-j : Go to previous beat
C-l : Go to next beat
C-S-j : Go to previous subdivision
C-S-k : Go to next subdivision
A-S-j : Go to previous measure
A-S-k : Go to next measure
You can "freeze" a click track at the top of the timeline view, and it will remain fixed there regardless of how you scroll. You do this simply by moving (S-p) the click track "all the way up":
(Note that the frozen click track covers over the timecode view.)
You "unfreeze" the click track by selecting it (repeat p or d until you're "all the way up") and moving it down (S-n):
Each click track has a metronome which is on by default. You can mute the click track exactly as you would an audio track (select the track and then m, and adjust the volume of the metronome exactly as you would adjust the volume of an audio track (S-- and S-=).
You can also lightly customize the metronome by setting which sound plays on each of the following:
- measure boundaries
- beat boundaries
- even beats (2 & 4 in 4/4) only
- subdivisions (e.g. eighths)
These options can be found in the second tab of the click track settings tab view (select a click track (n and p) and then S-t to open the tabview, and S-l to tab right).
You can quickly set the tempo of the click segment at cursor with t
You can also Ctrl- or Cmd- click the click track segment and drag it to set the tempo.
Changing the tempo of click track segment moves clips, notes, and automation keyframes for all tracks using that click track.
If you want to edit a click track without moving these objects, you can first move the click track to the bottom of the timeline, or temporarily insert another click track below the one you wish to edit, "blocking" it. I recognize this may not be ideal, and may refine the feature later.
Jackdaw provides an interface for extracting samples from an audio clip, and dropping references to those samples in your timeline.
C-1 : Load clip at cursor to source
If there is a clip at cursor, this command will load that clip to the source area near the top of the window.
S-1 : Activate or deactivate source mode
In source, you can play back, scrub through, and set marks in the clip that has been loaded into the source area. The controls -- including zooming in and out, or moving the display window -- are identical as in timeline mode.
The marks you set in source mode will determine which portion of the clip is dropped into your timeline when you:
b : Drop clip from source
This creates a new clip reference on your timeline, at the current playhead position, on the currently-selected track.
Every time you drop a clip into a timeline from the source area, jackdaw will save information about that drop. If you then drop something else into your timeline (either a different clip or the same clip with different marks) with b, you will be able to once again drop the previously-dropped clip with v. Another new drop will move the clip stored at v to c, so that you have unique clips that you can drop into your timeline with any of those three keys. Etc. for subsequent drops and x and z.
b : Drop clip from source
v : Drop previous clip (-1) from source
c : Drop previous clip (-2) from source
x : Drop previous clip (-3) from source
z : Drop previous clip (-4) from source
Jackdaw provides a way to use multiple workspaces in a single project. Each of these is a "timeline," which is just a collection of tracks with associated clips.
A-t : Create new timeline
A-l : Go to next timeline
A-j : Go to previous timeline
A- : Delete current timeline
When creating a new timeline, you will be prompted to enter a name. Type the name, hit <tab> or <ret> to move to the "Create" button, and then <ret> again to complete naming the timeline.
Jackdaw knows how to open .wav, .jdaw (project), .jsynth (synth preset), and .mid (MIDI) files. You can open files in one of three ways:
- with C-o (
Open file) - drag-and-drop a file onto the Jackdaw window
- on the command line
C-o : Open a file
If a .wav file is opened, it will be loaded as a clip to the currently-selected track, starting at the current playhead position. If a .jdaw file is opened, the current project will be closed and replaced with the project saved in the .jdaw file (this action cannot be undone, so be careful). Synth presets (.jsynth) are loaded to the currently-selected track's synth (this action can be undone).
To open a file on the command line, simply pass the filepath to the program:
$ jackdaw PATH_TO_FILEA .jdaw file stores a jackdaw project, including all of its timelines, tracks, clips, effects, automations, etc.
C-s : Save project as
You will be prompted first to edit the current project file name. The file extension must be .jdaw or .JDAW; the program will encourage you to fix this if you make a mistake. Hit <tab> or <ret> to finish editing the name. Now, the directory navigation pane will be active, and you can use n, p, and <ret> to navigate through the filesystem to the directory where you would like to save the file. When satisfied, type <tab> and then <ret> (or just C-<ret> to save.)
The .jdaw file format is described in the jdaw_filespec directory.
Up to 16 effects can be added to a given track.
S-e : Add effect to track
S-t : Open track effects
The effects are displayed in a "tab view." The order in which the effects are processed is determined by the order of the tabs.
You can navigate the tab view with the mouse or with the keyboard:
<tab> : Cycle through page elements
S-<tab> : Cycle through page elements in reverse
h : Nudge slider left
; : Nudge slider right
<ret> : Select / toggle / cycle current element
You can also navigate to other tabs:
S-j : Tab left
S-l : Tab right
And reorder the tabs:
C-S-j : Move current tab left
C-S-l : Move current tab right
You can also click the tabs, and click and drag to reorder them.
To remove an effect, simply hit del or backspace while the effect is selected in the tab view. Associated automation tracks will be removed as well, and will be reinstated if the deletion is undone.
The EQ effect contains 6 configurable filters. Each can be set to one of the following types:
- Low-shelf / Highpass
- Peak / Notch
- High-shelf / Lowpass
The leftmost filter is low-shelf by default, the rightmost is high-shelf, and the others are peak/notch. Any given filter can be changed to any type by clicking the symbols representing the filter types.
The filter frequencies and amplitudes are modified by clicking and dragging the nodes on the spectral display:
The bandwidth of a peak-notch filter can be adjusted by holding down cmd or ctrl and dragging the mouse up or down.
Each filter is a biquad infinite impulse response (IIR) filter. The low-shelf/high-shelf filters are based on the continuous-time Butterworth filter, and the peak/notch filters are implemented based on Joshua D. Reiss, "Design of Audio Parametric Equalizer Filters Directly in the Digital Domain", IEEE TRANSACTIONS ON AUDIO, SPEECH, AND LANGUAGE PROCESSING, VOL. 19, NO. 6, AUGUST 2011.
The FIR ("finite impulse response") filter is an FFT-based "windowed-sinc" filter. It can be configured to have a low-pass, high-pass, band-pass, or band-cut frequency response. The cutoff frequency and bandwidth are adjustable parameters, as is the length of the impulse response. This last parameter affects the "steepness" of the frequency response curve.
Note
This is a computationally expensive effect.
The frequency response of the filter is shown. When the filter is active, and playback is occurring, the frequency domain of the filtered audio track is also shown.
The delay line has three parameters: time, amplitude, and "stereo offset." The delay time is the amount of time between echoes, and the amplitude is the relative amplitude of each successive echo. "Stereo offset" delays playback of the delay line buffer in the left channel by some proportion of the delay line length, expressed as a value between 0.0 and 1.0. In other words, with a nonzero stereo offset, you will hear echoes at different times in the left and right channels.
The saturation effect does simple sample-wise wave shaping. There are two types available: the common tanh function, and and exponential function that behaves similarly. Though often indistinguishable, the exponential function produces more high-frequency content than tanh, which is a noticeable difference when the input signal is low-passed.
The gain parameter simply adjust the gain of the input signal (resulting in more wave shaping), and gain compensation will attenuate the output to more closely approximate the input. The symmetry parameter can be adjusted to get brighter-sounding distortion.
An active saturation effect with zero gain placed at the end of a track's effect chain is a good way to prevent digital clipping.
A standard digital peak-sensing compressor. Details of dynamic range compression are not discussed here.
In the visualization, the x position of the blue dot represents the current amplitude envelope value, and the y position represents the corresponding output amplitude (before make-up gain is applied). The color gradient reflects the amount of gain reduction currently applied by the compressor.
Mix automation is available for the track volume and pan, as well as most parameters related to any effects currently applied to the track, and all synth parameters (if a synth has been opened on the track).
C-a : Add automation to track
a : Show / hide track automations
(Note that n and p (or f and d) can be used to cycle through the radio button options, and <tab> and S-<tab> can be used to move between the selector and the "add" button. The mouse is available but optional.)
Use C-<click> to add a keyframe to an automation track. You can then drag the keyframe to the desired position. If you release cmd/ctrl and hold shift, the keyframe will will snap to the same vertical position as the previous keyframe, creating a flat segment. If you hold cmd or ctrl AND shift, the keyframe will snap to the position immediately after the previous keyframe, creating a near-vertical segment.
While an automation is in "write" mode, any changes to the automated parameter will be recorded on the automation track during playback. Any existing keyframes intersecting with the newly-written portion will be overwritten.
The easiest way to accomplish this is to "record" on the automation track exactly as you would on an audio track: navigate the cursor to the automation track with n and p (or f and d) and hit r to start recording. Hit r again to stop.
r : Start / stop recording automation (when automation track selected)
When an automation track is selected, you can delete a range of keyframes by marking (with i and o) a section of the timeline and hitting del.
del : Delete keyframes in->out (when automation track selected)
So far, the MIDI functionality in Jackdaw can only be used to control the builtin synthesizer. But it'll do more in the future, and the builtin synth is more powerful than you might expect. With the QWERTY piano emulator, you can start making your own sounds in Jackdaw immediately, without an external device.
Tracks in Jackdaw are not "audio tracks" or "MIDI tracks" -- they are just Tracks. You can record MIDI data onto a track exactly like you would record audio: first, select one of the MIDI devices from list of available inputs (C-S-i, or click the track input box); then, hit r to start recording. A pink MIDI clip will appear on the track, and any notes you play on the MIDI device will be recorded to that clip. Hit r again to stop recording.
Each Track has its own synth, and MIDI is played back through the synth by default. The synth is opened with S-s.
(There's a Track set MIDI out command, which could be used for other instruments or external devices in the future; for now it's useless.)
Jackdaw's synthesizer has four "base oscillators" with selectable waveform types (sine, triangle, square, saw). Each of the base oscillators can be replicated in up to 7 unison voices, which can be detuned and spread across the stereo field. The base oscillators can be tuned (octave, coarse, and fine tuning) individually, or set to a fixed frequency.
By default, the four base oscillators are added together. However, you can also set one oscillator to modulate the frequency or amplitude of another. Modulation can be used to create new timbres or, when the modulator is set to a low frequency, to create vibrato (frequency) or tremolo (amplitude). When a given base oscillator is being modulated by another, the appropriate Is carrier red status light will be lit.
By default, the phase of all oscillators (i.e. all of the base oscillators and their unison voices) will be reset when a new note is triggered. You can turn this off by unchecking the Sync phase toggle. In general, not syncing phase is preferable for more heterogenous sounds, like orchestral strings. It introduces an element of chaos into the sound, and is often undesirable for things like bass instruments, where phase differences can unexpectedly and dramatically mute or amplify a sound.
The synth uses a conventional ADSR envelope. The Ramp exponent parameter sets an exponent value for each ramp; as that value increases past 1.0, the shape of the decay and release ramps change gradually from something that looks like "\" to something that looks closer to "L". In other words, a ramp exponent of 1.0 gives a linear decay, 2.0 gives quadratic decay, etc.
White noise can be introduced into the sound and controlled by its own amplitude envelope. Even if the noise envelope is enabled, the noise sound still passes through the main amplitude envelope and the filter.
The filter is a one-pole resonant lowpass Chebyshev filter. The Base cutoff parameter sets a lower bound for the filter cutoff frequency. The Key tracking parameter adds a multiple of the current note frequency to the base cutoff. Velocity tracking attenuates (brings down) the cutoff frequency when the note has less-than-full velocity, more so for higher values of the parameter. (So, bring this slider all the way up if you want maximum expressivity). Env amount adds to the cutoff frequency an amount that changes dynamically with the filter's envelope.
The filter cutoff tracks the amplitude envelope by default, but can be given its own ADSR shape when Use amp env is unchecked. The effect is most obvious when the amp envelope has a short attack, and the filter envelope is given a longer attack, producing a "wah" sound.
When effects are added directly to the synth (instead of to its parent Track), they are heard even when the synth is being monitored directly, i.e., while you are playing. Delay lines and saturation sound excellent on a synth.
The effects can be re-ordered, deleted, and undeleted exactly like track effects. They are included when a synth preset is saved. Unlike track effects, you can't apply automation to synth effect parameters.
The synth can be used polyphonically with up to 24 voices (the default), or in mono mode. When voice-stealing is enabled, the oldest (longest-held) voice is stolen first.
Portamento applies to pitch and velocity in mono mode, but also polyphonically when the special Poly portamento mode is enabled.
Enable voice sliding in a polyphonic context by:
- Enabling
Poly portamento mode(make sureMono modeis off), and - Reducing the number of voices.
When a voice is stolen (and only then), the stolen voice slides to the destination note instead of being silenced.
Poly portamento mode implements heuristic voice-leading, so the rules for voice stealing are slightly different. When a new note occurs and all available voices are in use, those that have been released (finger no longer on key, but note amp envelope still in release) are checked first, and the nearest one in terms of pitch is used. If all of the voices in use are still being held, then the nearest one of those is used.
Synth settings can be saved in a preset file, which has the .jsynth file extension. You can open a preset in two ways:
- With C-o (standard
Open file) - By opening the synth with S-s, navigating to the
Presetstab, and selectingOpen preset
When you open a new preset, it will override all of the current synth settings -- but you can undo and redo this action, so nothing will be lost.
You can save the current preset by navigating to the Presets tab and selecting Save preset as...
Jackdaw provides the QWERTY piano emulator as a way for you to play the synth or otherwise record MIDI without an external MIDI controller. You can activate it with the Activate QWERTY piano command, which is bound to S-q. Deactivate with the same (S-q) or with <esc>.
If you want to record MIDI data using the QWERTY piano, set the track input accordingly, and then hit r to record. You cannot stop recording with r like usual (it is too easy to do this accidentally), but escaping with S-q or <esc> does the job.
The piano roll view can be used to edit or create new MIDI clips.
To enter the view, use Edit clip at cursor / open piano roll, which is bound to C-S-e. If the cursor is over a MIDI clip, that clip is opened in the piano roll; otherwise, a new clip is created.
The piano roll controls are designed to be analogous or identical to timeline controls. Notes in the piano roll view are analogous to clips in the timeline view.
All of these are exactly the same as in the timeline view: j, k, l for rewind/pause/play, , and . to zoom, h and ; to move the view left and right, [ and ] to move the playhead (without playback), etc.
If there is a grid enabled (a click track is positioned somewhere above the current track), then all of the bars/beats navigation commands work the same as well: C-j and C-l to go to the previous/next beat, C-S-j and C-S-l to go the the previous/next subdivision, and A-S-j and A-S-l to move to the previous/next measure.
In timeline view, S-j and S-l move the cursor to the previous/next clip boundary; in piano roll view, these commands (Go to previous note, Go to next note) move the cursor to the previous/next note boundary.
Tip
It is usually much faster to insert notes with a MIDI device, including the builtin QWERTY piano emulator).
The "note selector" can be moved up and down with n and p (or d and f) just like the track selector.
Hit <ret> to insert a note at the current position. You will hear the note played back (at an arbitrary short duration) through the track's synth.
Hit <spc> to insert a rest.
If you make a mistake, hit <del> (or the backspace key) to "undo" it.
The duration of the next note (or rest) to be inserted is adjusted with 1 and 2; velocity with c and v.
By default, the cursor (playhead) jumps the right edge of the inserted note. You can prevent this by enabling "chord mode" (S-h). Disabling chord mode then moves the cursor forward to the end of the chord (or the shortest note in the chord, if they have different durations).
"Tie mode" extends the last-inserted note instead of inserting a new one, provided that the playhead is still positioned at the of the last note, and the new insertion is on the same actual note (pitch) or notes (chord). So you can achieve, e.g., a dotted quarter by setting an eighth note duration, enabling tie mode, and hitting <ret> three times.
(The only time you would not want tie mode is enabled is if you want to restrike notes immediately upon release.)
When the track input is set to a connected MIDI device OR when the QWERTY piano emulator is active, notes can be inserted simply by striking the keys of the device. Velocity and pitch are determined by the note you play, not by the piano roll input controls. Chords are detected (keystrokes occur within ~60ms of one another) and inserted as such.
Duration is still set with 1 and 2, and rests are still inserted with <spc>. <del> (backspace) is the same.
"Tie mode" works exactly the same. (So does "Chord mode," though I can think of no reason to use it here.)
Notes can be grabbed, moved, truncated, and extended exactly like clips. That means all of the edge grabbing behavior described above for clips applies here as well.
You can also grab notes with the mouse by Cmd- or Ctrl- clicking the screen and dragging a box around the notes:
In the piano roll view, or timeline view with a MIDI clip under the cursor, use Quantize notes (clip at cursor) -- A-q -- to quantize the notes. You can set an Amount; an amount of 1.0 places the affected notes exactly on the gridlines (fully quantized), whereas an amount <1.0 will simply move them closer to those gridlines. This can serve as a quick and dirty way to clean up a performance without making it sound completely robotic. When Quantize note offs is unchecked, each note retains its original duration.
When notes have been quantized, their original positions will be shown by an empty grey box in the piano roll view.
You can adjust the quantization amount after the notes have been quantized with Adjust quantize amount, A-S-q. This will only apply to notes that have already been quantized.
Note
If you move a note or clip after it has been quantized, and then adjust the quantization amount without re-quantizing, information about the note or clip move will be lost. Adjusting the quantize amount always refers back to the position the notes were in when they were originally quantized.
You can use the physical controllers (knobs, sliders) on your MIDI controller to control synth parameters. With the synth tabview open, simply select a slider (<tab> to move the selection forward, S-<tab> to move back, or just click the slider), and then turn the knob on your keyboard. This will automatically bind that physical controller to that slider in Jackdaw.
If you want to un-bind the controller, you can do so by holding down the Alt or Option key (A-)and turning the physical knob again.
This is a brand new feature and has not been thoroughly tested.
Note
This feature is a bit of a mess and has not been thoroughly tested. Use with caution.
Jackdaw can read MIDI files (.mid or .midi).
You can open a MIDI file exactly like you would a .wav or .jdaw file (C-o, on the command line at start time, or drag-and-drop). If the number of tracks in the file exceeds what you have on your timeline, Jackdaw will ask if you want to add more tracks.
LilyPond is a fantastic music engraving software and markup language. Jackdaw can parse a very limited (and slightly altered) subset of the language as a way to create new MIDI clips, called JLily.
JLily uses relative mode by default, with middle C as the starting reference pitch.
This feature actually has a short video demo.
Supported syntax:
- note names
e.g. "c g g a g"
- duration
e.g. "c4 g8 g a g"
- dotted duration
e.g. "c4 g8. g16 a4 g"
- accidentals
e.g. "c4 g8. g16 aes4 g"
- rests
e.g. "c4 g8. g16 aes4 g r b c"
- octave indicators
e.g. "c4 g8. g16 aes4 g r b c c,"
- repeats
e.g. "\repeat 4 { c16, c' }"
(repeat ^ times)
- nested repeats
e.g. "\repeat 16 { \repeat 4 {c, c'} \repeat 4 {g, g'} }"
- set velocity (JLILY ONLY, not standard lilypond)
e.g. "\velocity 100 c c e g \velocity 90 g e c"
Jackdaw retains a 100-event long history of user events. Generally, any changes to the project state -- those that would affect the saved .jdaw file -- can be undone. Actions that only affect the superficial state of the program cannot.
Objects that you delete will not be permanently deleted until the program is closed or the deletion event drops off the end of the event history.
Jackdaw undo is linear. That means that if you undo some number of changes, and then make a new change, you will lose the ability to redo those previously-undone events.
C-z : undo
C-y / C-S-z : redo
Jackdaw will have access to all of the audio devices (speakers, microphones, etc.) that your system knows about. In addition, there are two special audio inputs that you can use to record audio onto a track.
Jackdaw is capable of using its own audio output as an audio input. This makes it very easy to create mixdowns on-the-go, or to record some of the fun sounds you can make by scrubbing through your timeline and dynamically adjusting the playback speed.
Note
This is an experimental feature and is not yet reliable.
Pure data (often "Pd") is a graphical audio programming environment developed by Miller Puckette. It is very similar to Max, which was also developed by Puckette, but unlike Max, is free to download and use. Pure data can be used to create things like synthesizers and drum machines, as well as sound production programs that are too unusual to be designated as such.
Pd also provides a method for writing your own objects (called "externals") for use in the program. Jackdaw is capable of communicating with (and receiving audio from) Pd by means of an external called pd_jackdaw~. This external needs to be built and loaded into Pd.
I have provided the source code for pd_jackdaw~ here (pd_jackdaw/pd_jackdaw.c), but have not yet provided the means to build it or load it into Pd. If you are so inclined, you may figure out how to do this using pd-lib-builder.
The pd_jackdaw~ objects inlets are for the left and right channels of audio. If jackdaw is open and a pd_jackdaw~ object is created, the two programs will do a handshake (exchange a series of signals) before setting up a block of shared memory, which they use to exchange audio data. If DSP is enabled in Pd and a track input is set to "Pure data" in jackdaw, you should be able to record audio directly from Pd just as you would from a microphone.
Note
This is an experimental feature and will be developed further in future versions of jackdaw.
Jackdaw can run a UDP server to allow external programs (pure data, for instance, or your own programs) to modify project parameters like the volume on a given track, or a filter effect's cutoff frequency.
C-S-p : Start API server
You will be prompted to select a port number. If the port is in use or otherwise invalid, an error message will appear at the bottom-right part of the screen. If there is no error, you can assume that the server is currently running on the selected port.
Requests must be ASCII strings that follow the general format:
<route> <value>
The <route> parameter describes a path to the desired parameter. Global parameters like the playback speed are identified at the top level, i.e. /play_speed. Parameters related to tracks must be routed through the timeline, then the track, each by name, and finally the name of the parameter.
So if you want to access the volume parameter on a track called "Synth" on a timeline called "Main" (the default), the route would be:
/main/synth/vol
Note that uppercase characters in the names are lowered. Non-alphanumeric characters are replaced with an underscore.
Here are some example requests:
/main/track_1/pan 0.2
--> set pan on track 1 to 0.2 (0.0 == L, 1.0 = R)
/scratch_pad/kick/fir_filter/freq 0.2
--> on the "scratch pad" timeline, set the "kick" track filter cutoff freq to 2% of nyquist (range 0.0 -> 1.0)
/main/lead_synth/delay/len 600
--> set the delay line effect time to 600ms
The currently-available endpoints are, generically:
/play_speed
/<timeline name>/<track name>/vol
/<timeline name>/<track name>/pan
/<timeline name>/<track name>/<effect name>/[<effect substructure>/]<effect parameter name>
You can print a list of available routes to the console with the api_print_all_routes command (accessible via menus or function lookup).
Example output (truncated):
/play_speed
/output_vol
/main/track_1/vol
/main/track_1/pan
/main/track_1/effects/equalizer/active
/main/track_1/effects/equalizer/filter_1/freq_and_amp
/main/track_1/effects/equalizer/filter_1/freq
/main/track_1/effects/equalizer/filter_1/amp
/main/track_1/effects/equalizer/filter_1/bandwidth_preferred
/main/track_1/effects/equalizer/filter_2/freq_and_amp
[...]
/main/track_1/synth/vol
/main/track_1/synth/pan
/main/track_1/synth/sync_phase
/main/track_1/synth/num_voices
/main/track_1/synth/allow_voice_stealing
/main/track_1/synth/poly_portamento_mode
/main/track_1/synth/mono_mode
/main/track_1/synth/portamento_len_msec
/main/track_1/synth/amp_envelope/attack
/main/track_1/synth/amp_envelope/decay
/main/track_1/synth/amp_envelope/sustain
/main/track_1/synth/amp_envelope/release
/main/track_1/synth/amp_envelope/ramp_exponent
/main/track_1/synth/filter/filter_active
/main/track_1/synth/filter/base_cutoff
/main/track_1/synth/filter/pitch_amt
/main/track_1/synth/filter/vel_amt
/main/track_1/synth/filter/env_amt
/main/track_1/synth/filter/resonance
/main/track_1/synth/filter/use_amp_env
/main/track_1/synth/filter/filter_envelope/attack
/main/track_1/synth/filter/filter_envelope/decay
/main/track_1/synth/filter/filter_envelope/sustain
/main/track_1/synth/filter/filter_envelope/release
/main/track_1/synth/filter/filter_envelope/ramp_exponent
/main/track_1/synth/noise/noise_amt
/main/track_1/synth/noise/noise_apply_env
/main/track_1/synth/noise/noise_envelope/attack
/main/track_1/synth/noise/noise_envelope/decay
/main/track_1/synth/noise/noise_envelope/sustain
/main/track_1/synth/noise/noise_envelope/release
/main/track_1/synth/noise/noise_envelope/ramp_exponent
/main/track_1/synth/osc_1/active
/main/track_1/synth/osc_1/type
/main/track_1/synth/osc_1/vol
/main/track_1/synth/osc_1/pan
/main/track_1/synth/osc_1/fix_freq
/main/track_1/synth/osc_1/fixed_freq
/main/track_1/synth/osc_1/octave
/main/track_1/synth/osc_1/tune_coarse
/main/track_1/synth/osc_1/tune_fine
/main/track_1/synth/osc_1/unison_num_voices
/main/track_1/synth/osc_1/unison_detune_cents
/main/track_1/synth/osc_1/unison_relative_amp
/main/track_1/synth/osc_1/unison_stereo_spread
/main/track_1/synth/osc_1/fmod_target
/main/track_1/synth/osc_1/amod_target
/main/track_1/synth/osc_2/active
[...]
/main/track_1/synth/effects/delay/len
/main/track_1/synth/effects/delay/amp
/main/track_1/synth/effects/delay/stereo_offset
/main/track_1/synth/effects/delay/active
/main/track_1/synth/effects/delay/len
/main/track_1/synth/effects/delay/amp
/main/track_1/synth/effects/delay/stereo_offset
/main/track_1/synth/effects/delay/active
/main/track_1/effects/equalizer/active
/main/track_1/effects/equalizer/filter_1/freq_and_amp
/main/track_1/effects/equalizer/filter_1/freq
/main/track_1/effects/equalizer/filter_1/amp
/main/track_1/effects/equalizer/filter_1/bandwidth_preferred
/main/track_1/effects/equalizer/filter_2/freq_and_amp
[...]
Most applications for the API will involve sending UDP messages over localhost, but messages can also be sent over a network.
- Summon menu : C-m, C-h
- Escape : <esc>
- Quit : C-q
- Undo : C-z, C-/
- Redo : C-y, C-S-z
- Show output spectrum :
- Save Project : C-s
- Open file (.wav or .jdaw) : C-o
- Start API server : C-S-p
- Command lookup : /
- Chaotic user test (debug only) : A-S-<del>
- Toggle tranpsort performance logging (debug only) :
- Print all API routes :
- Dump exec logs to stderr :
- Disable synth parallelism :
- Enable synth parallelism :
- Next item : n, <tab>, f
- Previous item : p, S-<tab>, d
- Next section : C-n, C-f, C-<up>
- Previous section : C-p, C-d, C-<down>
- Choose item : <ret>, k
- Column right : l
- Column left : j
- Move menu up : <up>
- Move menu down : <down>
- Move menu right : <right>
- Move menu left : <left>
- go back (dismiss) : <del>, m, h, <esc>, g
- Play : l, e
- Pause : k, w
- Rewind : j, q
- Play/pause : <spc>
- Play slow : k-l
- Rewind slow : k-j
- Halve playspeed : A-k
- Move playhead left : [
- Move playhead right : ]
- Move playhead left (slow) : S-[
- Move playhead right (slow) : S-]
- Nudge play position left (500 samples) : <left>
- Nudge play position right (500 samples) : <right>
- Nudge play position left (100 samples) : S-<left>
- Nudge play position right (100 samples) : S-<right>
- Move one sample left : C-S-<left>
- Move one sample right : C-S-<right>
- Record (start or stop) : r
- Previous track (move selector up) : p, <up>, d
- Next track (move selector down) : n, <down>, f
- Toggle automation read : S-r
- Move selected track down : S-n, S-f, S-<down>
- Move selected track up : S-p, S-d, S-<up>
- Minimize selected track(s) : -
- Move view right : ;
- Move view left : h
- Zoom out : ,
- Zoom in : .
- Lock view to playhead : S-</kbd>
- Set In : i
- Set Out : o
- Go to In : S-i
- Go to Out : S-o
- Go to t=0 : S-u
- Go to previous clip boundary : S-j
- Go to next clip boundary : S-l
- Go to next beat : C-l
- Go to previous beat : C-j
- Go to next subdiv : C-S-l
- Go to previous subdiv : C-S-j
- Go to next measure : A-S-l
- Go to previous measure : A-S-j
- Bring rear clip at cursor to front : S-z
- Toggle loop playback : C-8
- Set default audio output : C-S-o
- Add Track : C-t
- Activate/deactivate selected track : <ret>
- Activate/deactivate all tracks : `
- Delete selected track or automation : C-<del>
- Activate track 1 : 1
- Activate track 2 : 2
- Activate track 3 : 3
- Activate track 4 : 4
- Activate track 5 : 5
- Activate track 6 : 6
- Activate track 7 : 7
- Activate track 8 : 8
- Activate track 9 : 9
- Add click track : C-S-t
- Set tempo at cursor : t
- Add effect to track : S-e
- Open track effects (or click track settings) : S-t
- Open synth : S-s
- Mute or unmute selected track(s) : m
- Solo or unsolo selected track(s) : s
- Track volume up : S-=
- Track volume down : S--
- Track pan left : S-9
- Track pan right : S-0
- Rename selected track : C-r
- Set track input : C-S-i
- Show or hide all track automations : a
- Add automation to track : C-a
- Grab clip at cursor : g
- Grab left edge of clips : g-j
- Grab right edge of clips : g-l
- Ungrab clip edge : g-k
- Grab clips in marked range : S-g
- Grab left edge of clips in marked range : S-g-j
- Grab right edge of clips in marked range : S-g-l
- Copy grabbed clips : C-c
- Paste grabbed clips : C-v
- Start or stop dragging clips : C-k, S-k
- Cut at cursor (clip or click track) : S-c
- Cut clip at cursor and grab edges : g-c
- Split stereo clip at cursor to mono :
- Rename clip at cursor : C-S-r
- Delete : <del>
- Edit clip at cursor / open piano roll : C-S-e
- Quantize notes (clip at cursor) : A-q
- Adjust quantize amount : A-S-q
- Load clip at cursor to source : C-1
- Activate Source Mode : S-1
- Drop clip from source : b
- Drop previously dropped clip (1) : v
- Drop previously dropped clip (2) : c
- Drop previously dropped clip (3) : x
- Drop previously dropped clip (4) : z
- Add new timeline : A-t
- Previous timeline : A-j
- Next timeline : A-l
- Delete timeline : A-<del>
- Write mixdown to .wav file : C-e, S-w
- Set track MIDI out : C-S-m
- Activate QWERTY piano : S-q
- Insert Jlily (LilyPond) notes :
- Play (source) : l
- Pause (source) : k, S-k
- Rewind (source) : j
- Play slow (source) : S-l, k-l
- Rewind slow (source : S-j, k-j
- Set In Mark (source) : i, S-i
- Set Out Mark (source) : o, S-o
- Zoom in (source) : .
- Zoom out (source) : ,
- Move left (source) : h
- Move right (source) : ;
- Go to next item : n, f, <down>
- Go to previous item : p, d, <up>
- Go to next item (escape DirNav) : <tab>, S-n, S-f, S-<down>
- Go to previous item (escape DirNav) : S-<tab>, S-p, S-d, S-<up>
- Select item : <ret>
- Modal left (nudge slider) : h
- Modal right (nudge slider) : ;
- Dismiss modal window : m, g, <esc>, <del>, C-<del>, S-<del>
- Submit form : C-<ret>
- Escape text edit : <ret>, <tab>, S-<tab>
- Escape text edit : <esc>
- Backspace : <del>
- Move cursor right : <right>, C-f
- Move cursor left : <left>, C-d, C-b
- Select all : C-a
- Next element : S-n, S-<down>, S-f, <tab>
- Previous element : S-p, S-<up>, S-d, S-<tab>
- Select : <ret>
- Move left : h
- Move right : ;
- Next tab : S-l, S-;
- Previous tab : S-j, S-h
- Move current tab left : C-S-j, C-S-h
- Move current tab right : C-S-l, C-S-;
- Close tab view : <esc>, C-<del>, S-<del>
- Next item : <tab>, <down>, C-n
- Previous item : S-<tab>, <up>, C-p
- Select item : <ret>
- Escape autocomplete list : <esc>, /, C-<del>, S-<del>
- Escape MIDI QWERTY : <esc>, S-q
- Octave up : x
- Octave down : z
- Transpose up : .
- Transpose down : ,
- Velocity up : v
- Velocity down : c
- midi qwerty c1 : a
- midi qwerty cis1 : w
- midi qwerty d1 : s
- midi qwerty dis : e
- midi qwerty e : d
- midi qwerty f : f
- midi qwerty fis : t
- midi qwerty g : g
- midi qwerty gis : y
- midi qwerty a : h
- midi qwerty ais : u
- midi qwerty b : j
- midi qwerty c2 : k
- midi qwerty cis2 : o
- midi qwerty d2 : l
- midi qwerty dis2 : p
- midi qwerty e2 : ;
- midi qwerty f2 : '
- Escape / exit piano roll : <esc>, C-S-e
- Zoom in (piano roll) : .
- Zoom out (piano roll) : ,
- Move view left (piano roll) : h
- Move view right (piano roll) : ;
- Note selector down : n, f
- Note selector up : p, d
- Note selector down octave : C-n, C-f
- Note selector up octave : C-p, C-d
- Velocity down : c
- Velocity down : v
- Move forward by current dur : <right>
- Move back by current dur : <left>
- Go to next note boundary : S-l
- Go to previous note boundary : S-j
- Go to next note up : S-p, S-d
- Go to next note down : S-n, S-f
- Longer note duration : <down>, 1
- Shorter note duration : <up>, 2
- Insert note at current position : <ret>
- Insert rest at current position : <spc>
- Grab/ungrab notes : g
- Grab left edge of note : g-j
- Grab right edge of note : g-l
- Grab notes in marked range : S-g
- Backspace / delete grabbed notes : <del>, C-<del>
- Play grabbed notes : S-<spc>
- Toggle tie mode : S-t
- Toggle chord mode : S-h
- Quantize notes : A-q
- Adjust quantize amount : A-S-q
...
[ LAST UPDATED 2026-02-18 WEDNESDAY ]
...




































