NAMA(1p)
๐ NAMA(1p) โ the manual page, but make it cute
NAMA(1p) ยท User Contributed Perl Documentation ยท NAMA(1p)
โจ NAME โจ
Nama โ it's a multitrack recorder and a digital audio workstation, bestie. That's the whole vibe. ๐ง
๐ธ SYNOPSIS ๐ธ
nama [options] [project-name]
๐ฆ DESCRIPTION ๐ฆ
Okay so Nama is a multitrack audio application for recording, effects processing, editing, mixing, mastering and live performance. And not just that, it can also do general-purpose audio processing, like 5.1 to stereo conversion. ๐ Nama uses Ecasound as the audio processing engine, which is lowkey the whole motor of the operation.
๐ Audio projects
Projects in Nama are audio networks of tracks and buses. Tracks may contain one or more RIFF (.wav) files, plus effects, sends, inserts, marks, regions, fades, edits and sequences. Like, tracks are the main character and they contain multitudes. โจ
Tracks can host LADSPA, LV2 and Ecasound plugins. Audio regions may be altered, duplicated, time-shifted or replaced โ glow up, region bestie. ๐ฆ
Audio processing happens in realtime when a track is played, and it may be cached (frozen) to a new audio file. โจ
Project data is serialized as JSON. The complete history is tracked by the git version control system. So yeah, projects can be managed using branches and tags, and they provide undo/redo. Periodt. ๐
Nama supports some MIDI functionality via midish. ๐
๐ Presets and templates
To facilitate reuse, a track's plugins and inserts can be stored as an effect chain. Effect profiles apply effect chains to groups of tracks. Project templates are for duplicating an entire project sans audio files. Reuse is the moment, no cap. ๐ซถ
๐ง Audio device
Nama performs Audio IO via JACK or ALSA. Soundcard IO goes via JACK, if running, with transparent fallback to ALSA. It's giving "I got you either way". ๐
Nama supports Ladish Level 1 session handling.
๐ User interfaces
Nama has a fully featured terminal command prompt, a Tk GUI, and experimental OSC and remote-command modes.
The command prompt can run Nama commands, Ecasound interactive-mode commands, commands for the midish MIDI recorder/player, shell commands and perl code. Commands and filenames can be autocompleted using the TAB key. Command history is available to browse with up and down arrows. ๐
The help system provides documentation and keyword search covering Nama commands and effects-processing plugins. It's the friend who actually read the syllabus. ๐โจ
๐ OPTIONS ๐
--gui,-gโ Start Nama in GUI mode (default when Tk is available)--text,-tโ Start Nama in text mode--config,-fโ Specify configuration file (default:~/.namarc)--project-root,-dโ Specify project root directory--use-pwd,-pโ Use current dir for all WAV and project files--create-project,-cโ Create project if it doesn't exist--net-eci,-nโ Use Ecasound's Net-ECI interface--libecasoundc,-lโ Use Ecasound's libecasoundc interface--save-alsa,-aโ Save/restore alsa state with project data--help,-hโ This help display--regenerate-effects-cache,-rโ Regenerate the effects data cache
๐ Debugging options ๐
--no-state,-Mโ Don't load project state--no-static-effects-data,-Sโ Don't load effects data--no-static-effects-cache,-Cโ Don't load the effects data cache--no-reconfigure-engine,-Rโ Don't autosave, autoreconfigure or git snapshot--fake-jack,-Jโ Simulate JACK environment--fake-alsa,-Aโ Simulate ALSA environment--no-ecasound,-Eโ Don't spawn Ecasound process--execute-command,-Xโ Supply a command to execute--no-terminal,-Tโ Don't initialize terminal--no-fades,-Fโ No fades on transport start/stop--log,-Lโ Log these (comma separated) categories
๐ฅ CONTROLLING NAMA/ECASOUND ๐ฅ
The Ecasound audio engine is configured through use of chain setups that define the signal processing network. Think of it like the friend group chat but for audio signals. ๐ซถ
Nama serves as an intermediary, taking high-level user commands, generating chain setups for user tasks such as recording, playback, mixing, etc., and running the audio engine. She's the middleman AND the moment. ๐
โจ Configuration Commands โจ
Configuration commands affect future runs of the audio engine. For example, rec, play, mon and off determine whether the current track will get its audio stream from an external (e.g. live) source, whether an existing audio file will be played back, and whether a new audio file will be recorded. Nama responds to these commands by reconfiguring the engine and displaying the updated track status. See man ::ChainSetup for details on how the chain setup created.
โญ Realtime Commands โญ
Once a chain setup is loaded and the engine is launched, commands can be issued to control the realtime behavior of the audio processing engine. These commands include transport "start" and "stop", playback head repositioning commands such "forward", "rewind" and "setpos". Effects may be added, modified or removed while the engine is running. Live tweaking, we love to see it. ๐๏ธโจ
๐ธ Configuration ๐ธ
General configuration of sound devices and program options is performed by editing the .namarc file, which is formatted as YAML. On Nama's first run, a default version of .namarc is placed in the user's home directory. She sets herself up, iconic behavior honestly. ๐
๐ Tk GRAPHICAL UI ๐
Invoked by default if Tk is installed, this interface provides a subset of Nama's functionality on two windows:
๐ Main Window
The top section has buttons for creating, loading and saving projects, adding tracks, adding effects to tracks. In short, for setup.
Below are buttons for controlling the transport (start, stop and friends) and for setting marks. ๐ฏ
The GUI project name bar and time display change color to indicate whether the upcoming operation will include live recording (red), mixdown (yellow) or playback (green). Bestie is literally color-coding your life for you. ๐
๐ Effects Window
The effects window provides sliders for each effect parameter of each track. Parameter range, defaults, and log/linear scaling hints are automatically detected. Text-entry widgets are used to enter parameters values for plugins without hinted ranges. Any parameter label can be clicked to add a parameter controller. Clicking things to make things happen = main character energy. โจ
๐ Waveform Window
Provides a conventional view with waveform and playback head. Classic. Iconic. No notes. ๐
๐ฅ๏ธ Terminal Window
The command prompt is available the terminal window and provides access to all of Nama's functions. All of them. The full menu. ๐
๐ฆ TEXT USER INTERFACE ๐ฆ
Press the Enter key if necessary to get the command prompt, which will look something like this:
"nama untitled sax ('h' for help)>"
In this instance, 'sax' is the current track in the 'untitled' default project. ๐
When using buses, the bus is indicated before the track:
"nama untitled Strings/violin ('h' for help)>"
At the prompt, you can enter Nama and Ecasound commands, Perl code preceded by "eval" or shell code preceded by "!".
Multiple commands on a single line are allowed if delimited by semicolons. Usually the lines are split on semicolons and the parts are executed sequentially, however if the line begins with "eval" or "!" the entire line (up to double semicolons ';;' if present) will be given to the corresponding interpreter. Yeah it's a whole thing, but it slaps. โจ
You can access command history using up-arrow/down-arrow. โฌ๏ธโฌ๏ธ
Type "help" for general help, "help command" for help with "command", "help foo" for help with commands containing the string "foo". "help-effect foo bar" lists all plugins/presets/controller containing both foo and bar. Tab-completion is provided for Nama commands, Ecasound-iam commands, plugin/preset/controller names, and project names. ๐
Most commands have abbreviations, such as 'afx' for 'add-effect'. These are shown in the help listings. ๐
๐ TRACKS ๐
okay so every single track in Nama has two things going on: a cute descriptive name (like vocal, bestie) and an integer track-number that gets assigned the moment the track is born. New user tracks? They start out hanging with the Main bus, no cap. ๐ธ
Track output signals are usually mixed and then they pass through the Main track on their way to the soundcard for monitoring. It's giving main character energy, fr fr.
The following sections describe track attributes and their effects. Let's get into it. โจ
โจ Width โจ
Specifying 'mono' means the track has one input channel, which will be recorded as a mono WAV file. Mono track signals are automatically duplicated to stereo and a pan effect is provided. So you still get that stereo spread, periodt. ๐
Specifying 'stereo' for a track means that two channels of audio input will be recorded as an interleaved stereo WAV file. You can also use a 'stereo' declaration to avoid the automatic channel copy usually applied to single-channel sources. Iconic.
Specifying N channels for a track ('set width N') means N successive input channels will be recorded as an N-channel interleaved WAV file. That's the tea. ๐
๐๏ธ REC/PLAY/MON/OFF ๐๏ธ
Basic signal routing for each track is controlled by its setting to REC, MON, PLAY or OFF. Lowkey the whole vibe check right here.
- The
MONsetting prepares to connect the live track source. - The
RECsetting prepares to connect the live track source and record it to an audio file. - The
PLAYsetting enqueues an audio file for playback from disk as the track source. - The
OFFsetting tells Nama to remove the track from the audio network.OFFstatus may result for a track when no audio source is available. For example, a track with no recorded audio files will showOFFstatus when set toPLAY. Not me getting ghosted by my own audio files ๐ญ
๐๏ธ Track output ๐๏ธ
By default a track belongs to the Main bus and is routed to the Main track. This track provides a final fader before the signal goes via ALSA or JACK to the audio device. So it's the last stop before the sound leaves the building. ๐ฅ
๐ Bus setting ๐
Buses can force the status of their member tracks to OFF. Nama provides MON and OFF settings for buses. OFF (set by "bus-off") removes all member tracks from the chain setup, MON (set by "bus-mon") restores them. It's giving strict parent energy, but make it audio. ๐
The mixplay command sets the Mixdown track to PLAY and the Main bus to OFF. Periodt.
๐ข Version Numbers ๐ข
Multiple audio files ("takes") can be recorded for each track. These are distinguished by a version number that increments with each recording run, i.e. sax_1.wav, sax_2.wav, etc. All audio files recorded in the same run have the same version number. So they're all matching, like a little squad. ๐
The version numbers for track playback can be selected at the bus or track level. By setting the bus version to 5, you can play back version 5 of several tracks at once. Version 5 could signify the fifth take of a song, or the fifth song of a live recording session. Choose your own adventure, bestie. ๐
The track version setting, if present, overrides the bus version setting. Setting the track version to zero restores control of the version number to the bus. So zero is like, "I don't wanna decide, you pick." ๐
The Main bus version setting does not propagate to other buses. Sorry, no hand-me-downs. ๐
๐ Marks ๐
Marks in Nama are similar to those in other audio editing software. One limitation is that mark positions are relative to the beginning of an Ecasound chain setup. If your project involves a single track, and you will be shortening the stream by setting a region to play, set any marks you need after defining the region. Like, do the region first, then drop your marks. Order matters, iykyk. ๐
โ๏ธ Regions โ๏ธ
The "region" command allows you to define endpoints for a portion of an audio file. You can then use the "shift" command to move the region to the desired time position. Slay.
If you use named marks as endpoints, the region will change if the mark's position is adjusted. So it's lowkey reactive. ๐
Each track can have one region definition. To create multiple regions, the "new-region" command takes a pair of marks to create a read-only copy of the current track with the specified region definition. Cloning yourself? Iconic behavior. ๐ง
You can control this region as you would any other other track, shifting the start time, applying effects, adjusting volume, etc. It's a whole track, just read-only. ๐
๐ฆ Using Tracks from Other Projects ๐ฆ
The "link-track" clones a read-only track from another track, which may belong to a different project. It's giving cross-project collaboration, no cap. ๐ซถ
โจ Effects โจ
Each track gets volume and pan effects by default. New effects added using "add-effect" are applied before pan volume controls. You can position effects anywhere you choose using "insert_effect" or "position-effect". So you're the director of this whole signal chain, bestie. ๐ฌ
๐ธ Fades ๐ธ
Fades can be placed on any track. They defined by mark position and duration. An additional volume operator, -eadb, is applied to each track to host the envelope controller that implements fades. Fancy, right? ๐
๐ซ Sends and Inserts ๐ซ
The "send" command can route a track's post-fader output to a soundcard channel or JACK client in addition to the normal mixer input. Nama currently allows one aux send per track. One is enough, don't be greedy. ๐
The "add-insert" command configures a pre- or post-fader send-and-return to soundcard channels or JACK clients. Wet and dry signal paths are provided, with a default setting of 100% wet. So it's fully drenched by default, periodt. ๐ฆ
Each track can have one pre-fader and one post-fader insert. Two slots, use them wisely. ๐
๐ Bunches ๐
A bunch is just a list of track names. Using the "for" keyword with the name of a bunch will apply the commands that follow to all of the tracks in the bunch. A bunch can be created with the "new-bunch" command. A bus name can also be treated as a bunch. So like, a group chat but for tracks. ๐ฌ
๐ Buses ๐
Buses enable multiple tracks to be routed through a single mix track before feeding the Main mixer bus (or possibly, another bus.) It's giving organizational queen energy. ๐
The following commands create a bus and assign three tracks to it. The mix track takes the name of the bus and is stereo by default.
# create a bus named Strings with a same-named mix track
add-bus Strings
# create tracks for the bus
add-tracks violin cello bass
# move the tracks from the Main bus (default) to the Strings bus
for violin cello bass; move-to-bus Strings
# use the mix track to control bus output volume
Strings vol - 10
๐ Submixes ๐
Submixes are a type of bus used to provide instrument monitors, or to send the outputs from multiple user tracks to an external program such as jconverter. So they're like little side quests for your audio. ๐บ๏ธ
๐ General Notes ๐
Okay so, real talk bestie, here's the ground rules of routing:
- Nama can call out to a track by its name or its track number, but Ecasound chain setups? Those only ever use the track number. No names, no exceptions. ๐
- The Main track (that's the mixer output btw) is always chain 1. The Mixdown track is always chain 2. Those numbers are not up for debate. ๐
- Whenever Nama needs to hook two tracks together, or let one track have multiple inputs or multiple outputs, it uses Ecasound loop devices. Heads up though: every single loop device adds one buffer, and one buffer = more latency. So they stack. ๐ซ
๐ Flow Diagrams ๐
Let's actually look at the signal flow, starting from track 3, the first available user track. Pretend track 3 is named sax. ๐ท
We're splitting the flow into a track section and a mixer section. The numbers in parentheses are the chain id, iykyk.
The stereo outputs of every user track all end up at Main_in, which is a loop device sitting at the mixer input.
โจ Track, REC status โจ
Sound device --+---(3)----> Main_in
/JACK client |
+---(R3)---> sax_1.wav
REC status means the source of the signal is the soundcard or the JACK client. That input signal gets written directly to a file โ except in the special preview and doodle modes, which we'll get to. ๐
โจ Track, PLAY status โจ
sax_1.wav ------(3)----> Main_in
๐ Mixer, with mixdown enabled ๐
In this second half of the flow graph, the mixed signal gets delivered to an output device through the Main chain, which is allowed to host effects. Usually the Main track is your final say before audio output or mixdown. Main character energy fr fr. ๐
Main_in --(1)--> Main_out --+--------> Sound device
|
+-->(2)--> Mixdown_1.wav
๐ Mastering Mode ๐
In mastering mode โ which you get into with master-on and out of with master-off โ the following network receives the Main track signal as its input and hands an output to the soundcard or a WAV file:
+- Low -+
| |
Main_in --- Eq --+- Mid -+--- Boost -> soundcard/wav_out
| |
+- High +
- The Eq track hosts an equalizer.
- The Low, Mid and High tracks each apply a bandpass filter, a compressor and a spatialiser.
- The Boost track applies gain and a limiter.
These effects and all their default parameters are defined in the config file .namarc. ๐ธ
๐ Mixdown ๐
The "mixdown" command configures Nama for mixdown. What it actually does: sets the Mixdown track to REC (same as "Mixdown rec") and turns the audio monitoring output off (same as "Main off").
Mixdown proceeds after you start the transport. ๐
As a convenience, Mixdown_nn.wav will be symlinked to <project-name_nn.wav> or <branch_name_nn.wav> in the project directory. (The latter format is used for branches other than the default master branch.) Corresponding encoded files get created if the mixdown_encodings option is set in .namarc. Acceptable values are a space-separated list. The default is "mixdown_encodings: ogg mp3". ๐ง
๐ฆ Preview, Doodle and Eager Modes ๐ฆ
These non-recording modes, invoked by the "preview" and "doodle" commands, tweak the routing rules for special purposes.
- Preview mode disables recording of WAV files to disk. ๐
- Doodle mode disables PLAY inputs while excluding any tracks with the same source as a currently routed track.
- The
"arm"command releases both preview and doodle modes. ๐ซถ - The eager setting causes the engine to start immediately following a reconfiguration. โก
โจ Saving Projects โจ
If git is available, your projects are saved automatically after each command, and it is not necessary to explicitly save your work. Iconic behavior honestly. ๐
When you type "save", settings related to the state of the project are saved in the file State.json in the project directory. State.json is tracked by git. ๐
"save" updates several other data files as well:
Aux.json, also in the project directory, contains data that is part of the project (such as command history, track comments, and current operating modes) but with no direct effect on the project audio.global_effect_chains.json, in the project root directory (usually~/nama), contains system and user defined effect chains.
๐ Save without Git ๐
"save somename.json" will save project state to a file of that name. Similarly "get somename.json" will load the corresponding file. The .json suffix may be omitted if "use_git: 0" is set in .namarc.
๐ธ Save with Git ๐ธ
If git is available, Nama uses it to store snapshots of every step in the history of your project. Every single one. Timeline girlies stay winning.
When you type "save initial-mix", the latest snapshot gets tagged with the name "initial-mix", which you can recall later with the command "get initial-mix".
You can include a comment with the snapshot:
"save initial-mix "sounds good enough to send to the front office""
Nama lets you create new branches, starting at any snapshot. ๐ฟ
To start a new branch called compressed-mix starting at a snapshot called initial-mix you would say:
"new-branch compressed-mix initial-mix"
If you want to go back to working on the master branch, use "branch master".
You can also issue native git commands at the Nama prompt. Ngl that's a vibe. ๐
๐ Git history example ๐
All projects begin on the "master" branch. Because this is the default branch, it is not displayed in the prompt. Otherwise "master" is not special in any way.
In the graphs below, the letters indicate named snapshots.
create test-project
...
save a
...
save b
...
save c
---a---b---c (master)
get a
...
save d
...
save e
...
save f
d---e---f (a-branch)
/
-----a----b---c (master)
Now, you want to go back to try something different at "c":
get c
...
save g
d---e---f (a-branch)
/
----a----b---c (master)
\
g (c-branch CURRENT HEAD)
You could also go back to master, and restart from there:
get master
...
save h
...
save i
d---e---f (a-branch)
/
----a----b---c---h---i (master CURRENT HEAD)
\
g (c-branch)
Merging of branches is not supported. ๐ Like, at all. Don't try it.
๐ Exiting ๐
When you type "quit" Nama will automatically save your work to State.json. If you don't want this behavior, use Ctrl+C to exit Nama. Rude but valid.
๐ Jack ports list file ๐
Use source filename filename.ports to ask Nama to connect multiple JACK ports listed in a file filename.ports to the input port(s) of that track.
If the track is stereo, ports from the list are alternately connected to left and right channels. Left, right, left, right โ she's alternating, she's cunty. ๐
๐ง Track edits ๐ง
An edit consists of audio clips and data structures associated with a particular track and version. The edit replaces part of the original audio file, so you can fix wrong notes, or swap one phrase out for another. ๐ต
Behind the scenes, the host track becomes the mix track to a bus. Sources for the bus are the original audio track, plus zero or more edits, each one represented by a hidden track. Sneaky. ๐
Each track can host multiple edits. Edits are non-destructive; they are achieved by using Ecasound's ability to crossfade and sequence. โจ
Before creating the edit, select the track and version to be edited. You will now need to create three marks:
- play start point
- rec start point
- rec end point
The edit will replace the audio between the rec start and rec end points.
There are two ways to set these points. ๐
๐ set-edit-points command ๐
Position the playback head a few seconds before the edit. Enter the set-edit-points command. This will start the engine. Hit the P key three times to designate the playback start, punch-in and punch-out positions.
๐ Specify points individually ๐
Position the playback head at the position you want playback for the edit to start. Enter the set-play-start-mark command.
Use the same procedure to set the rec start and rec end positions using the set-rec-start-mark and set-rec-end-mark commands.
๐ Create the edit ๐
Enter the new-edit command to create the necessary tracks and data structures.
Use preview-edit to confirm the edit positions. The engine will run and you will hear the host track with the target region removed. Playback will be restricted to the edit region. You may use preview_out to hear the clip to be removed. ๐
Use list-marks to see the edit marks and modify-mark to nudge them into perfect position.
Once you are satisfied with the mark positions, you are ready to record your edit. ๐๏ธ
Enter start-edit. Playback will begin at first mark. The replacement clip will be recorded from the source specified in the original track.
Each start-edit command will record an additional version on the edit track. redo-edit will delete โ destructively โ ๏ธ โ the most recent audio clip and begin recording anew.
destroy-edit deletes โ destructively โ ๏ธ โ the current edit.
You may specify another range for editing and use the editing procedure again as many times as you like. Edits on one track may not overlap. ๐ซ
๐ Merging edits ๐
merge-edits will recursively merge all edits applied to the current track and version, creating a new version for the track. This will freeze your edits against an accidental change in mark, region or version settings. ๐
list-edits will label the edits by index and time.
end-edit-mode will restore normal playback mode.
๐ฅ REMOTE CONTROL ๐ฅ
You can send commands to Nama from a remote process, and retrieve the result.
โ ๏ธ Understand that this code opens a remote execution hole. Fr fr. Be careful who you tell about this one, bestie. ๐จ
In .namarc you need something like:
remote_control_port: 57000
Then Nama will set up a listener for remote commands. ๐
The usual return value will be a single newline.
However, if you send an 'eval' command followed by perl code, the return value will be the result of the perl code executed with a newline appended. If the result is a list, the items will be joined by spaces into a single string.
For example, if you send this string:
eval $this_track->name
The return value will be the name of the current track. ๐ฏ
If the result is an object or data structure, it will be returned in a serialized form.
๐ TEXT COMMANDS ๐
๐ Help commands ๐
help (h) โ Display help on Nama commands.
help [ <integer:help_topic_index> | <string:help_topic_name> |
<string:command_name> ]
help marks # display the help category marks and all commands containing marks
help 6 # display help on the effects category
help mfx # display help on modify-effect - shortcut mfx
help-effect (hfx, he) โ Display detailed help on LADSPA or LV2 effects.
help-effect <string:label> | <integer:unique_id>
help-effect 1970 # display help on Fons Adriaensen's parametric
EQ (LADSPA) help-effect etd # prints a short message to consult
Ecasound manpage, # where the etd chain operator is documented.
hfx lv2-vocProc # display detailed help on the LV2 VocProc
effect
find-effect(ffx,fe) โ Display one-line help for effects matching the search string(s). Like, it's giving quick-lookup energy. ๐
Usage:
find-effect <string:keyword1> [ <string:keyword2>... ]
Examples:
find-effect compressor # List all effects containing
"compressor" in their name or parameters fe feedback # List all
effects matching "feedback" # (for example a delay with a
feedback parameter)
General commands ๐
exit(quit,q) โ Exit Nama, saving settings (the current project). Bye bestie, your project is safe. ๐
exit
memoizeโ Cache WAV directory contents (default). It's the default vibe. โจ
memoize
unmemoizeโ Disable WAV directory caching. No cache, no problem. ๐ซ
unmemoize
Transport commands ๐
stop(s) โ Stop transport. Stop the engine, when recording or playing back. Hit the brakes. ๐
stop
start(t) โ Start the transport rolling. Let's gooo! ๐
start
Example:
rec # prepare the curent track to be recorded. start # Start
the engine/transport rolling (play now!) stop # Stop the
engine, cleanup, prepare to review
getpos(gp) โ Get the current playhead position (in seconds). Where am I? ๐
getpos
Example:
start # Start the engine. gp # Get the current position of
the playhead. Where am I?
setpos(sp) โ Set current playhead position (in seconds). Teleport the playhead. โจ
setpos <float:position_seconds>
setpos 65.5
forward(fw) โ Move playback position forwards (in seconds). Scoot forward. โฉ
forward <float:increment_seconds>
fw 23.7
rewind(rw) โ Move playback position backwards (in seconds). Rewind time. โช
rewind <float:decrement_seconds>
rewind 6.5
jump-to-start(beg) โ Set the playback head to the start. A synonym forsetpos 0. Back to the beginning. ๐
jump-to-start
jump-to-end(end) โ Set the playback head to end minus 10 seconds. Almost the end, but not quite. ๐
jump-to-end
ecasound-startโ Ecasound-only start. Nama will not monitor the transport. For diagnostic use. Nerd mode: on. ๐งช
ecasound-start
ecasound-stopโ Ecasound-only stop. Nama will not monitor the transport. For diagnostic use. Nerd mode: off. ๐งช
ecasound-stop
restart-ecasoundโ Restart the Ecasound process. May help if Ecasound has crashed or is behaving oddly. Have you tried turning it off and on again? ๐
restart-ecasound
preview(song) โ Enter the preview mode. Configure Nama for playback and passthru of live inputs without recording (for mic test, rehearsal, etc.) Test the mic, rehearse, vibe. ๐ค
preview
Example:
rec # Set the current track to record from its source.
preview # Enter the preview mode. start # Playback begins.
You can play live, adjust effects,
# forward, rewind, etc. stop # Stop processing
audio. arm # Restore to normal recording/playback mode.
doodle(live) โ Enter doodle mode. Passthru of live inputs without recording. No playback. Intended for rehearsing and adjusting effects. Just doodle around. ๐จ
doodle
Example:
doodle # Switch into doodle mode. start # start the audio
engine. (fool around) stop # Stop processing audio. arm #
Return to normal mode, allowing playback and record to disk
Mix commands ๐๏ธ
mixdown(mxd) โ Enter mixdown mode for subsequent engine runs. You will record a new mix each time you use the start command until you leave the mixdown mode using "mixoff". Mix it, record it, love it. ๐ฟ
mixdown
Example:
mixdown # Enter mixdown mode start # Start the transport. The
mix will be recorded by the
# Mixdown track. The engine will run until the
# longest track ends. (After mixdown Nama places
# a symlink to the WAV file and possibly ogg/mp3
# encoded versions in the project directory.) mixoff #
Return to the normal mode.
mixplay(mxp) โ Enter Mixdown play mode, setting user tracks to OFF and only playing the Mixdown track. Use "mixoff" to leave this mode. Only the mix, nothing else. ๐ง
mixplay
Example:
mixplay # Enter the Mixdown play mode. start # Play the
Mixdown track. stop # Stop playback. mixoff # Return to
normal mode.
mixoff(mxo) โ Leave the mixdown or mixplay mode. Sets Mixdown track to OFF, user tracks to MON. Back to normal. ๐
mixoff
automixโ Normalize track volume levels and fix DC-offsets, then mixdown. Auto-magic mix. โจ
automix
master-on(mr) โ Turn on the mastering mode, adding tracks Eq, Low, Mid, High and Boost, if necessary. The mastering setup allows for one EQ and a three-band multiband compression and a final boosting stage. Using "master-off" to leave the mastering mode. Master mode: activated. ๐
master-on
Example:
mr # Turn on master mode. start # Start the playback.
# Now you can adjust the Boost or global EQ. stop # Stop
the engine.
master-off(mro) โ Leave mastering mode. The mastering network is disabled. Master mode: off. ๐
master-off
Track commands ๐ต
add-track(add,new) โ Create a new audio track. New track, who dis? ๐ถ
add-track <string:name>
add-track clarinet # create a mono track called clarinet with
input # from soundcard channel 1.
add-midi-track(amt) โ Create a new midi track. MIDI time. ๐น
add-midi-track <string:name>
add-midi-track clarinet
add-tracksโ Create one or more new tracks in one go. Bulk track energy. ๐ฆ
add-tracks <string:name1> [ <string:name2>... ]
add-tracks violin viola contra_bass
link-track(link) โ Create a read-only track, that uses audio files from another track. Link it up. ๐
link-track [<string:project-name>] <string:track_name>
<string:link_name>
Example:
link my_song_part1 Mixdown part_1 # Create a read-only track
"part_1" in the current project # using files from track
"Mixdown" in project "my_song_part_1". # link-track
compressed_piano piano # Create a read-only track
"compressed_piano" using files from # track "piano". This is one
way to provide wet and dry # (processed and unprocessed)
versions of same source. # Another way would be to use inserts.
import-audio(import) โ Import a sound file (wav, ogg, mp3, etc.) to the current track, resampling it if necessary. The imported file is set as current version. Bring in the audio. ๐ฅ
import-audio <string:full_path_to_file> [ <integer:frequency> ]
Example:
import /home/samples/bells.flac # import the file bells.flac to
the current track import /home/music/song.mp3 44100 # import
song.mp3, specifying the frequency
Midi commands ๐น
import-midi(im) โ Import a MIDI song file (MIDI tracks only) MIDI files only, bestie. ๐ผ
import-midi <string:full_path_to_file>
Track commands ๐ต
route-track(route,rt) โ Set source and send for a track (see 'source' and 'send' commands) Route it. ๐ฃ๏ธ
route-track <string:source_id> <string:send_id>
set-trackโ Directly set current track parameters (use with care!). Careful, bestie. โ ๏ธ
set-track <string:track_field> <value>
record(rec) โ Set the current track to record its source. Creates the monitoring route if necessary. Recording to disk will begin on the next engine start. Use the "mon" or "off" commands to disable recording. Record time. ๐ด
record
Example:
rec # Set the current track to record. start # A new version
(take) will be written to disk, # creating a file such as
sax_1.wav. Other tracks # may be recording or playing back as
well. stop # Stop the recording/playback, automatically enter
playback mode
playโ Set the current track to playback the currently selected version. Creates the monitoring route if necessary. The selected audio file will play the next time the engine starts. Play it. โถ๏ธ
play
monโ Create a monitoring route for the current track at the next opportunity. Monitor vibes. ๐ง
mon
offโ Remove the monitoring route for the current track and all track I/O at the next opportunity. You can re-include it using "mon", "play" or "rec" commands. Turn it off. ๐
off
source(src,r) โ Set the current track's input (source), for example to a soundcard channel, or JACK client name Where's the input coming from? ๐ค
source <integer:soundcard_channel> | <string:jack_client_name> |
<string:jack_port_name> <string:jack_ports_list> | |
<string:track_name> | <string:loop_id> | 'jack' | 'null'
Example:
source 3 # Take input from soundcard channel 3 (3/4 if track is
stereo) # source null # Track's input is silence. This is useful
for when an effect such # as a metronome or signal generator
provides a source. # source bus Strings # set the Strings bus
as source # source track trumpet # set the track trumpet as
source # source LinuxSampler # set the JACK client named
LinuxSampler as source # source synth:output_3 # use the signal
from the JACK client synth, using the # port output_3 (see the
jackd and jack_lsp manpages # for more information). # source
jack # This leaves the track input exposed as JACK ports # such
as Nama:sax_in_1 for manual connection. # source kit.ports #
The JACK ports listed in the file kit.ports (if it exists) #
will be connected to the track input. # # Ports are listed
pairwise in the .ports files for stereo tracks. # This is
convenient for use with the Hydrogen drumkit, # whose outputs
use one JACK port per voice.
send(aux) โ Set an aux send for the current track. Remove sends withremove-send. Send it. ๐ค
send <integer:soundcard_channel> | <string:jack_client_name> |
<string:loop_id>
send 3 # Send the track output to soundcard channel 3. send
jconvolver # Send the track output to the jconvolver JACK
client.
remove-send(nosend,noaux) โ Remove aux send from the current track. No send, no problem. ๐ซ
remove-send
stereoโ Configure the current track to record two channels of audio Stereo vibes. ๐ง
stereo
monoโ Configure the current track to record one channel of audio Mono vibes. ๐๏ธ
mono
set-version(version,ver) โ Select a WAV file, by version number, for current track playback (Overrides a bus-level version setting) Pick a version. ๐ข
set-version <integer:version_number>
piano # Select the piano track. version 2 # Select the
second recorded version sh # Display information about
the current track
destroy-current-wavโ Remove the currently selected recording version from the current track after confirming user intent. This DESTRUCTIVE command removes the underlying audio file from your disk. Use with caution. ๐จ DESTRUCTIVE! Like, it literally deletes the audio file from your disk. Use with caution, bestie. ๐
destroy-current-wav
list-versions(lver) โ List WAV versions of the current track. This will print the numbers. Show me the versions. ๐
list-versions
list-versions ๐ฆ
okay so this one just spits out your version numbers, like:
list-versions # May print something like: 1 2 5 7 9
# The other versions might have been deleted earlier by you.
vol (v)
Changing or showing the current track's volume, bestie ๐ literally the one you'll type the most.
vol [ [ + | - | / | * ] <float:volume> ]
vol * 1.5 # Multiply the current volume by 1.5
vol 75 # Set the current volume to 75
# Depending on your namarc configuration, this means
# either 75% of full volume (-ea) or 75 dB (-eadb).
vol - 5.7 # Decrease current volume by 5.7 (percent or dB)
vol # Display the volume setting of the current track.
mute (c, cut)
Mutes the current track by lowering the volume parameter. Want it back? That's unmute's whole job ๐
mute
unmute (nomute, C, uncut)
Restores the previous volume level. Works after mute or after solo, no cap.
unmute
unity
Sets the current track's volume to unity โ aka the default value (100% or 0 dB) ๐
vol 55 # Set volume to 55
unity # Set volume to the unity value.
vol # Display the current volume (should be 100 or 0,
# depending on your settings in namarc.)
solo (sl)
Mutes everything except the current track (or whatever tracks/bunches you name). Reverse it with nosolo, periodt.
solo [ <strack_name_1> | <string:bunch_name_1> ] [ <string:track_name_2 | <string:bunch_name_2> ] ...
solo # Mute all tracks but the current track.
nosolo # Unmute all tracks, restoring prior state.
solo piano bass Drums # Mute everything but piano, bass and Drums.
nosolo (nsl)
Unmutes all tracks that got muted by a solo. And listen: tracks that were already muted before the solo stay muted. That's the rule ๐ซถ
nosolo
all
Unmutes every track that's currently muted. yes, all of them ๐
all
piano # Select track piano
mute # Mute the piano track.
sax # Select the track sax.
solo # Mute other tracks
nosolo # Unmute other tracks (piano is still muted)
all # all tracks play
pan (p)
Changes or shows the current panning position of the current track. Panning = sliding the audio across the stereo panorama between right and left, and the position is given in percent: 0 is hard left, 100 is hard right, and 50% is dead centre โจ
pan [ <float:pan_position_in_percent> ]
pan 75 # Pan the track to a position between centre and hard right
p 50 # Move the current track to the centre.
pan # Show the current position of the track in the stereo panorama.
pan-right (pr)
Pans the current track hard right โ it's a synonym for pan 100. Undo it with pan-back ๐ฆ
pan-right
pan-left (pl)
Pans the current track hard left โ synonym for pan 0. Also reversible with pan-back.
pan-left
pan-center (pc)
Pans the current track to the centre โ synonym for pan 50. Yep, pan-back reverses this one too ๐
pan-center
pan-back (pb)
Restores the current track's pan position from before the pan-left, pan-right or pan-center you just did. time travel but for panning โญ
pan-back
show-tracks (lt, show)
Shows you the whole squad: every track with its index number, volume, pan position, recording status and source ๐
show-tracks
show-tracks-all (sha, showa)
Same as show-tracks but it drags the hidden tracks out too. Super useful for debugging ๐
show-tracks-all
๐ BUS COMMANDS ๐
show-bus (shb)
Lists the tracks in the current bus, or in whichever bus you name.
show-bus [ <string:busname> ]
๐ง TRACK COMMANDS ๐ง
show-track (sh, -fart)
Full info dump on the current track: index, recording status, effects and controllers, inserts, the selected WAV version, and signal width (that's the channel count) ๐
show-track
โ๏ธ SETUP COMMANDS โ๏ธ
show-mode (shm)
Shows the current record/playback mode. It'll tell you the mode (doodle, preview, etc.) plus the possible record/playback settings ๐
show-mode
๐ง TRACK COMMANDS ๐ง
show-track-latency (shl)
Shows the latency info for the current track. diagnostics girlies rise ๐ซถ
show-track-latency
๐ฉบ DIAGNOSTICS COMMANDS ๐ฉบ
show-latency-all (shla)
Dumps all the latency data. every last crumb of it ๐
show-latency-all
๐ง TRACK COMMANDS ๐ง
set-region (srg)
Picks a playback region for the current track using marks. Reverse it with remove-region โจ
set-region <string:start_mark_name> <string:end_mark_name>
sax # Select "sax" as the current track.
setpos 2.5 # Move the playhead to 2.5 seconds.
mark sax_start # Create a mark
sp 120.5 # Move playhead to 120.5 seconds.
mark sax_end # Create another mark
set-region sax_start sax_end # Play only the audio from 2.5 to 120.5 seconds.
add-region
Makes a copy of the current track using the region definition you hand it. The original track? Untouched, untouched, untouched ๐
add-region <string:start_mark_name> | <float:start_time> <string:end_mark_name> | <float:end_time> [ <string:region_name> ]
sax # Select "sax" as the current track.
add-region sax_start 66.7 trimmed_sax # Create "trimmed_sax", a copy of "sax" with a region defined
# from mark "sax_start" to 66.7 seconds.
remove-region (rrg)
Removes the region definition from the current track. And heads up โ if the current track is an auxiliary track, this removes the track itself ๐ณ
remove-region
shift-track (shift, playat, pat)
Picks an initial delay before a track or region starts playing. unshift-track puts it back.
shift-track <string:start_mark_name> | <integer:start_mark_index | <float:start_seconds>
piano # Select "piano" as current track.
shift 6.7 # Move the start of track to 6.7 seconds.
unshift-track (unshift)
Restores the playback start time of a track or region back to 0 ๐ธ
unshift-track
modifiers (mods, mod)
Adds/shows modifiers for the current track (peep man ecasound for the deets). It's direct control over Ecasound track modifiers โ and ngl, you do not need it for normal work ๐
modifiers [ Audio file sequencing parameters ]
modifiers select 5 15.2 # Apply Ecasound's select modifier to the current track.
# The usual way to accomplish this is with a region definition.
nomodifiers (nomods, nomod)
Removes modifiers from the current track. bye felicia ๐
nomodifiers
normalize (ecanormalize)
Applies ecanormalize to the current track version โ it raises the gain/volume as far as possible without clipping and stores it that way on disk.
โ ๏ธ Note: this will permanently change the file. Not a vibe you can undo, bestie ๐ญ
normalize
fixdc (ecafixdc)
Fixes the DC-offset of the current track using ecafixdc.
โ ๏ธ Note: this will permanently change the file. fr fr, be sure.
fixdc
autofix-tracks (autofix)
Applies ecafixdc and ecanormalize to all current versions of all tracks, set to playback (MON). one command, whole project glow-up โจ
autofix-tracks
remove-track
Removes the current track along with its effects, inserts, etc. Your audio files are unchanged, promise ๐ซถ
remove-track
๐ฏ GROUP COMMANDS ๐ฏ
bus-version (bver, gver)
Sets the default monitoring version for tracks in the current bus ๐
bus-version
bus-on
Restores the tracks belonging to a bus after a bus-off.
bus-on
bus-off
Turns off the tracks belonging to the current bus.
bus-off
add-bunch (abn)
add-bunch <string:bunch_name> [ <string:track_name_1> | <integer:track_index_1> ] ...
add-bunch strings violin cello bass # Create a bunch "strings" with tracks violin, cello and bass.
for strings; mute # Mute all tracks in the strings bunch.
for strings; vol * 0.8 # Lower the volume of all tracks in bunch "strings" by a
# a factor of 0.8.
list-bunches (lbn)
Shows a list of all the bunches and which tracks live in them ๐ธ
list-bunches
remove-bunch (rbn)
Removes the bunches you name. Note: it does not remove the tracks, only the grouping. the girlies are free ๐
remove-bunch <string:bunch_name> [ <string:bunch_name> ] ...
add-to-bunch (atbn)
Adds track(s) to a bunch that already exists.
add-to-bunch <string:bunch_name> <string:track1> [ <string:track2> ] ...
add-to-bunch woodwind oboe sax flute
๐ PROJECT COMMANDS ๐
commit (cm)
Commits Nama's current state. yes, like that kind of commit ๐
commit <string:message>
tag
Git tags the current branch HEAD commit.
tag <string:tag_name> [<string:message>]
branch (br)
Switches to the named branch.
branch <string:branch_name>
list-branches (lb, lbr)
Lists branches. that's it, that's the command ๐ฆ
list-branches
new-branch (nbr)
Creates a new branch.
new-branch <string:new-branch_name> [<string:existing_branch_name>]
save-state (keep, save)
Saves the project settings as a file or a git snapshot โจ
save-state [ <string:settings_target> [ <string:message> ] ]
get-state (get, recall, retrieve)
Retrieves project settings from a file or a snapshot.
get-state <string:settings_target>
list-projects (lp)
Lists all your projects. They live in the Nama project root directory, and this command knows where that is ๐
list-projects
new-project (create)
Creates or opens a brand-new, empty Nama project.
new-project <string:new-project-name>
create jam
load-project (load)
Loads an existing project โ and it pulls from the default project state file. If you want a project state saved to a user-specific file, load the project first and then use get-state ๐
load-project <string:existing_project-name>
load my_old_song
project-name (project, name)
Displays the name of the current project.
project-name
new-project-template (npt)
Makes a project template out of the current project. Tracks and busses included, no cap ๐
new-project-template <string:template_name> [ <string:template_description> ]
new-project_template my_band_setup "tracks and busses for bass, drums and me"
use-project-template (upt, apt)
Uses a template to create tracks in a newly created, empty project. cute and efficient, main character energy โจ
use-project-template <string:template_name>
apt my_band_setup # Will add all the tracks for your basic band setup.
list-project-templates (lpt)
Lists all project templates.
list-project-templates
destroy-project-template
Removes one or more project templates. rip to them ๐
destroy-project-template <string:template_name1> [ <string:template_name2> ] ...
โ๏ธ SETUP COMMANDS โ๏ธ
generate (gen)
Generates an Ecasound chain setup for audio processing, by hand ๐ Mainly useful for diagnostics and debugging.
generate
armโ Generates and connects a full setup so you can record or play back. And if you're currently in dodle or preview mode? This brings you back to normal mode, no cap. ๐
arm
arm-start(alsoarms) โ Does the whole generate-and-connect thing and then starts, so you can go directly to recording or listening to your tracks. Instant main character energy. โจ
arm-start
connect(alsocon) โ Connects the setup so everything is ready to run. If you're using JACK, Nama will connect to all the necessary JACK ports. ๐
connect
disconnect(alsodcon) โ Disconnects the setup. If you're running with JACK, it disconnects from all the JACK ports. Bye bestie ๐
disconnect
show-chain-setup(alsochains) โ Shows the underlying Ecasound chain setup for whatever your current working condition is. Mainly useful for diagnostics and debugging. ๐ต๏ธ
show-chain-setup
loop(alsol) โ Loops the playback between two points. Can be stopped withloop_disable.
loop <string:start_mark_name> | <integer:start_mark_index> | <float:start_time_in_secs> <string:end_mark_name> | <integer:end_mark_index> | <float:end_time_in_secs>
Like, for real:
loop 1.5 10.0 # Loop between 1.5 and 10.0 seconds.
loop 1 5 # Loop between marks with indices 1 and 5, see list-marks.
loop sax_start 12.6 # Loop between mark sax_start and 12.6 seconds.
noloop(alsonl) โ Disables looping. That's it, that's the whole job. ๐
noloop
๐๏ธ Effect commands ๐๏ธ
add-controller(alsoacl) โ Adds a controller to an effect (the current effect by default). Controllers can be modified by usingmfxand removed usingrfx. ๐
add-controller [ <string:operator_id> ] <string:effect_code> [ <float:param1> <float:param2> ] ...
Watch it cook:
add-effect etd 100 2 2 50 50 # Add a stero delay of 100ms.
# the delay will get the effect ID E .
# Now we want to slowly change the delay to 200ms.
acl E klg 1 100 200 2 0 100 15 200 # Change the delay time linearly (klg)
add-effect(alsoafx) โ Adds an effect. โจ
add-effect [ (before <fx_alias> | first | last ) ] <fx_alias> [ <float:param1> <float:param2>... ]
"before", "first" and "last" can be abbreviated "b", "f" and "l", respectively.
Here's the vibe:
We want to add the decimator effect (a LADSPA plugin).
help-effect decimator # Print help about its paramters/controls.
# We see two input controls: bitrate and samplerate
afx decimator 12 22050 # prints "Added GO (Decimator)"
# We have added the decimator with 12bits and a sample rate of 22050Hz.
# GO is the effect ID, which you will need to modify it.
add-effect-last(alsoafxl) โ Same asadd-effect last. ๐
add-effect-last <fx_alias> [ <float:param1> <float:param2>... ]
add-effect-first(alsoafxf) โ Same asadd-effect first. ๐
add-effect-first <fx_alias> [ <float:param1> <float:param2>... ]
add-effect-before(alsoafxb insert-effect ifx) โ Same asadd-effect before. ๐
add-effect-before <fx_alias> <fx_alias> [ <float:param1> <float:param2>... ]
modify-effect(alsomfx) โ Modifies effect parameter(s), periodt. ๐ ๏ธ
modify-effect [ <fx_alias> ] <integer:parameter> [ + | - | * | / ] <float:value>
fx_alias can be: a position, effect ID, nickname or effect code.
Observe:
To change the roomsize of our reverb effect to 62
lfx # We see that reverb has unique effect ID AF and roomsize is the
# first parameter.
mfx AF 1 62
# mfx AF,BG 1 75 # Change the first parameter of both AF and BG to 75.
# mfx CE 6,10 -3 # Change parameters 6 and 10 of effect CE to -3
# mfx D 4 + 10 # Increase the fourth parameter of effect D by 10.
# mfx A,B,C 3,6 * 5 # Adjust parameters 3 and 6 of effect A, B and C by a factor of 5.
remove-effect(alsorfx) โ Removes effects. They don't have to be on the current track, so go wild. ๐๏ธ
remove-effect <fx_alias1> [ <fx_alias2> ] ...
position-effect(alsopfx) โ Positions an effect before another effect (use'ZZZ'for end). ๐
position-effect <string:id_to_move> <string:position_id>
position-effect G F # Move effect with unique ID G immediately before effect F
show-effect(alsosfx) โ Shows information about an effect, defaulting to the current effect. ๐
show-effect [ <string:effect_id1> ] [ <string:effect_id2> ] ...
sfx # Display name, unique ID and parameters/controls of the current effect.
sfx H # Display info on effect with unique ID H. H becomes the current effect.
dump-effect(alsodfx) โ Dumps all data of the current effect object. ๐ซ
dump-effect
list-effects(alsolfx) โ Prints a short list of all effects on the current track, only including unique ID and effect name. Short and sweet fr fr. ๐
list-effects
add-insert(alsoain) โ Adds an external send/return insert to the current track. ๐
add-insert External: ( pre | post ) <string:send_id> [ <string:return_id> ] Local wet/dry: local
Look at this:
add-insert pre jconvolver # Add a prefader insert. The current track signal is sent
# to jconvolver and returned to the vol/pan controls.
add-insert post jconvolver csound # Send the current track postfader signal (after vol/pan
# controls) to jconvolver, getting the return from csound.
guitar # Select the guitar track
ain local # Create a local insert
guitar-1-wet # Select the wet arm
afx G2reverb 50 5.0 0.6 0.5 0 -16 -20 # add a reverb
afx etc 6 100 45 2.5 # add a chorus effect on the reverbed signal
guitar # Change back to the main guitar track
wet 25 # Set the balance between wet/dry track to 25% wet, 75% dry.
set-insert-wetness(alsowet) โ Sets the wet/dry balance of the insert for the current track. The balance is given in percent,0meaning dry and100wet signal only. ๐ง
set-insert-wetness [ pre | post ] <n_wetness>
wet pre 50 # Set the prefader insert to be balanced 50/50 wet/dry.
wet 100 # Simpler if there's only one insert
remove-insert(alsorin) โ Removes an insert from the current track. ๐ฎ
remove-insert [ pre | post ]
rin # If there is only one insert on the current track, remove it.
remove-insert post # Remove the postfader insert from the current track.
ctrl-register(alsocrg) โ Lists all Ecasound controllers. Controllers include linear controllers and oscillators. ๐
ctrl-register
preset-register(alsoprg) โ Lists all Ecasound effect presets. See the Ecasound manpage for more detail oneffect_presets. ๐
preset-register
ladspa-register(alsolrg) โ Lists installed LADSPA plugins. ๐ฝ
ladspa-register
๐ Mark commands ๐
list-marks(alsolmk lm) โ Lists all marks with index, name and their respective positions in time. โฑ๏ธ
list-marks
to-mark(alsotmk tom) โ Moves the playhead to the named mark or mark index. ๐ฆ
to-mark <string:mark_name> | <integer:mark_index>
to-mark sax_start # Jump to the position marked by sax_mark.
tmk 2 # Move to the mark with the index 2.
add-mark(alsomark amk k) โ Drops a new mark at the current playback position. This will fail, if a mark is already placed on that exact position. ๐จ
add-mark [ <string:mark_id> ]
mark start # Create a mark named "start" at the current position.
remove-mark(alsormk) โ Removes a mark. ๐
remove-mark [ <string:mark_name> | <integer:mark_index> ]
remove-mark start # remove the mark named start
rmk 16 # Remove the mark with the index 16.
rmk # Remove the current mark
next-mark(alsonmk) โ Moves the playhead to the next mark. โญ๏ธ
next-mark
previous-mark(alsopmk) โ Moves the playhead to the previous mark. โฎ๏ธ
previous-mark
name-markโ Gives a name to the current mark. ๐ท๏ธ
name-mark <string:mark_name>
modify-mark(alsomove-mark mmk) โ Changes the position (time) of the current mark. ๐ฐ๏ธ
modify-mark [ + | - ] <float:seconds>
move-mark + 2.3 # Move the current mark 2.3 seconds forward from its
mmk 16.8 # Move the current mark to 16.8 seconds, no matter, where it is now.
๐ Diagnostics commands ๐
engine-status(alsoegs) โ Displays the Ecasound audio processing engine status. ๐ฉบ
engine-status
dump-track(alsodump) โ Dumps current track data. ๐ฆ
dump-track
dump-group(alsodumpg) โ Dumps group settings for user tracks. ๐ฆ
dump-group
dump-all(alsodumpa) โ Dumps most internal state data. Like, most of it. ๐ซ
dump-all
dump-ioโ Shows chain inputs and outputs. ๐
dump-io
๐ Help commands ๐
list-history(alsolh) โ Lists the command history. Every project stores its own command history. ๐ง
list-history
๐ Bus commands ๐
add-submix-cookedโ Creates a submix using all tracks in bus"Main". ๐ณ
add-submix-cooked <string:name> <destination>
add-submix-cooked front_of_house 7 # send a custom mix named "front_of_house"
# to soundcard channels 7/8
add-submix-raw(alsoasr) โ Adds a submix using tracks in Main bus (unprocessed signals, lower latency). ๐ฅฉ
add-submix-raw <string:name> <destination>
asbr Reverb jconv # Add a raw send bus called Reverb, with its output
add-bus(alsoabs) โ Adds a sub bus. This is a bus, as known from other DAWs. The default output goes to a mix track and that is routed to the mixer (the Main track). All busses begin with a capital letter! ๐๐
add-bus <string:name> [ <string:track_name> | <string:jack_client> | <integer:soundcard_channel> ]
abs Brass # Add a bus, "Brass", routed to the Main bus (e.g. mixer)
abs special csound # Add a bus, "special" routed to JACK client "csound"
update-submix(alsousm) โ Includes tracks added since the submix was created. โ
update-submix <string:name>
update-submix Reverb
remove-busโ Removes a bus or submix. ๐๏ธ
remove-bus <string:bus_name>
list-buses(alsolbs) โ Lists buses and their parameters (TODO). ๐
list-buses
set-bus(alsosbs) โ Sets bus parameters. This command is intended for advanced users. ๐งโ๐ฌ
set-bus <string:busname> <key> <value>
๐๏ธ Effect commands ๐๏ธ
overwrite-effect-chain(alsooec) โ Creates a new effect chain, overwriting an existing one of the same name. โ ๏ธ Yeah, the old one is gone gone.
overwrite-effect-chain
Same as for new-effect-chain.
new-effect-chain(alsonec) โ Creates an effect chain, a named list of effects with all parameter settings. Useful for storing effect setups for particular instruments. ๐
new-effect-chain <string:name> [ <effect_id_1> <effect_id_2>... ]
โฆand here's the rest of that little sample block, bestie โจ
new-effect-chain my_piano # Create a new effect chain, "my_piano", storing all
# effects and their settings from the current track
# except the fader (vol/pan) settings.
nec my_guitar A C F G H # Create a new effect chain, "my_guitar", storing the
# effects with IDs A, C, F, G, H and their
# respective settings.
๐
delete-effect-chain (aka dec, destroy-effect-chain)
Deletes an effect chain definition. It does not touch the project state. And heads up ๐ โ this one is not reversible by undo, so like, mean it when you hit enter.
delete-effect-chain <string:effect_chain_name>
๐ find-effect-chains (aka fec, lec)
Dumps effect chains, filtering on key pairs if you hand some over. No keys? You get the whole pile.
find-effect-chains [ <string:key_1> <string:value_1> ] ...
fec # List all effect chains with their effects.
๐ซถ find-user-effect-chains (aka fuec, leca)
Lists all the user created effect chains, and yes it'll match your key/value pairs if you provided any.
find-user-effect-chains [ <string:key_1> <string:value_1> ] ...
๐ bypass-effects (aka bypass, bfx)
Bypasses effects on the current track. Give it no parameters and it just defaults to bypassing the current effect, nbd.
bypass-effects [ <string:effect_id_1> <string:effect_id_2>... | 'all' ]
bypass all # Bypass all effects on the current track, except vol and pan.
bypass AF # Only bypass the effect with the unique ID AF.
๐ฅ bring-back-effects (aka restore-effects, bbfx)
Restores effects, un-bypassing the vibe. No parameter? Default is restoring the current effect.
bring-back-effects [ <string:effect_id_1> <string:effect_id_2> ... | 'all' ]
bbfx # Restore the current effect.
restore_effect AF # Restore the effect with the unique ID AF.
bring-back-effects all # Restore all effects.
๐ new-effect-profile (aka nep)
Makes a new effect profile. An effect profile is a named group of effect chains for multiple tracks โ extremely useful for storing a basic template of standard effects for a whole group of instruments, like a drum kit. It's giving "save my setup so I never type it again" energy. ๐
new-effect-profile <string:bunch_name> [ <string:effect_profile_name> ]
add-bunch Drums snare toms kick # Create a buch called Drums.
nep Drums my_drum_effects # Create an effect profile, call my_drum_effects
โจ apply-effect-profile (aka aep)
Applies an effect profile. It'll add all the effects in it to the list of tracks stored inside the effect profile. Note: you must give the tracks the same names as in the original project where you created the effect profile. Same names or it simply will not find them, fr fr.
apply-effect-profile <string:effect_profile_name>
๐ destroy-effect-profile
Deletes an effect profile. This deletes the effect profile definition from your disk. All projects that use this effect profile will NOT be affected โ they're safe, chill.
destroy-effect-profile <string:effect_profile_name>
๐ธ list-effect-profiles (aka lep)
Lists all effect profiles. All of them. Every single one.
list-effect-profiles
๐ฆ show-effect-profiles (aka sepr)
Lists effect profile. Yep, that's the whole bit. ๐ซถ
show-effect-profiles
๐ full-effect-profiles (aka fep)
Dumps the effect profile data structure โ the whole raw situation.
full-effect-profiles
๐ง Track commands
โญ cache-track (aka cache, ct, bounce, freeze)
Caches the current track. Same thing as freezing or bouncing. This is your bestie when the project is huge or the CPU is low-power, because effects don't have to be recomputed on subsequent engine runs. Cache_track stores the effects-processed output of the current track as a new version (WAV file), and that becomes the current version. The current effects, inserts and region definition are removed and stored. To go back to the original track state, use the uncache-track command. The show-track display appends a "c" to version numbers created by cache-track (and therefore reversible by uncache).
cache-track [ <float:additional_processing_time> ]
cache 10 # Cache the curent track and append 10 seconds extra time,
๐ Effect commands
๐ uncache-track (aka uncache, unc)
Selects the uncached track version. This restores effects, but not inserts. Not the inserts. Just so we're clear. ๐
uncache-track
๐ง General commands
โจ do-script (aka do)
Executes Nama commands from a file in the main project's directory or in the Nama project root directory. A script is just a list of Nama commands, exactly like you'd type them on the Nama prompt.
do-script <string:filename>
do prepare_my_drums # Execute the script prepare_my_drums.
๐ scan
Re-reads the project's .wav directory. Mainly useful for troubleshooting, iykyk.
scan
๐ Effect commands
๐ add-fade (aka afd, fade)
Adds a fade-in or fade-out to the current track. Iconic behaviour, minimal effort.
add-fade ( in | out ) marks/times (see examples)
fade in mark1 # Fade in, starting at mark1 and using the
# default fade time of 0.5 seconds.
fade out mark2 2 # Fade out over 2 seconds, starting at mark2 .
fade out 2 mark2 # Fade out over 2 seconds, ending at mark2 .
fade in mark1 mark2 # Fade in starting at mark1, ending at mark2 .
๐ซถ remove-fade (aka rfd)
Removes a fade from the current track. Bye fade ๐
remove-fade <integer:fade_index_1> [ <integer:fade_index_2> ] ...
list-fade # Print a list of all fades and their tracks.
rfd 2 # Remove the fade with the index (n) 2.
๐ธ list-fade (aka lfd)
Lists all fades.
list-fade
๐ง Track commands
๐ add-comment (aka comment, ac)
Adds a comment to the current track, and yes it replaces any previous comment. A comment can be a short description, notes on instrument settings, whatever you want to remember.
add-comment <string:comment>
ac "Guitar, treble on 50%"
๐ remove-comment (aka rc)
Removes a comment from the current track. Gone. Poof.
remove-comment
โจ show-comment (aka sc)
Shows the comment for the current track.
show-comment
๐ show-comments (aka sca)
Shows all track comments. All of them at once, the whole group chat. ๐ฌ
show-comments
๐ฆ add-version-comment (aka avc)
Adds a version comment, replacing any previous user comment. This adds a comment for the current version of the current track โ so it's comment-per-take, cute.
add-version-comment <string:comment>
avc "The good take with the clear 6/8"
๐ remove-version-comment (aka rvc)
Removes version comment(s) from the current track.
remove-version-comment
โญ show-version-comment (aka svc)
Shows version comment(s) of the curent track.
show-version-comment
๐ show-version-comments-all (aka svca)
Shows all version comments for the current track.
show-version-comments-all
๐
add-system-version-comment (aka asvc)
Sets a system version comment. Useful for testing and diagnostics โ very much a behind-the-scenes, not-for-the-feed situation.
add-system-version-comment <string:comment>
๐ฌ Edit commands
โจ new-edit (aka ned)
Creates an edit for the current track and version. Fresh edit, blank canvas, main character energy.
new-edit
๐ set-edit-points (aka sep)
Marks play-start, record-start and record-end positions for the current edit. Three little pins in the timeline ๐ฏ
set-edit-points
๐๏ธ list-edits (aka led)
Lists all edits for the current track and version.
list-edits
๐ select-edit (aka sed)
Selects an edit to modify or delete. After selection, it is the current edit.
select-edit <integer:edit_index>
๐ช end-edit-mode (aka eem)
Switches back to normal playback/record mode. The track will play full length again. Edits are managed via a sub-bus, fyi.
end-edit-mode
๐ destroy-edit
Removes an edit and all associated audio files. No parameter? Default is to destroy the current edit.
Note: the data will be lost permanently. Use with care! ๐ญ
destroy-edit [ <integer:edit_index> ]
๐ preview-edit-in (aka pei)
Plays the track region without the edit segment. So you hear what's left when the edit is taken out.
preview-edit-in
๐ง preview-edit-out (aka peo)
Plays the removed edit segment. Just the chunk that got cut. ๐
preview-edit-out
โถ๏ธ play-edit (aka ped)
Plays a completed edit.
play-edit
โบ๏ธ record-edit (aka red)
Records an audio file for the current edit.
record-edit
๐ฏ edit-track (aka et)
Sets the edit track as the current track.
edit-track
๐ช host-track-alias (aka hta)
Sets the host track alias as the current track.
host-track-alias
๐ host-track (aka ht)
Sets the host track (the edit sub-bus mix track) as the current track.
host-track
๐ version-mix-track (aka vmt)
Sets the version mix track as the current track.
version-mix-track
๐ play-start-mark (aka psm)
Selects (and moves to) the play start mark of the current edit.
play-start-mark
๐ด rec-start-mark (aka rsm)
Selects (and moves to) the rec start mark of the current edit.
rec-start-mark
๐ rec-end-mark (aka rem)
Selects (and moves to) the rec end mark of the current edit.
rec-end-mark
โก set-play-start-mark (aka spsm)
Sets play-start-mark to the current playback position.
set-play-start-mark
โก set-rec-start-mark (aka srsm)
Sets rec-start-mark to the current playback position.
set-rec-start-mark
โก set-rec-end-mark (aka srem)
Sets rec-end-mark to current playback position.
set-rec-end-mark
๐
disable-edits (aka ded)
Turns off the edits for the current track and plays back the original WAV file. This removes the edit bus entirely.
disable-edits
๐งฌ merge-edits (aka med)
Mixes edits and original into a new host-track. This writes a new audio file to disk, and the host track will have a new version for this. Glow up achieved. โจ
merge-edits
๐ง Track commands
๐ฅ explode-track
Makes the current track into a sub bus, with one track for each version. One track per version, no cap.
explode-track
๐ move-to-bus (aka mtb)
Moves the current track to another bus. A new track is always in the Main bus โ so to reverse this action, use move-to-bus Main.
move-to-bus <string:bus_name>
asub Drums # Create a new sub bus, called Drums.
snare # Make snare the current track.
mtb Drums # Move the snare track into the sub bus Drums.
๐ promote-version-to-track (aka pvt)
Creates a read-only track using the specified version of the current track. It said "you're a track now," and it was. ๐
promote-version-to-track <integer:version_number>
๐ง General commands
๐ read-user-customizations (aka ruc)
Re-reads the user customizations file 'custom.pl'. Refresh, bestie.
read-user-customizations
โ๏ธ Setup commands
โฑ๏ธ limit-run-time (aka lr)
Stops recording after the last audio file finishes playing. Can be turned off with limit-run-time_off.
limit-run-time [ <float:additional_seconds> ]
๐ limit-run-time-off (aka lro)
Disables the recording stop timer.
limit-run-time-off
โถ๏ธ offset-run (aka ofr)
Records/plays from a mark, rather than from the start โ i.e. not from 0.0 seconds. Skip the intro, go straight to the good part.
offset-run <string:mark_name>
โฉ๏ธ offset-run-off (aka ofro)
Turns back to starting from 0.
offset-run-off
General commands ๐ฌ
view-waveform,wviewโ pops open mhwavedit so you can look at (and mess with) the waveform of the current track โจandโจ the current version. Heads up bestie: this one needs Nama running in a graphical terminal, likextermorgterm, or started from GNOME with alt+F2. No pretty terminal, no pretty waveform, periodt.
view-waveform
edit-waveform,weditโ launches audacity to view/edit the waveform of the current track and version. Same deal as above, it's giving graphical-terminal energy only: start Nama fromxtermorgterm, or from GNOME using alt+F2 ๐ธ
edit-waveform
Setup commands ๐
rerecord,rerecโ record exactly like you did before ๐ซถ It sets every track to record that you had just recorded right before you listened back. Deja vu, but make it productive.
rerecord
for piano guitar;rec # Set piano and guitar track to record. # do your recording and ilstening. # You want to record another version of both piano and guitar: rerec # Sets piano and guitar to record again.
Track commands ๐ง
analyze-level,anlโ prints the Ecasound amplitude analysis for the current track. You get the highest volume plus the stats, so you can actually see how hot your signal is ๐ฅ
analyze-level
General commands ๐ฌ
forโ runs one or more commands across several tracks at once. Group-chat commands, basically ๐
for <string:track_name_1> [ <string:track_name_2>} ... ;
<string:commands>
for piano guitar; vol - 3; pan 75 # reduce volume and pan right for snare kick toms cymbals; mtb Drums # move tracks to bus Drums
Project commands ๐๏ธ
gitโ runs a git command inside the project directory. Yes, your mix has version control. Iconic.
git <string:command_name> [arguments]
Track commands ๐ง
edit-rec-setup-hook,ershโ edit the REC hook script for the current track.
edit-rec-setup-hook
edit-rec-cleanup-hook,erchโ edit the REC cleanup hook script for the current track.
edit-rec-cleanup-hook
remove-fader-effect,rffxโ removes the vol, pan or fader from the current track. Pick exactly one, bestie ๐
remove-fader-effect vol | pan | fader
rename-trackโ renames a track and its WAV files. Not me giving your files a whole new identity โจ
rename-track <string:old_track> <string:new_track>
Sequence commands ๐ฆ
new-sequence,nsqโ define a brand new sequence.
new-sequence <string:name> <track1, track2,...>
select-sequence,slsqโ makes the named sequence the current sequence.
select-sequence
list-sequences,lsqโ lists every user sequence you've got.
list-sequences
show-sequence,ssqโ displays the clips that make up the current sequence.
show-sequence
append-to-sequence,asqโ appends items to a sequence, lowkey the easiest way to grow one.
append-to-sequence [<string:name1>,...]
asq chorus # append chorus track to current sequence
asq # append current track to current sequence
insert-in-sequence,isqโ inserts items into a sequence before index i.
insert-in-sequence <string:name1> [<string:name2>,...] <integer:index>
remove-from-sequence,rsqโ removes items from a sequence.
remove-from-sequence <integer:index1> [<integer:index2>,...]
delete-sequence,dsqโ deletes an entire sequence. No takebacks ๐
delete-sequence <string:sequence>
add-spacer,aspโ adds a spacer to the current sequence at the position you specify, or appends it if you don't give a position ๐ธ
add-spacer <float:duration> [<integer:position>]
convert-to-sequence,csqโ converts the current track into a sequence.
convert-to-sequence
merge-sequence,msqโ caches the current sequence mix track and sets it toPLAY. Chef's kiss.
merge-sequence
snipโ creates a sequence from the current track by removing the region(s) defined by the mark pair(s). Heads up: this is not supported if the current track is already a sequence ๐ซ
snip <mark_pair1> [<mark_pair2>...]
snip cut1-start cut1-end cut2-start cut2-end
That one removes the cut1 and cut2 regions from the current track by creating a sequence โ๏ธ
compose,compose-sequence,compose-into-sequenceโ composes a new sequence out of the region(s) of the named track, defined by the mark pair(s). If a sequence with that name already exists, it appends the regions to it instead (that's thecompose-into-sequencebehaviour, bestie).
compose <string:sequence_name> <string:trackname> <mark_pair1> [<mark_pair2>...]
compose speeches conference-audio speaker1-start speaker1-end speaker2-start speaker2-end
That creates a "speeches" sequence with two clips, one for speaker1 and one for speaker2 ๐
General commands ๐ฌ
undoโ rolls back the last commit. (Pro tip: use"git log"to see the specific commands.) Note: redo is not supported yet. Yeah. It's giving cliffhanger ๐ญ
undo
redoโ restores the last undone commit. (TODO) โ so, not yet, bestie, we're manifesting it ๐
redo
show-head-commit,show-head,last-command,lastโ shows the last commit, i.e. the one thatundowould roll back. And yes, a single commit can hold multiple commands. A whole group chat in one message.
show-head-commit
Mode commands ๐
eagerโ sets eager mode. On or off, no in-between.
eager on | off
Engine commands ๐ฅ
new-engine,negโ starts a named Ecasound engine, or binds to one that already exists.
new-engine <string:engine_name> <integer:port>
select-engine,segโ selects an ecasound engine. (advanced users only!) Like, genuinely, this is main-character-only territory ๐
select-engine <string:engine_name>
Track commands ๐ง
set-track-engine-group,stegโ sets the current track's engine affiliation.
set-track-engine-group <string:engine_name>
Bus commands ๐
set-bus-engine-group,sbegโ sets the current bus's engine affiliation.
set-bus-engine-group <string:engine_name>
select-submix,ssmโ sets the target for thetrimcommand.
select-submix <string:submix_name>
trim-submix,trim,tsmโ controls a submix fader. Very "one slider to rule them all" of it.
trim-submix
# reduce vol of current track in in_ear_monitor by 3dB
select-submix in_ear_monitor
trim vol - 3
Effect commands โจ
nickname-effect,nfx,nickโ adds a nickname to the current effect (and creates an alias for you, bestie) ๐
nickname-effect <lower_case_string:nickname>
add-track guitar
afx Plate
nick reverb # current effect gets name "reverb1"
mfx reverb1 1 0.05 # modify first reverb effect on current track
mfx reverb 1 2 # works, because current track has one effect named "reverb"
afx reverb # add another Plate effect, gets name "reverb2"
rfx reverb # Error, multiple reverb effects are present on this
# track. Please use a numerical suffix.
mfx reverb2 1 3 # modify second reverb effect
rfx reverb1 # removes reverb1
ifx reverb2 reverb # insert another reverb effect (reverb3) before reverb2
rfx reverb3 # remove reverb3
rfx reverb # removes reverb2, as it is the sole remain reverb effect
delete-nickname-definition,dndโ deletes a nickname definition. Important: effects that were already named keep their names ๐ซถ
delete-nickname-definition
afx Plate # add Plate effect
nick reverb # name it "reverb", and create a nickname for Plate
dnd reverb # removes nickname definition
afx reverb # error
remove-nickname,rnickโ removes the"name"attribute of the current effect.
remove-nickname
afx Plate
nick reverb
mfx reverb 1 3
rnick
mfx reverb 1 3 # Error: effect named "reverb" not found on current track
list-nickname-definitions,lndโ lists all your defined nicknames ๐
list-nickname-definitions
set-effect-name,senโ sets a nickname only, without creating an alias.
set-effect-name <string:name>
set-effect-surname,sesโ sets an effect surname. Yes, effects have surnames now, we're fancy ๐
set-effect-surname <string:surname>
remove-effect-name,renโ removes the current effect name.
remove-effect-name
remove-effect-surname,resโ removes the current effect surname.
remove-effect-surname
Track commands ๐ง
select-trackโ sets a particular track as the current (or default) track, the one all the track-related commands get executed against.
select-track <string:track-name> | <integer:track-number>
commands ๐
edit-tempo-map,etmโ edit the tempo map file ๐ผ
edit-tempo-map
Midi commands ๐น
set-tempo,tempo,tpโ sets the MIDI tempo in bpm, no cap.
set-tempo <integer:tempo-setting>
General commands ๐ฌ
set-sample-rate,ssrโ configures the sample rate for the current project, or just reports the sample rate if you hand it no parameter. It's giving "ask and you shall receive" ๐
set-sample-rate <integer:sample-rate>
REALTIME OPERATION โก
Nama picks its realtime or nonrealtime parameters based on the realtime_profile, ecasound_buffersize and ecasound_globals fields in .namarc. You can optionally specify the buffersizes as a multiple of the JACK period size ๐ And bestie, real talk: for the best realtime operation under JACK you'll have to configure jackd appropriately as well. Nama can't do that part for you ๐ซถ
The realtime and auto profiles are the ones you want when you're using Nama/Ecasound for live fx processing or live monitoring ๐ฅ
The realtime profile sets a small buffersize and other low-latency settings whenever a soundcard or JACK client is connected. Snappy.
The nonrealtime profile uses a bigger buffer, which gives you extended margins for stable operation. It's suitable for post-processing, or for recording without live monitoring responsibilities. Chill vibes, stable vibes ๐
The auto profile defaults to nonrealtime settings. It switches to realtime, low-latency settings when a track has a live input. Truly the main character โ it just knows โจ
DIAGNOSTICS ๐ฉบ
On any change in setup, the GUI display updates and the "show-tracks" command is executed automatically, showing you exactly what to expect the next time the engine is started ๐
You can use the "chains" command to verify the Ecasound chain setup. (And the Ecasound command "cs-save-as mysetup.ecs" will additionally store all engine data โ effects as well as routing. Look at that, full receipts ๐
)
The "dump" command displays data for the current track. The "dumpall" command shows all state that would be saved.
And this is the same output that gets written to the State.yml file when you issue the "save" command. Consistent, as it should be ๐
BUGS AND LIMITATIONS ๐
No latency compensation across signal paths is provided at present. This feature is under development โ so, like, it's coming, bestie, we're just not there yet ๐
SECURITY CONCERNS ๐จ
If you are using Nama with the NetECI interface (i.e. if Audio::Ecasound is not installed) you should block TCP port 2868 if your computer is exposed to the Internet. Yes, seriously. Lock that door ๐
INSTALLATION ๐ง
The following commands, available on Unixlike systems with Perl installed, will pull in Nama and other Perl libraries required for text mode operation:
"cpanm Audio::Nama" -or- "PERL_MM_USE_DEFAULT=1 cpan Audio::Nama"
To use the GUI, you will need to install Tk:
"cpanm Tk"
You may want to install Audio::Ecasound if you prefer not to run Ecasound in server mode:
"cpanm Audio::Ecasound"
You can pull the source code as follows:
"git clone git://github.com/bolangi/nama.git"
And consult the BUILD file for build instructions ๐ฆ
SUPPORT ๐ซถ
The Nama mailing list is a suitable forum for questions regarding Nama installation, usage, bugs, feature requests, etc.
http://www.freelists.org/list/nama
For questions and discussion related to Ecasound:
https://lists.sourceforge.net/lists/listinfo/ecasound-list
๐ฉน PATCHES
So like, the modules that make up this whole application are the preprocessed output from several source files, okay? Which means if you wanna patch something, patches against those source files are preferred. That's the move. That's the vibe. Sending a patch against the generated module output? Bestie, no. Go to the source. ๐
โจ AUTHOR
That would be Joel Roth, <joelz@pobox.com> โ the icon, the legend, the main character who wrote this whole thing ๐
๐ซถ CONTRIBUTORS
The whole squad, and we are obsessed with every single one of them:
Alex Stone, Brett McCoy, Dubphil, F. Silvain ++, Joy Bausch, Julien Claassen ++, Kevin Utter, Lars Bjรธrndal, Philippe Scheltรฉ, Philipp รberbacher, Raphaรซl Mouneyres ++, Rusty Perez, S. Massy ++
(You'll notice a couple of them are marked with ++ there โ that's literally in the original, so we're keeping it exactly as-is, no edits, periodt. ๐
)
โ๏ธ COPYRIGHT & LICENSE
Copyright (c) 2009-2017 by Joel Roth.
This is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License, Version 3.
Like, actually free. Free as in go read the license and enjoy your freedoms, bestie. ๐
And that's a wrap on the whole NAMA(1p) page, babes ๐โจ this one shipped with perl v5.40.1 and was dated 2026-05-06 โ so if you ever see that version and date at the bottom of the page, you know exactly which cutie you're reading. Go make some noise. ๐๐ฆ๐ธ
๐ฆ where this page comes from
- ubuntu stonking: nama 1.602-1 ยท GPL-3.0-only
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms