From 6037adab514ccc2a4f01c64b046caf0b73485956 Mon Sep 17 00:00:00 2001 From: Electric Keet Date: Thu, 25 Jul 2024 20:48:58 -0700 Subject: [PATCH] General docs updates. New menu items, new options, a whole new user systems feature... --- doc/2-interface/README.md | 21 +-- doc/2-interface/export.md | 51 +++---- doc/2-interface/keyboard.md | 194 ++++++++++++++------------ doc/2-interface/menu-bar.md | 106 +++++++------- doc/2-interface/play-edit-controls.md | 1 + doc/2-interface/settings.md | 74 +++++++--- doc/2-interface/song-info.md | 16 ++- doc/3-pattern/README.md | 4 + doc/6-sample/README.md | 1 + doc/7-systems/gba.md | 10 +- doc/8-advanced/README.md | 37 ++--- doc/8-advanced/channels.md | 5 +- doc/8-advanced/chanosc.md | 1 + doc/8-advanced/chip-manager.md | 2 + doc/8-advanced/user-systems.md | 22 +++ doc/8-advanced/user-systems.png | Bin 0 -> 35024 bytes 16 files changed, 311 insertions(+), 234 deletions(-) create mode 100644 doc/8-advanced/user-systems.md create mode 100644 doc/8-advanced/user-systems.png diff --git a/doc/2-interface/README.md b/doc/2-interface/README.md index aa16af8d4..7d4300adf 100644 --- a/doc/2-interface/README.md +++ b/doc/2-interface/README.md @@ -18,30 +18,31 @@ the default layout of Furnace is depicted below. - [play/edit controls](play-edit-controls.md) - [instrument/wavetable/sample list](asset-list.md) - [song information](song-info.md) -- [effect list window](effect-list-window.md) - [pattern view](../3-pattern/README.md) +- [effect list window](effect-list-window.md) - [instrument editor](../4-instrument/README.md) - [wavetable editor](../5-wave/README.md) - [sample editor](../6-sample/README.md) ## advanced topics -- [mixer](../8-advanced/mixer.md) -- [grooves](../8-advanced/grooves.md) -- [channels](../8-advanced/channels.md) -- [pattern manager](../8-advanced/pat-manager.md) -- [chip manager](../8-advanced/chip-manager.md) -- [compatibility flags](../8-advanced/compat-flags.md) - [song comments](../8-advanced/comments.md) -- [piano/input pad](../8-advanced/piano.md) +- [channels](../8-advanced/channels.md) +- [chip manager](../8-advanced/chip-manager.md) +- [pattern manager](../8-advanced/pat-manager.md) +- [mixer](../8-advanced/mixer.md) +- [compatibility flags](../8-advanced/compat-flags.md) - [oscilloscope](../8-advanced/osc.md) - [oscilloscope (per channel)](../8-advanced/chanosc.md) +- [oscilloscope (X-Y)](../8-advanced/xyosc.md) - [clock](../8-advanced/clock.md) -- [register view](../8-advanced/regview.md) +- [grooves](../8-advanced/grooves.md) - [log viewer](../8-advanced/log-viewer.md) +- [register view](../8-advanced/regview.md) - [statistics](../8-advanced/stats.md) +- [memory composition](../8-advanced/memory-composition.md) ## other topics -- [basic mode](basic-mode.md) +- [piano/input pad](../8-advanced/piano.md) - [settings](settings.md) diff --git a/doc/2-interface/export.md b/doc/2-interface/export.md index 8d6f32074..e924a1717 100644 --- a/doc/2-interface/export.md +++ b/doc/2-interface/export.md @@ -1,26 +1,27 @@ # export -Furnace allows you to export your song in several formats. this section deals with describing the available export options. +Furnace allows you to export your song in several formats. this section deals with describing the available export options within each tab of the export window. -## export audio +## Audio this option allows you to export your song in .wav format. I know I know, no .mp3 or .ogg export yet, but you can use a converter. -there are two parameters: - +- **Export type**: + - **one file**: exports your song to one .wav file. + - **multiple files (one per chip)**: exports the output of each chip to .wav files. + - **multiple files (one per channel)**: exports the output of each channel to .wav files. + - useful for usage with a channel visualizer such as corrscope. +- **Bit depth**: + - **16-bit integer**: the most common type of .wav file, perfect for music playback. + - **32-bit float**: used for advanced audio manipulation. don't select this unless you know what you need it for. +- **Sample rate**: the default is 44100, the most common .wav sample rate. +- **Channels in file**: default is 2 (stereo). Set to 1 for mono. - **Loops**: sets the number of times the song will loop. - does not have effect if the song ends with `FFxx` effect. - **Fade out (seconds)**: sets the fade out time when the song is over. - does not have effect if the song ends with `FFxx` effect. -and three export choices: - -- **one file**: exports your song to one .wav file. -- **multiple files (one per chip)**: exports the output of each chip to .wav files. -- **multiple files (one per channel)**: exports the output of each channel to .wav files. - - useful for usage with a channel visualizer such as corrscope. - -## export VGM +## VGM this option allows exporting to a VGM (Video Game Music) file. these can be played back with VGMPlay (for example). @@ -40,9 +41,6 @@ the following settings exist: - **custom**: allows you to specify how many ticks to add. - `0` is effectively none, disabling loop trail completely. - this option will not appear if the loop modality isn't set to None as there wouldn't be a need to. -- **chips to export**: select which chips are going to be exported. - - due to VGM format limitations, you can only select up to two of each chip type. - - some chips will not be available, either because VGM doesn't support these yet, or because you selected an old format version. - **add pattern change hints**: this option adds a "hint" when a pattern change occurs. only useful if you're a developer. - the format of the "hint" data block that gets written is: `67 66 FE ll ll ll ll 01 oo rr pp pp pp ...` - `ll`: length, a 32-bit little-endian number @@ -51,12 +49,9 @@ the following settings exist: - `pp`: pattern index (one per channel) - **direct stream mode**: this option allows DualPCM to work. don't use this for other chips. - may or may not play well with hardware VGM players. - -click on **click to export** to begin exporting. - -## export text - -this option allows you to export your song as a text file. +- **chips to export**: select which chips are going to be exported. + - due to VGM format limitations, you can only select up to two of each chip type. + - some chips will not be available, either because VGM doesn't support these yet, or because you selected an old format version. ## export ZSM @@ -72,21 +67,21 @@ the following settings are available: - **loop**: enables loop. if disabled, the song won't loop. - **optimize size**: removes unnecessary commands to reduce size. -click on **Begin Export** to... you know. +## export text + +this option allows you to export your song as a text file. ## export command stream -this option exports a binary file which contains a dump of the internal command stream produced when playing the song. +this option exports a binary file in Furnace's own command stream format (FCS) which contains a dump of the internal command stream produced when playing the song. -it's not really useful, unless you're a developer and want to use a command stream dump for some reason (e.g. writing a hardware sound driver). - -- **export**: exports in Furnace's own command stream format (FCS). see `export-tech.md` in `papers/` for details. +it's not really useful, unless you're a developer and want to use a command stream dump for some reason (e.g. writing a hardware sound driver). see `export-tech.md` in `papers/` for details. ## export DMF this option allows you to save your song as a .dmf which can be opened in DefleMask. -the following systems are supported when saving as 1.0/legacy: +the following systems are supported when saving as 1.0/legacy (0.12): - Sega Genesis/Mega Drive (YM2612 + SN76489) - Sega Genesis/Mega Drive (YM2612 + SN76489, extended channel 3) - Sega Master System @@ -97,7 +92,7 @@ the following systems are supported when saving as 1.0/legacy: - Arcade (YM2151 + SegaPCM 5-channel compatibility) - Neo Geo CD (DefleMask 1.0+) -the following systems are supported when saving as 1.1.3+: +the following systems are also supported when saving as 1.1.3+: - Sega Master System (with FM expansion) - NES + Konami VRC7 - Famicom Disk System diff --git a/doc/2-interface/keyboard.md b/doc/2-interface/keyboard.md index 317538567..675ba0b55 100644 --- a/doc/2-interface/keyboard.md +++ b/doc/2-interface/keyboard.md @@ -39,7 +39,7 @@ the keys in the "Global hotkeys" section can be used in any window, although not | Panic | `F12` | | | | | **Window activation** | | -| Find/Replace | Ctrl-F | +| Find/Replace | `Ctrl-F` | | Settings | — | | Song Information | — | | Subsongs | — | @@ -63,16 +63,23 @@ the keys in the "Global hotkeys" section can be used in any window, although not | Piano | — | | Oscilloscope (master) | — | | Oscilloscope (per-channel) | — | +| Oscilloscope (X-Y) | — | | Volume Meter | — | | Clock | — | | Register View | — | | Log Viewer | — | | Statistics | — | +| Memory Composition | — | | Effect List | — | | Debug Menu | `Ctrl-Shift-D` | +| Command Stream Player | — | | About | — | | Collapse/expand current window | — | | Close current window | `Shift-Escape` | +| Command Palette | `Ctrl-P` | +| Recent files (Palette) | — | +| Insstruments (Palette) | — | +| Samples (Palette) | — | | | | | **Note input** | | | _see "note input" section after table_ | | @@ -102,8 +109,8 @@ the keys in the "Global hotkeys" section can be used in any window, although not | Move cursor down by one (override Edit Step) | `Shift-End` | | Move cursor to previous channel | — | | Move cursor to next channel | — | -| Move cursor to next channel (overflow) | — | | Move cursor to previous channel (overflow) | — | +| Move cursor to next channel (overflow) | — | | Move cursor to beginning of pattern | `Home` | | Move cursor to end of pattern | `End` | | Move cursor up (coarse) | `PageUp` | @@ -118,6 +125,10 @@ the keys in the "Global hotkeys" section can be used in any window, although not | Expand selection to end of pattern | — | | Expand selection upwards (coarse) | `Shift-PageUp` | | Expand selection downwards (coarse) | `Shift-PageDown` | +| Move selection up by one | `Alt-Up` | +| Move selection down by one | `Alt-Down` | +| Move selection to previous channel | `Alt-Left` | +| Move selection to next channel | `Alt-Right` | | Delete | `Delete` | | Pull delete | `Backspace` | | Insert | `Insert` | @@ -143,102 +154,103 @@ the keys in the "Global hotkeys" section can be used in any window, although not | Clear note input latch | — | | | | | **Instrument list** | | -| Add | `Insert` | -| Duplicate | `Ctrl-D` | -| Open | — | -| Open (replace current) | — | -| Save | — | -| Save (.dmp) | — | -| Move up | `Shift-Up` | -| Move down | `Shift-Down` | -| Delete | — | -| Edit | `Shift-Return` | -| Cursor up | `Up` | -| Cursor down | `Down` | -| Toggle folders/standard view | `Ctrl-V` | +| Add instrument | `Insert` | +| Duplicate instrument | `Ctrl-D` | +| Open instrument | — | +| Open instrument (replace current) | — | +| Save instrument | — | +| Save instrument (.dmp) | — | +| Move instrument up in list | `Shift-Up` | +| Move instrument down in list | `Shift-Down` | +| Delete instrument | — | +| Edit instrument | `Shift-Return` | +| Instrument cursor up | `Up` | +| Instrument cursor down | `Down` | +| Instruments: toggle folders/standard view | `Ctrl-V` | | | | | **Wavetable list** | | -| Add | `Insert` | -| Duplicate | `Ctrl-D` | -| Open | — | -| Open (replace current) | — | -| Save | — | -| Save (.dmw) | — | -| Save (raw) | — | -| Move up | `Shift-Up` | -| Move down | `Shift-Down` | -| Delete | — | -| Edit | `Shift-Return` | -| Cursor up | `Up` | -| Cursor down | `Down` | -| Toggle folders/standard view | `Ctrl-V` | +| Add wavetable | `Insert` | +| Duplicate wavetable | `Ctrl-D` | +| Open wavetable | — | +| Open wavetable (replace current) | — | +| Save wavetable | — | +| Save wavetable (.dmw) | — | +| Save wavetable (raw) | — | +| Move wavetable up in list | `Shift-Up` | +| Move wavetable down in list | `Shift-Down` | +| Delete wavetable | — | +| Edit wavetable | `Shift-Return` | +| Wavetable cursor up | `Up` | +| Wavetable cursor down | `Down` | +| Wavetables: toggle folders/standard view | `Ctrl-V` | | | | | **Sample list** | | -| Add | `Insert` | -| Duplicate | `Ctrl-D` | -| Create wavetable from selection | `Ctrl-W` | -| Open | — | -| Open (replace current) | — | -| Import raw data | — | -| Import raw data (replace current) | — | -| Save | — | -| Save (raw) | — | -| Move up | `Shift-Up` | -| Move down | `Shift-Down` | -| Delete | — | -| Edit | `Shift-Return` | -| Cursor up | `Up` | -| Cursor down | `Down` | -| Preview | — | -| Stop preview | — | -| Toggle folders/standard view | `Ctrl-V` | +| Add sample | `Insert` | +| Duplicate sample | `Ctrl-D` | +| Sample Editor: Create wavetable from selection | `Ctrl-W` | +| Open sample | — | +| Open sample (replace current) | — | +| Import raw sample data | — | +| Import raw sample data (replace current) | — | +| Save sample | — | +| Save sample (raw) | — | +| Move sample up in list | `Shift-Up` | +| Move sample down in list | `Shift-Down` | +| Delete sample | — | +| Edit sample | `Shift-Return` | +| Sample cursor up | `Up` | +| Sample cursor down | `Down` | +| Sample Preview | — | +| Stop sample preview | — | +| Samples: Toggle folders/standard view | `Ctrl-V` | +| Samples: Make me a drum kit | — | | | | | **Orders** | | | Previous order | `Up` | | Next order | `Down` | -| Cursor left | `Left` | -| Cursor right | `Right` | -| Increase value | — | -| Decrease value | — | -| Switch edit mode | — | -| Toggle alter entire row | `Ctrl-L` | -| Add | `Insert` | -| Duplicate | `Ctrl-D` | -| Deep clone | `Ctrl-Shift-D` | -| Duplicate to end of song | `Ctrl-E` | -| Deep clone to end of song | `Ctrl-Shift-E` | -| Remove | `Delete` | -| Move up | `Shift-Up` | -| Move down | `Shift-Down` | -| Replay | — | +| Order cursor left | `Left` | +| Order cursor right | `Right` | +| Increase order value | — | +| Decrease order value | — | +| Switch order edit mode | — | +| Order: Toggle alter entire row | `Ctrl-L` | +| Add order | `Insert` | +| Duplicate order | `Ctrl-D` | +| Deep clone order | `Ctrl-Shift-D` | +| Copy current order to end of song | `Ctrl-E` | +| Deep clone current order to end of song | `Ctrl-Shift-E` | +| Remove order | `Delete` | +| Move order up | `Shift-Up` | +| Move order down | `Shift-Down` | +| Replay order | — | | | | | **Sample editor** | | -| Edit mode: Select | `Shift-I` | -| Edit mode: Draw | `Shift-D` | -| Cut | `Ctrl-X` | -| Copy | `Ctrl-C` | -| Paste | `Ctrl-V` | -| Paste replace | `Ctrl-Shift-V` | -| Paste mix | `Ctrl-Alt-V` | -| Select all | `Ctrl-A` | -| Resize | `Ctrl-R` | -| Resample | `Ctrl-E` | -| Amplify | `Ctrl-B` | -| Normalize | `Ctrl-N` | -| Fade in | `Ctrl-I` | -| Fade out | `Ctrl-O` | -| Insert silence | `Insert` | -| Apply silence | `Shift-Delete` | -| Delete | `Delete` | -| Trim | `Ctrl-Delete` | -| Reverse | `Ctrl-T` | -| Invert | `Ctrl-Shift-T` | -| Signed/unsigned exchange | `Ctrl-U` | -| Apply filter | `Ctrl-F` | -| Preview sample | — | -| Stop sample preview | — | -| Zoom in | `Ctrl-=` | -| Zoom out | `Ctrl--` | -| Toggle auto-zoom | `Ctrl-0` | -| Create instrument from sample | — | -| Set loop to selection | `Ctrl-L` | +| Sample editor mode: Select | `Shift-I` | +| Sample editor mode: Draw | `Shift-D` | +| Sample editor: Cut | `Ctrl-X` | +| Sample editor: Copy | `Ctrl-C` | +| Sample editor: Paste | `Ctrl-V` | +| Sample editor: Paste replace | `Ctrl-Shift-V` | +| Sample editor: Paste mix | `Ctrl-Alt-V` | +| Sample editor: Select all | `Ctrl-A` | +| Sample editor: Resize | `Ctrl-R` | +| Sample editor: Resample | `Ctrl-E` | +| Sample editor: Amplify | `Ctrl-B` | +| Sample editor: Normalize | `Ctrl-N` | +| Sample editor: Fade in | `Ctrl-I` | +| Sample editor: Fade out | `Ctrl-O` | +| Sample editor: Insert silence | `Insert` | +| Sample editor: Apply silence | `Shift-Delete` | +| Sample editor: Delete | `Delete` | +| Sample editor: Trim | `Ctrl-Delete` | +| Sample editor: Reverse | `Ctrl-T` | +| Sample editor: Invert | `Ctrl-Shift-T` | +| Sample editor: Signed/unsigned exchange | `Ctrl-U` | +| Sample editor: Apply filter | `Ctrl-F` | +| Sample editor: Preview sample | — | +| Sample editor: Stop sample preview | — | +| Sample editor: Zoom in | `Ctrl-=` | +| Sample editor: Zoom out | `Ctrl--` | +| Sample editor: Toggle auto-zoom | `Ctrl-0` | +| Sample editor: Create instrument from sample | — | +| Sample editor: Set loop to selection | `Ctrl-L` | diff --git a/doc/2-interface/menu-bar.md b/doc/2-interface/menu-bar.md index ec3c6b1bf..58d0b4729 100644 --- a/doc/2-interface/menu-bar.md +++ b/doc/2-interface/menu-bar.md @@ -2,24 +2,20 @@ the menu bar allows you to select from five menus: file, edit, settings, window and help. -items in _italic_ don't appear in basic mode and are only available in advanced mode. - ## file -- **new...**: creates a new song. +- **new...**: opens the new song dialog to choose a system. + - click a system name to create a new song with it. + - some systems have several variants and are grouped, indicated by with a triangle to the left of the name. the first click on a group opens it. clicking again on the group name will create a new song with it. - **open...**: opens the file picker, allowing you to select a song to open. - see [file formats](formats.md) for a list of formats Furnace is able to open. - **open recent**: contains a list of the songs you've opened before. - **clear history**: erases the file history. - - **save**: saves the current song. - opens the file picker if this is a new song, or a backup. - **save as...**: opens the file picker, allowing you to save the song under a different name. - -- **export**: allows you to export your song into other formats, such as audio files, VGM and more. see the [export](export.md) page for more information. - +- **export...**: allows you to export your song into other formats, such as audio files, VGM and more. see the [export](export.md) page for more information. - **manage chips**: opens the [Chip Manager](../8-advanced/chip-manager.md) dialog. - - **restore backup**: restores a previously saved backup. - Furnace keeps up to 5 backups of a song. - the backup directory is located in: @@ -28,21 +24,18 @@ items in _italic_ don't appear in basic mode and are only available in advanced - Linux/other: `~/.config/furnace/backups` - this directory grows in size as you use Furnace. remember to delete old backups periodically to save space. - **do NOT rely on the backup system as auto-save!** you should save a restored backup because Furnace will not save backups of backups. - - **exit**: closes Furnace. ## edit - **...**: does nothing except prevent accidental clicks on later menu items if the menu is too tall to fit on the program window. - - **undo**: reverts the last action. - **redo**: repeats what you undid previously. - - **cut**: moves the current selection in the pattern view to clipboard. - **copy**: copies the current selection in the pattern view to clipboard. - **paste**: inserts the clipboard's contents in the cursor position. - you may be able to paste from OpenMPT as well. -- _**paste special...**:_ variants of the paste feature. +- **paste special...**: variants of the paste feature. - **paste mix**: inserts the clipboard's contents in the cursor position, but does not erase the occupied region. - **paste mix (background)**: does the same thing as paste mix, but doesn't alter content which is already there. - **paste with ins (foreground)**: same thing as paste mix, but changes the instrument. @@ -55,81 +48,84 @@ items in _italic_ don't appear in basic mode and are only available in advanced - if the selection is tall, it will select the entire column. - if a column is already selected, it will select the entire channel. - if a channel is already selected, it will select the entire pattern. - -- _**operation mask**:_ toggles which columns will be affected by the listed operations. [more information here.](../8-advanced/opmask.md) -- _**input latch**:_ determines which data are placed along with a note. [more information here.](../8-advanced/inputlatch.md) - +- **operation mask**: toggles which columns will be affected by the listed operations. [more information here.](../8-advanced/opmask.md) +- **input latch**: determines which data are placed along with a note. [more information here.](../8-advanced/inputlatch.md) - **note/octave up/down**: transposes notes in the current selection. - - **values up/down**: changes values in the current selection by ±1 or ±16. - - **transpose**: transpose notes or change values by a specific amount. - - **interpolate**: fills in gaps in the selection by interpolation between values. -- **change instrument**: changes the instrument number in a selection. -- **gradient/fade**: replace the selection with a "gradient" that goes from the beginning of the selection to the end. +- **change instrument...**: changes the instrument number in a selection. +- **gradient/fade...**: replace the selection with a "gradient" that goes from the beginning of the selection to the end. - does not affect the note column. - **Nibble mode**: when enabled, the fade will be per-nibble (0 to F) rather than per-value (00 to FF). - use for effects like `04xy` (vibrato). -- **scale**: scales values in the selection by a specific amount. +- **scale...**: scales values in the selection by a specific amount. - use to change volume in a selection for example. - **randomize**: replaces the selection with random values. - does not affect the note column. + - **Nibble mode**: when enabled, the randomization will be per-nibble (0 to F) rather than per-value (00 to FF). - **invert values**: `00` becomes `FF`, `01` becomes `FE`, `02` becomes `FD` and so on. - - **flip selection**: flips the selection so it is backwards. - **collapse/expand amount**: allows you to specify how much to collapse/expand in the next two menu items. - **collapse**: shrinks the selected contents. - **expand**: expands the selected contents. - - **collapse pattern**: same as collapse, but affects the entire pattern. - **expand pattern**: same as expand, but affects the entire pattern. - - **collapse song**: same as collapse, but affects the entire song. - it also changes speeds and pattern length to compensate. - **expand song**: same as expand, but affects the entire song. - it also changes speeds and pattern length to compensate. - -- _**find/replace**:_ shows [the Find/Replace window](../8-advanced/find-replace.md). - -- **clear**: opens a window that allows you to mass-delete things like songs, unused instruments, and the like. +- **find/replace**: shows [the Find/Replace window](../8-advanced/find-replace.md). +- **clear...**: opens a window that allows you to mass-delete things like songs, unused instruments, and the like. ## settings - **full screen**: expands the Furnace window so it covers your screen. - **lock layout**: prevents you from dragging/resizing docked windows, or docking more. -- **basic mode**: toggles [Basic Mode](basic-mode.md). -- **visualizer**: toggles pattern view particle effects when the song plays. +- **pattern visualizer**: toggles pattern view particle effects when the song plays. - **reset layout**: resets the workspace to its defaults. -- **settings...**: shows the Settings window. these are detailed in [settings.md]. +- **user systems...**: shows the User Systems window. this is detailed in [the User Systems documentation](../8-advanced/user-systems.md). +- **settings...**: shows the Settings window. these are detailed in [the Settings documentation](settings.md). ## window all these menu items show or hide their associated windows. -- [song information](song-info.md) -- [subsongs](song-info.md) -- [speed](song-info.md) -- [instruments](../4-instrument/README.md) -- [wavetables](../5-wave/README.md) -- [samples](../6-sample/README.md) -- [orders](order-list.md) -- [pattern](../3-pattern/README.md) -- _[mixer](../8-advanced/mixer.md)_ -- _[grooves](../8-advanced/grooves.md)_ -- _[channels](../8-advanced/channels.md)_ -- _[pattern manager](../8-advanced/pat-manager.md)_ -- _[chip manager](../8-advanced/chip-manager.md)_ -- _[compatibility flags](../8-advanced/compat-flags.md)_ -- [song comments](../8-advanced/comments.md) - -- [piano](../8-advanced/piano.md) -- [oscilloscope](../8-advanced/osc.md) -- [oscilloscopes (per-channel)](../8-advanced/chanosc.md) -- [clock](../8-advanced/clock.md) -- [register view](../8-advanced/regview.md) -- [log viewer](../8-advanced/log-viewer.md) -- [stats](../8-advanced/stats.md) +- song + - **[song comments](../8-advanced/comments.md)** + - **[song information](song-info.md)** + - **[subsongs](song-info.md)** + - **[channels](../8-advanced/channels.md)** + - **[chip manager](../8-advanced/chip-manager.md)** + - **[orders](order-list.md)** + - **[pattern](../3-pattern/README.md)** + - **[pattern manager](../8-advanced/pat-manager.md)** + - **[mixer](../8-advanced/mixer.md)** + - **[compatibility flags](../8-advanced/compat-flags.md)** +- assets + - **[instruments](../4-instrument/README.md)** + - **[samples](../6-sample/README.md)** + - **[wavetables](../5-wave/README.md)** + - **[instrument editor](../4-instrument/README.md)** + - **[sample editor](../6-sample/README.md)** + - **[wavetable editor](../5-wave/README.md)** +- visualizers + - **[oscilloscope](../8-advanced/osc.md)** + - **[oscilloscope (per-channel)](../8-advanced/chanosc.md)** + - **[oscilloscope (X-Y)](../8-advanced/xyosc.md)** + - volume meter +- tempo + - **[clock](../8-advanced/clock.md)** + - **[grooves](../8-advanced/grooves.md)** + - **[speed](song-info.md)** +- debug + - **[log viewer](../8-advanced/log-viewer.md)** + - **[register view](../8-advanced/regview.md)** + - **[statistics](../8-advanced/stats.md)** + - **[memory composition](../8-advanced/memory-composition.md)** +- **[effect list](../3-pattern/effects.md)** +- **[play/edit controls](play-edit-controls.md)** +- **[piano/input pad](../8-advanced/piano.md)** ## help diff --git a/doc/2-interface/play-edit-controls.md b/doc/2-interface/play-edit-controls.md index d7814ac25..47e4f103b 100644 --- a/doc/2-interface/play-edit-controls.md +++ b/doc/2-interface/play-edit-controls.md @@ -13,6 +13,7 @@ the "Play/Edit Controls" are used to control playback and change parameters of t - **Poly**: turns on polyphony for previewing notes. toggles to **Mono** for monophony (one note at a time only). - **Octave**: sets current input octave. - **Step**: sets edit step. if this is 1, entering a note or effect will move to the next row. if this is a larger number, rows will be skipped. if this is 0, the cursor will stay in place. + - if clicked, Step becomes **Coarse**, which sets the number of rows moved with `PgUp`, `PgDn`, and related movement shortcuts. clicking again will revert it to Step. - **Follow orders**: if on, the selected order in the orders window will follow the song during playback. - **Follow pattern**: if on, the cursor will follow playback and the song will scroll by as it plays. diff --git a/doc/2-interface/settings.md b/doc/2-interface/settings.md index ec61e9371..eadbf55a9 100644 --- a/doc/2-interface/settings.md +++ b/doc/2-interface/settings.md @@ -1,6 +1,6 @@ # settings -the Settings window allows you to change Furnace setting. +the Settings window allows you to change Furnace settings. settings are saved when clicking the **OK** or **Apply** buttons at the bottom of the window. @@ -8,18 +8,23 @@ settings are saved when clicking the **OK** or **Apply** buttons at the bottom o ### Program +- **Language**: select the language used for the interface. some languages are incomplete, and are listed with their approximate completion percentage. - **Render backend**: changing this may help with performace or compatibility issues. the available render backends are: + - SDL Renderer: this was the only available render backend prior to the addition of dedicated OpenGL/DirectX backends in 0.6. default on macOS. + - DirectX 11: works with the majority of graphics chips/cards and is optimized specifically for Windows. + - it is slower than the other backends. + - DirectX 9: use if your hardware is incompatible with DirectX 11. - OpenGL 3.0: works with the majority of graphics chips/cards (from 2010 onwards). default on Linux. - OpenGL 2.0: use if you have a card without OpenGL 3.0 support. - OpenGL 1.1: use if your card doesn't even support OpenGL 2.0. - - DirectX 11: works with the majority of graphics chips/cards and is optimized specifically for Windows. - - SDL Renderer: this was the only available render backend prior to the addition of dedicated OpenGL/DirectX backends in 0.6. default on macOS. - - it is slower than the other backends. - Software: this is a last resort backend which renders the interface in software. very slow! -- **Render driver**: this setting appears when using the SDL Renderer backend. it allows you to select an SDL render driver. +- **Advanced render backend settings**: only applicable with some render backends. + - **Render driver**: this setting only appears when using the SDL Renderer backend. it allows you to select an SDL render driver. + - OpenGL settings: these only appear when using an OpenGL backend, and should only be adjusted if the display is incorrect. - **VSync**: synchronizes rendering to VBlank and eliminates tearing. - **Frame rate limit**: allows you to set a frame rate limit (in frames per second). - only has effect when VSync is off or not available (e.g. software rendering or force-disabled on driver settings). +- **Display render time**: displays frame rate and frame render time at the right side of the menu bar. - **Late render clear**: this option is only useful when using old versions of Mesa drivers. it force-waits for VBlank by clearing after present, reducing latency. - **Power-saving mode**: saves power by lowering the frame rate to 2fps when idle. - may cause issues under Mesa drivers! @@ -49,6 +54,7 @@ settings are saved when clicking the **OK** or **Apply** buttons at the bottom o - **Remember last values** - **Store instrument name in .fui**: when enabled, saving an instrument will store its name. this may increase file size. - **Load instrument name from .fui**: when enabled, loading an instrument will use the stored name (if present). otherwise, it will use the file name. +- **Auto-fill file name when saving**: pre-fill the file name field with an appropriate name when saving or exporting. ### New Song @@ -79,6 +85,11 @@ settings are saved when clicking the **OK** or **Apply** buttons at the bottom o - **New instruments are blank**: when enabled, adding FM instruments will make them blank (rather than loading the default one). +### Configuration +- **Import**: select an exported `.ini` config file to overwrite current settings. +- **Export**: select an `.ini` file to save current settings. +- **Factory Reset**: resets all settings to default. + ## Audio ### Output @@ -100,9 +111,7 @@ settings are saved when clicking the **OK** or **Apply** buttons at the bottom o - **Sample rate**: audio output rate. - a lower rate decreases quality and isn't really beneficial. - if using PortAudio backend, be careful about this value. -- **Outputs**: number of audio outputs created, up to 16. - - only appears when Backend is JACK. -- **Channels**: mono, stereo or something. +- **Outputs**: number of audio outputs created, up to 16. default is 2 (stereo). - **Buffer size**: size of buffer in both samples and milliseconds. - setting this to a low value may cause stuttering/glitches in playback (known as "underruns" or "xruns"). - setting this to a high value increases latency. @@ -135,6 +144,7 @@ settings are saved when clicking the **OK** or **Apply** buttons at the bottom o ### MIDI input - **MIDI input**: input device. + - **Rescan MIDI devices**: repopulates list with all currently connected MIDI devices. useful if a device is connected while Furnace is running. - **Note input**: enables note input. disable if you intend to use this device only for binding actions. - **Velocity input**: enables velocity input when entering notes in the pattern. - **Map MIDI channels to direct channels**: when enabled, notes from MIDI channels will be mapped to channels rather than the cursor position. @@ -291,6 +301,7 @@ below all the binds, select a key from the dropdown list to add it. it will appe - **Push value when overwriting instead of clearing it**: in the order list and pattern editors, typing into an already-filled value will shift digits instead of starting fresh. for example: - if off: moving the cursor onto the value `A5` and typing a "B" results in `0B`. - if on: moving the cursor onto the value `A5` and typing a "B" results in `5B`. +- **Keyboard note/value input repeat (hold key to input continuously)** - **Effect input behavior:** - **Move down**: after entering an effect (or effect value), the cursor moves down. - **Move to effect value (otherwise move down)**: after entering an effect, the cursor moves to its value. if entering a value, the cursor moves down. @@ -359,11 +370,7 @@ below all the binds, select a key from the dropdown list to add it. it will appe - **Pattern font** font for the pattern view, the order list, and related. - if "Custom...", a file path selector will appear. - **Size**: font size. -- **Display Japanese characters**, **Display Chinese (Simplified) characters**, **Display Chinese (Traditional) characters** and **Display Korean characters**: only toggle these options if you have enough graphics memory. - - these are a temporary solution until dynamic font atlas is implemented in Dear ImGui. - #### FreeType-specific settings - - **Anti-aliased fonts**: when enabled, fonts will be rendered smooth. - **Support bitmap fonts**: this option allows you to enable the loading of bitmap fonts. - be noted that this may force non-bitmap fonts to undesired sizes! @@ -376,6 +383,13 @@ below all the binds, select a key from the dropdown list to add it. it will appe - **Disable**: only rely upon font hinting data. - **Enable**: prefer font hinting data if present. - **Force**: ignore font hinting data. +#### non-specific settings +- **Oversample**: renders the font internally at higher resolution for visual quality. + - higher settings use more video memory. + - for pixel or bitmap fonts, set this to **1x**. +- **Load fallback font**: load an extra font that contains nearly all characters that can be used, in case the selected fonts lack them. uses much video memory +- **Display Japanese characters**, **Display Chinese (Simplified) characters**, **Display Chinese (Traditional) characters** and **Display Korean characters**: only toggle these options if you have enough graphics memory. + - these are a temporary solution until dynamic font atlas is implemented in Dear ImGui. ### Program @@ -386,15 +400,16 @@ below all the binds, select a key from the dropdown list to add it. it will appe - **/path/to/file.fur - Furnace** - **Display system name on title bar** - **Display chip names instead of "multi-system" in title bar** -- **Export options layout:** - - **Sub-menus in File menu**: export options appear in the File menu as sub-menus. - - **Modal window with tabs**: a single "export..." option that opens a dialog with export options. this is the default. - - **Modal windows with options in File menu**: like Sub-menus in File menu, but instead of being sub-menus, selecting one opens a dialog with export settings. - **Status bar:** - **Cursor details** - **File path** - **Cursor details or file path** - **Nothing** +- **Display playback status when playing**: display playback time and current location in the menu bar. +- **Export options layout:** + - **Sub-menus in File menu**: export options appear in the File menu as sub-menus. + - **Modal window with tabs**: a single "export..." option that opens a dialog with export options. this is the default. + - **Modal windows with options in File menu**: like Sub-menus in File menu, but instead of being sub-menus, selecting one opens a dialog with export settings. - **Capitalize menu bar** - **Display add/configure/change/remove chip menus in File menu**: if enabled, the "manage chips" item in the file menu is split into the four listed items for quick access. @@ -532,10 +547,10 @@ below all the binds, select a key from the dropdown list to add it. it will appe - **Rounded window corners** - **Rounded buttons** - **Rounded menu corners** +- **Rounded tabs** +- **Rounded scrollbars** - **Borders around widgets**: draws borders on buttons, checkboxes, text widgets, and the like. - - ## Color ### Color scheme @@ -544,9 +559,28 @@ below all the binds, select a key from the dropdown list to add it. it will appe - **Export** - **Reset defaults** - **Guru mode**: exposes all color options (instead of accent colors). -- **General** +- **Interface** + - **Frame shading**: applies a gradient effect to buttons and input boxes. - **Color scheme type:** - **Dark** - **Light** - - **Frame shading**: applies a gradient effect to buttons and input boxes. + - **Accent colors**: select main interface colors. + - **Primary** + - **Secondary** - several more categories... + +## Backup + +### Configuration + +- **Enable backup system**: turn on automatic backups of the current open file. +- **Interval (in seconds)**: time between automatic backups. +- **Backups per file**: maximum number of backups to store for each file. + +### Backup Management + +- **Purge before**: + - **Go**: purge backups whose filenames precede the selected date. +- total space used by all backups: + - **Refresh**: recalculate space. + - **Delete All**: purge all backups. diff --git a/doc/2-interface/song-info.md b/doc/2-interface/song-info.md index 24a42f95e..1e10663a3 100644 --- a/doc/2-interface/song-info.md +++ b/doc/2-interface/song-info.md @@ -3,11 +3,11 @@ - **Name**: the track's title. - **Author**: the author(s) of this track. - **Album**: the associated album name (or the name of the game the song is from). -- **System**: the game console or computer the track is designed for. this is automatically set when creating a new tune, but in advanced mode, it can be changed to anything one wants. the **Auto** button will provide a guess based on the chips in use. +- **System**: the game console or computer the track is designed for. this is automatically set when creating a new tune, but can be changed to anything. the **Auto** button will provide a guess based on the chips in use. all of this metadata will be included in a VGM export. this isn't the case for an audio export, however. -- _**Tuning (A-4)**_: set tuning based on the note A-4, which should be 440 in most cases. opening an Amiga MOD will set it to 436 for hardware compatibility. available only in advanced mode. +- **Tuning (A-4)**: set tuning based on the note A-4, which should be 440 in most cases. opening an Amiga MOD will set it to 436 for hardware compatibility. ## subsongs @@ -23,16 +23,17 @@ this window allows one to create **subsongs** - multiple individual songs within there are multiple ways to set the tempo of a song. -items in _italic_ don't appear in basic mode and are only available in advanced mode. +**Base Tempo**: tempo in beats per minute (BPM). this is affected by the Highlight settings below. +- clicking the Base Tempo button switches to the more technical Tick Rate. **Tick Rate**: the frequency of ticks per second, thus the rate at which notes and effects are processed. - all values are allowed for all chips, though most chips have hardware limitations that mean they should stay at either 60 (approximately NTSC) or 50 (exactly PAL). -- clicking the Tick Rate button switches to a more traditional **Base Tempo** BPM setting. +- clicking the Tick Rate button switches to the more traditional Base Tempo BPM setting. **Speed**: the number of ticks per row. - clicking the "Speed" button changes to more complex modes covered in the [grooves](../8-advanced/grooves.md) page. -_**Virtual Tempo**:_ Simulates any arbitrary tempo without altering the tick rate. it does this by adding or skipping ticks to approximate the tempo. the two numbers represent a ratio applied to the actual tick rate. example: +**Virtual Tempo**: simulates any arbitrary tempo without altering the tick rate. it does this by adding or skipping ticks to approximate the tempo. the two numbers represent a ratio applied to the actual tick rate. example: - set tick rate to 150 BPM (60 Hz) and speed to 6. - set the first virtual tempo number (numerator) to 200. - set the second virtual tempo number (denominator) to 150. @@ -40,7 +41,8 @@ _**Virtual Tempo**:_ Simulates any arbitrary tempo without altering the tick rat - the ratio doesn't have to match BPM numbers. set the numerator to 4 and the denominator to 5, and the virtual BPM becomes 150 × 4/5 = 120. - another way to accomplish this with more control over the results is to use grooves. see the page on [grooves](../8-advanced/grooves.md) for details. -_**Divider**:_ Changes the effective tick rate. a tick rate of 60Hz and a divisor of 6 will result in ticks lasting a tenth of a second each! +**Divider**: changes the effective tick rate. a tick rate of 60Hz and a divisor of 6 will result in ticks lasting a tenth of a second each! +- to the right, the effective BPM is listed, taking all settings into account. **Highlight**: sets the pattern row highlights: - the first value represents the number of rows per beat. @@ -50,4 +52,4 @@ _**Divider**:_ Changes the effective tick rate. a tick rate of 60Hz and a diviso **Pattern Length**: the length of each pattern in rows. this affects all patterns in the song, and every pattern must be the same length. (Individual patterns can be cut short by `0Bxx`, `0Dxx`, and `FFxx` commands.) -_**Song Length**:_ how many orders are in the order list. decreasing it will hide the orders at the bottom. increasing it will restore those orders; increasing it further will add new orders of all `00` patterns. +**Song Length**: how many orders are in the order list. decreasing it will hide the orders at the bottom. increasing it will restore those orders; increasing it further will add new orders of all `00` patterns. diff --git a/doc/3-pattern/README.md b/doc/3-pattern/README.md index 31713ea64..77060b5f2 100644 --- a/doc/3-pattern/README.md +++ b/doc/3-pattern/README.md @@ -119,6 +119,10 @@ Shift-Up | expand selection upwards Shift-Down | expand selection downwards Shift-Left | expand selection to the left Shift-Right | expand selection to the right +Alt-Up | move selection up by one +Alt-Down | move selection down by one +Alt-Left | move selection to previous channel +Alt-Right | move selection to next channel Backspace | delete note at cursor and/or pull pattern upwards (configurable) Delete | delete selection Insert | create blank row at cursor position and push pattern diff --git a/doc/6-sample/README.md b/doc/6-sample/README.md index 2e870c95d..5ebe571c1 100644 --- a/doc/6-sample/README.md +++ b/doc/6-sample/README.md @@ -89,6 +89,7 @@ in there, you can modify certain data pertaining to your sample, such as the: - **Open**: replaces current sample. - right-clicking brings up a menu: - **import raw...**: brings up a file selector, then presents a dialog to choose the format of the selected file. + - **import raw (replace)...**: same as above, but instead of adding it to the sample list, it replaces the currently selected sample. - **Save**: saves current sample to disk. - right-clicking brings up a menu: - **save raw...**: brings up a file selector, then saves the sample as raw data. diff --git a/doc/7-systems/gba.md b/doc/7-systems/gba.md index 692d8db0d..a0653a5fe 100644 --- a/doc/7-systems/gba.md +++ b/doc/7-systems/gba.md @@ -15,11 +15,11 @@ it features echo and up to 16 voices. - `10xx`: **change wave.** - `11xy`: **configure echo.** - - this effect is kinda odd. this is how it works: - -> How do you echo on GBA -> -> Create an empty instrment and put a very high note of it in channel 1 then do 110x in effect column and set volume column to set feedback and do nothing else on it + - this effect is kinda odd. here's how to use it: + - create an empty instrument and put a very high note of it in channel 1. + - put `110x` in the effect column. + - set volume column to set feedback. + - don't use the channel for anything else. - `12xy`: **toggle invert.** - `x` left channel. diff --git a/doc/8-advanced/README.md b/doc/8-advanced/README.md index 4a9512823..759737e0e 100644 --- a/doc/8-advanced/README.md +++ b/doc/8-advanced/README.md @@ -8,22 +8,27 @@ as listed in the "Edit" menu: as listed in the "Window" menu: -- [mixer](mixer.md) -- [grooves](grooves.md) -- [channel manager](channels.md) -- [pattern manager](pat-manager.md) -- [chip manager](chip-manager.md) -- [compatibility flags](compat-flags.md) -- [song comments](comments.md) - -- [piano](piano.md) -- [oscilloscope](osc.md) -- [oscilloscope (X-Y)](xyosc.md) -- [oscilloscopes (per-channel)](chanosc.md) -- [clock](clock.md) -- [register view](regview.md) -- [log viewer](log-viewer.md) -- [stats](stats.md) +- song + - [song comments](../8-advanced/comments.md) + - [channels](../8-advanced/channels.md) + - [chip manager](../8-advanced/chip-manager.md) + - [pattern manager](../8-advanced/pat-manager.md) + - [mixer](../8-advanced/mixer.md) + - [compatibility flags](../8-advanced/compat-flags.md) +- visualizers + - [oscilloscope](../8-advanced/osc.md) + - [oscilloscope (per-channel)](../8-advanced/chanosc.md) + - [oscilloscope (X-Y)](../8-advanced/xyosc.md) + - volume meter +- tempo + - [clock](../8-advanced/clock.md) + - [grooves](../8-advanced/grooves.md) +- debug + - [log viewer](../8-advanced/log-viewer.md) + - [register view](../8-advanced/regview.md) + - [statistics](../8-advanced/stats.md) + - [memory composition](../8-advanced/memory-composition.md) +- [piano/input pad](../8-advanced/piano.md) other: diff --git a/doc/8-advanced/channels.md b/doc/8-advanced/channels.md index 5b70f00dd..53bc00065 100644 --- a/doc/8-advanced/channels.md +++ b/doc/8-advanced/channels.md @@ -5,8 +5,9 @@ the "Channels" dialog allows manipulation of the song's channels. ![channels dialog](channels.png) each channel has the following options: -- **Visible**: uncheck the box to hide the channel from the pattern view. pattern data will be kept. -- crossed-arrows button: click and drag to rearrange pattern data throughout the song. +- **Pat**: uncheck the box to hide the channel from the pattern view. pattern data will be kept. +- **Osc**: uncheck the box to hide the channel from the per-channel oscilloscope view. +- **Swap**: click and drag to rearrange pattern data throughout the song. - note: this does **not** move channels around! it only moves the channel's pattern data. - **Name**: the name displayed at the top of each channel in the pattern view. - the next setting is "short name", which is displayed in the orders view and/or when a channel is collapsed. diff --git a/doc/8-advanced/chanosc.md b/doc/8-advanced/chanosc.md index 6a2cd27ed..54163dfb3 100644 --- a/doc/8-advanced/chanosc.md +++ b/doc/8-advanced/chanosc.md @@ -14,6 +14,7 @@ right-clicking the view will display the configuration view shown above: - **Mode 2**: bias slightly toward more columns. - **Mode 3**: always more columns than rows. - **Amplitude**: scales amplitude for all oscilloscope views. +- **Line size**: controls line thickness. - **Gradient**: this allows you to use a gradient for determining the waveforms' colors instead of a single color. see the gradient section for more information. - if this option is off, a color selector will be displayed. right-click on it for some options: - select between the square selector and the color wheel selector. diff --git a/doc/8-advanced/chip-manager.md b/doc/8-advanced/chip-manager.md index 41a187fd9..09388e802 100644 --- a/doc/8-advanced/chip-manager.md +++ b/doc/8-advanced/chip-manager.md @@ -8,6 +8,8 @@ the **chip manager** window allows you to manage chips, including adding, changi **Clone channel data**: when cloning chips, also copy patterns, pattern names, channel names and other parameters to the clone. +**Clone at end**: instead of inserting the clone directly after the cloned chip, add it to the end. + to move a chip around, click and drag the ![crossed-arrows](chip-manager-move.png) button to the left. to duplicate a chip, click the **Clone** button. diff --git a/doc/8-advanced/user-systems.md b/doc/8-advanced/user-systems.md new file mode 100644 index 000000000..d60772654 --- /dev/null +++ b/doc/8-advanced/user-systems.md @@ -0,0 +1,22 @@ +# user systems + +combinations of chips and chip configurations can be stored as **user systems** – presets that are easily accessed when starting a new song. + +![user systems window](user-systems.png) + +the `+` button at the top of the **Systems** list will add a new system. + +next to the **Name** field, the **Remove** button removes the current system from the list. + +chip configuration is exactly as in the [chip manager](chip-manager.md) window. + +the **Advanced** field stores additional settings that are set when a new song is started. these are listed in "option=value" format, one per line. +- `tickRate`: sets tick rate. + +**Save and Close**: as it says. + +**Import**: opens a dialog to select a `.cfgu` file, then adds its systems to the list. + +**Import (replace)**: opens a similar dialog, then clears the existing systems list and replaces it with the imported one. + +**Export**: stores the current list of systems in a selected `.cfgu` file. \ No newline at end of file diff --git a/doc/8-advanced/user-systems.png b/doc/8-advanced/user-systems.png new file mode 100644 index 0000000000000000000000000000000000000000..c300530a3178e4d451ba5ad1b614103f3bb5e5dd GIT binary patch literal 35024 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⁢3y(mHZo$4Y@dIx6aVcNiXlh#z0s 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