Merge branch 'master' of https://github.com/tildearrow/furnace into SID3

This commit is contained in:
LTVA1 2024-08-28 13:13:12 +03:00
commit c50c2ea528
55 changed files with 252849 additions and 60493 deletions

View file

@ -11,7 +11,7 @@ defaults:
shell: bash shell: bash
env: env:
BUILD_TYPE: Debug BUILD_TYPE: Release
jobs: jobs:
build: build:
@ -231,8 +231,10 @@ jobs:
cp -vr ../po/locale locale cp -vr ../po/locale locale
cp -vr ../papers ../${binPath}/furnace.exe ./ cp -vr ../papers ../${binPath}/furnace.exe ./
if [ '${{ matrix.config.compiler }}' == 'msvc' ]; then if [ '${{ matrix.config.compiler }}' == 'msvc' ]; then
if [ -e ../${binPath}/furnace.pdb ]; then
cp -v ../${binPath}/furnace.pdb ./ cp -v ../${binPath}/furnace.pdb ./
fi fi
fi
sha256sum ../${binPath}/furnace.exe > checksum.txt sha256sum ../${binPath}/furnace.exe > checksum.txt
popd popd

View file

@ -16,7 +16,7 @@ set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_PROJECT_VERSION_MAJOR 0) set(CMAKE_PROJECT_VERSION_MAJOR 0)
set(CMAKE_PROJECT_VERSION_MINOR 6) set(CMAKE_PROJECT_VERSION_MINOR 6)
set(CMAKE_PROJECT_VERSION_PATCH 5) set(CMAKE_PROJECT_VERSION_PATCH 6)
set(BUILD_GUI_DEFAULT ON) set(BUILD_GUI_DEFAULT ON)
set(USE_SDL2_DEFAULT ON) set(USE_SDL2_DEFAULT ON)

View file

@ -15,8 +15,8 @@ android {
} }
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 26 targetSdkVersion 26
versionCode 214 versionCode 218
versionName "0.6.5" versionName "0.6.6"
externalNativeBuild { externalNativeBuild {
cmake { cmake {
arguments "-DANDROID_APP_PLATFORM=android-21", "-DANDROID_STL=c++_static", "-DWARNINGS_ARE_ERRORS=ON", "-DWITH_LOCALE=ON", "-DUSE_MOMO=ON" arguments "-DANDROID_APP_PLATFORM=android-21", "-DANDROID_STL=c++_static", "-DWARNINGS_ARE_ERRORS=ON", "-DWITH_LOCALE=ON", "-DUSE_MOMO=ON"

View file

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.tildearrow.furnace" package="org.tildearrow.furnace"
android:versionCode="214" android:versionCode="218"
android:versionName="0.6.5" android:versionName="0.6.6"
android:installLocation="auto"> android:installLocation="auto">
<!-- OpenGL ES 2.0 --> <!-- OpenGL ES 2.0 -->

View file

@ -12,6 +12,8 @@
**asset**: an instrument, wavetable or sample. **asset**: an instrument, wavetable or sample.
**bit**: a single binary on-off value.
**bitbang**: to achieve PCM sound by sending a rapid stream of volume commands to a non-PCM channel. **bitbang**: to achieve PCM sound by sending a rapid stream of volume commands to a non-PCM channel.
**bitmask**: a set of bits which represent individual single-bit toggles or groups representing small numbers. these are explained fully in the [hexadecimal primer](hex.md). **bitmask**: a set of bits which represent individual single-bit toggles or groups representing small numbers. these are explained fully in the [hexadecimal primer](hex.md).
@ -72,6 +74,8 @@
**LFO**: low frequency oscillator. a wave with a slow period (often below hearing range) used to alter other sounds. **LFO**: low frequency oscillator. a wave with a slow period (often below hearing range) used to alter other sounds.
**LFSR**: linear-feedback shift register. a method to generate pseudo-random noise that loops, also known as "periodic noise". within a sequence of on-off bits, it does math to combine the bits at specified locations called "taps", then shifts the whole sequence and adds the resulting bit on the end, guaranteeing a different state for the next pass. depending on the locations of the taps, different lengths of noise loops are generated; for short loops, this will affect their tone.
**macro**: a sequence of values automatically applied while a note plays. **macro**: a sequence of values automatically applied while a note plays.
**noise bass**: the technique of using a PSG's periodic noise generator with a very short period to create low-frequency sounds. **noise bass**: the technique of using a PSG's periodic noise generator with a very short period to create low-frequency sounds.
@ -86,7 +90,7 @@
**period**: the length of a repeating waveform. as frequency rises, the period shortens. **period**: the length of a repeating waveform. as frequency rises, the period shortens.
**periodic noise**: an approximation of random noise generated algorithmically. **periodic noise**: an approximation of random noise generated algorithmically with an LFSR.
- the period is the number of values generated until the algorithm repeats itself. - the period is the number of values generated until the algorithm repeats itself.
**phase reset**: to restart a waveform at its initial value. **phase reset**: to restart a waveform at its initial value.
@ -128,6 +132,8 @@
**supersaw**: a sound made up of multiple saw waves at slightly different frequencies to achieve a chorusing effect. **supersaw**: a sound made up of multiple saw waves at slightly different frequencies to achieve a chorusing effect.
**tap**: a specified bit location within an LFSR.
**tick rate**: the number of times per second that the sound engine moves forward. all notes and effects are quantized to this rate. **tick rate**: the number of times per second that the sound engine moves forward. all notes and effects are quantized to this rate.
- this usually corresponds to the frame rate the system uses for video, approximately 60 for NTSC and 50 for PAL. - this usually corresponds to the frame rate the system uses for video, approximately 60 for NTSC and 50 for PAL.

View file

@ -13,10 +13,12 @@ buttons from left to right:
- right-clicking always brings up the menu. - right-clicking always brings up the menu.
- **Duplicate**: duplicates the currently selected instrument. - **Duplicate**: duplicates the currently selected instrument.
- **Open**: brings up a file dialog to load a file as a new instrument at the end of the list. - **Open**: brings up a file dialog to load a file as a new instrument at the end of the list.
- if the file is an instrument bank, a dialog will appear to select which instruments to load.
- **Save**: brings up a file dialog to save the currently selected instrument. - **Save**: brings up a file dialog to save the currently selected instrument.
- instruments are saved as Furnace instrument (.fui) files. - instruments are saved as Furnace instrument (.fui) files.
- right-clicking brings up a menu with the following options: - right-clicking brings up a menu with the following options:
- **save instrument as .dmp...**: saves the selected instrument in DefleMask format. - **save instrument as .dmp...**: saves the selected instrument in DefleMask format.
- **save all instruments...**: saves all instruments to the selected folder as .fui files.
- **Toggle folders/standard view**: enables (and disables) folder view, explained below. - **Toggle folders/standard view**: enables (and disables) folder view, explained below.
- **Move up**: moves the currently selected instrument up in the list. pattern data will automatically be adjusted to match. - **Move up**: moves the currently selected instrument up in the list. pattern data will automatically be adjusted to match.
- **Move down**: same, but downward. - **Move down**: same, but downward.
@ -41,9 +43,10 @@ everything from the instrument list applies here also, with one major difference
wavetables are saved as Furnace wavetable (.fuw) files. wavetables are saved as Furnace wavetable (.fuw) files.
- right-clicking the Save button brings up a menu with the following options: right-clicking the Save button brings up a menu with the following options:
- **save wavetable as .dmw...**: saves the selected wavetable in DefleMask format. - **save wavetable as .dmw...**: saves the selected wavetable in DefleMask format.
- **save raw wavetable...**: saves the selected wavetable as raw data. - **save raw wavetable...**: saves the selected wavetable as raw data.
- **save all wavetables...**: saves all wavetables to the selected folder as .fuw files.
## sample list ## sample list
@ -57,6 +60,7 @@ samples are saved as standard wave (.wav) files.
right-clicking the Save button brings up a menu with the following options: right-clicking the Save button brings up a menu with the following options:
- **save raw sample...**: saves the selected sample as raw data. - **save raw sample...**: saves the selected sample as raw data.
- **save all samples...**: saves all samples to the selected folder as .wav files.
right-clicking a sample in the list brings up a menu: right-clicking a sample in the list brings up a menu:
- **make instrument**: creates a new instrument which is set to use the selected sample. - **make instrument**: creates a new instrument which is set to use the selected sample.

View file

@ -68,6 +68,13 @@ the following settings are available:
- **loop**: enables loop. if disabled, the song won't loop. - **loop**: enables loop. if disabled, the song won't loop.
- **optimize size**: removes unnecessary commands to reduce size. - **optimize size**: removes unnecessary commands to reduce size.
## ROM
depending on the system, this option may appear to allow you to export your song to a working ROM image or code that can be built into one. export options are explained in the system's accompanying documentation.
currently, only one system can be exported this way:
- [Atari 2600 (TIunA)](../7-systems/tia.md)
## text ## text
this option allows you to export your song as a text file. this option allows you to export your song as a text file.

View file

@ -152,6 +152,7 @@ the keys in the "Global hotkeys" section can be used in any window, although not
| Expand song | — | | Expand song | — |
| Set note input latch | — | | Set note input latch | — |
| Clear note input latch | — | | Clear note input latch | — |
| Absorb instrument/octave from status at cursor | — |
| | | | | |
| **Instrument list** | | | **Instrument list** | |
| Add instrument | `Insert` | | Add instrument | `Insert` |

View file

@ -93,6 +93,10 @@ settings are saved when clicking the **OK** or **Apply** buttons at the bottom o
- **Export**: select an `.ini` file to save current settings. - **Export**: select an `.ini` file to save current settings.
- **Factory Reset**: resets all settings to default and purges settings backups. - **Factory Reset**: resets all settings to default and purges settings backups.
### Import
- **Use OPL3 instead of OPL2 for S3M import**: changes which system is used for the import of S3M files that contain FM channels.
## Audio ## Audio
### Output ### Output

View file

@ -15,9 +15,16 @@ however, effects are continuous (unless specified), which means you only need to
- `F8xx`: **Single tick volume up.** adds `x` to volume. - `F8xx`: **Single tick volume up.** adds `x` to volume.
- `F9xx`: **Single tick volume down.** subtracts `x` from volume. - `F9xx`: **Single tick volume down.** subtracts `x` from volume.
- --- - ---
- `D3xx`: **Volume portamento.** slides volume toward the new value instead of jumping immediately. `x` is the speed of the slide.
- `D4xx`: **Volume portamento (fast).** same as `D3xx` but 256× faster.
- ---
- `07xy`: **Tremolo.** changes volume to be "wavy" with a sine LFO. `x` is the speed. `y` is the depth. - `07xy`: **Tremolo.** changes volume to be "wavy" with a sine LFO. `x` is the speed. `y` is the depth.
- tremolo is downward only. - tremolo is downward only.
- maximum tremolo depth is -60 volume steps. - maximum tremolo depth is -60 volume steps.
- ---
- `D3xx`: **Volume portamento.** slides the volume to the one specified in the volume column. `x` is the slide speed.
- a volume _must_ be present with this effect for it to work.
- `D4xx`: **Volume portamento (fast).** like `D3xx` but four times faster.
## pitch ## pitch

View file

@ -72,6 +72,10 @@ the following options are available in the Chip Manager window:
- DPCM: the default mode, playing 1-bit DPCM samples as supported by the hardware. - DPCM: the default mode, playing 1-bit DPCM samples as supported by the hardware.
- PCM: this mode provides crispier samples by writing the delta counter directly. uses a lot of CPU time in console. - PCM: this mode provides crispier samples by writing the delta counter directly. uses a lot of CPU time in console.
## DPCM sample loop
due to hardware limitations, a loop in a DPCM sample must start on a multiple of 512 samples (512, 1024, 1536...) and have a length that is a multiple of 128 plus 8 samples (136, 264, 392...)
## short noise frequencies (NTSC) ## short noise frequencies (NTSC)
note | arpeggio | fundamental | MIDI note | pitch note | arpeggio | fundamental | MIDI note | pitch

View file

@ -27,13 +27,9 @@ Furnace isn't complete without this one...
- `E`: low pure buzzy - `E`: low pure buzzy
- `F`: low reedy - `F`: low reedy
## ROM export
a song can be exported to assembly code for use with the TIunA software driver for the Atari 2600. see [TIunA on GitHub](https://github.com/AYCEdemo/twin-tiuna) for explanations of the export options.
## info
this chip uses the [TIA](../4-instrument/tia.md) instrument editor.
the arp macro's fixed mode operates differently, writing the direct pitch to the chip. here's a list of pitches.
## chip config ## chip config
@ -47,6 +43,12 @@ the following options are available in the Chip Manager window:
- **Stereo**: output two channels on left and right. - **Stereo**: output two channels on left and right.
- **PAL**: run slower blah blah blah - **PAL**: run slower blah blah blah
## info
this chip uses the [TIA](../4-instrument/tia.md) instrument editor.
the arp macro's fixed mode operates differently, writing the direct pitch to the chip. here's a list of pitches.
### shape 1 ### shape 1
| pitch | NTSC | note | cent | PAL | note | cent | pitch | NTSC | note | cent | PAL | note | cent

View file

@ -68,9 +68,13 @@ in most arcade boards the chip was used in combination with a PCM chip, like [Se
- `5Dxx`: **set D2R/SR of operator 2.** - `5Dxx`: **set D2R/SR of operator 2.**
- `5Exx`: **set D2R/SR of operator 3.** - `5Exx`: **set D2R/SR of operator 3.**
- `5Fxx`: **set D2R/SR of operator 4.** - `5Fxx`: **set D2R/SR of operator 4.**
- `60xx`: **set operator mask.** - `60xy`: **set operator mask.**
- `xx` goes from `0` to `F`. it is a bitfield. - enables or disables operators.
- each bit corresponds to an operator. - if `x` is `0`, `y` ranges from `0` to `F`. it is a bitfield, so `y` is the sum of the active operators' bits:
- OP1 is +1, OP2 is +2, OP3 is +4, and OP4 is +8.
- for example, having only OP2 and OP4 on would be 2 + 8 = 10, resulting in an `xy` value of `0A`.
- if `x` is `1` to `4`, the effect targets that operator; `y` turns it off with a value of `0` and on with a value of `1`.
- for example, the effect `6031` enables OP3.
## info ## info

View file

@ -99,9 +99,13 @@ several variants of this chip were released as well, with more features.
- `5Dxx`: **set D2R/SR of operator 2.** - `5Dxx`: **set D2R/SR of operator 2.**
- `5Exx`: **set D2R/SR of operator 3.** - `5Exx`: **set D2R/SR of operator 3.**
- `5Fxx`: **set D2R/SR of operator 4.** - `5Fxx`: **set D2R/SR of operator 4.**
- `60xx`: **set operator mask.** - `60xy`: **set operator mask.**
- `xx` goes from `0` to `F`. it is a bitfield. - enables or disables operators.
- each bit corresponds to an operator. - if `x` is `0`, `y` ranges from `0` to `F`. it is a bitfield, so `y` is the sum of the active operators' bits:
- OP1 is +1, OP2 is +2, OP3 is +4, and OP4 is +8.
- for example, having only OP2 and OP4 on would be 2 + 8 = 10, resulting in an `xy` value of `0A`.
- if `x` is `1` to `4`, the effect targets that operator; `y` turns it off with a value of `0` and on with a value of `1`.
- for example, the effect `6031` enables OP3.
## extended channel 3 ## extended channel 3

View file

@ -99,9 +99,13 @@ the YM2610 (OPNB) and YM2610B chips are very similar to this one, but the built-
- `5Dxx`: **set D2R/SR of operator 2.** - `5Dxx`: **set D2R/SR of operator 2.**
- `5Exx`: **set D2R/SR of operator 3.** - `5Exx`: **set D2R/SR of operator 3.**
- `5Fxx`: **set D2R/SR of operator 4.** - `5Fxx`: **set D2R/SR of operator 4.**
- `60xx`: **set operator mask.** - `60xy`: **set operator mask.**
- `xx` goes from `0` to `F`. it is a bitfield. - enables or disables operators.
- each bit corresponds to an operator. - if `x` is `0`, `y` ranges from `0` to `F`. it is a bitfield, so `y` is the sum of the active operators' bits:
- OP1 is +1, OP2 is +2, OP3 is +4, and OP4 is +8.
- for example, having only OP2 and OP4 on would be 2 + 8 = 10, resulting in an `xy` value of `0A`.
- if `x` is `1` to `4`, the effect targets that operator; `y` turns it off with a value of `0` and on with a value of `1`.
- for example, the effect `6031` enables OP3.
## extended channel 3 ## extended channel 3

View file

@ -97,9 +97,13 @@ its soundchip is a 4-in-1: 4ch 4-op FM, YM2149 (AY-3-8910 clone) and [2 differen
- `5Dxx`: **set D2R/SR of operator 2.** - `5Dxx`: **set D2R/SR of operator 2.**
- `5Exx`: **set D2R/SR of operator 3.** - `5Exx`: **set D2R/SR of operator 3.**
- `5Fxx`: **set D2R/SR of operator 4.** - `5Fxx`: **set D2R/SR of operator 4.**
- `60xx`: **set operator mask.** - `60xy`: **set operator mask.**
- `xx` goes from `0` to `F`. it is a bitfield. - enables or disables operators.
- each bit corresponds to an operator. - if `x` is `0`, `y` ranges from `0` to `F`. it is a bitfield, so `y` is the sum of the active operators' bits:
- OP1 is +1, OP2 is +2, OP3 is +4, and OP4 is +8.
- for example, having only OP2 and OP4 on would be 2 + 8 = 10, resulting in an `xy` value of `0A`.
- if `x` is `1` to `4`, the effect targets that operator; `y` turns it off with a value of `0` and on with a value of `1`.
- for example, the effect `6031` enables OP3.
## extended channel 2 ## extended channel 2

View file

@ -96,9 +96,13 @@ it is backward compatible with the original chip.
- `5Dxx`: **set D2R/SR of operator 2.** - `5Dxx`: **set D2R/SR of operator 2.**
- `5Exx`: **set D2R/SR of operator 3.** - `5Exx`: **set D2R/SR of operator 3.**
- `5Fxx`: **set D2R/SR of operator 4.** - `5Fxx`: **set D2R/SR of operator 4.**
- `60xx`: **set operator mask.** - `60xy`: **set operator mask.**
- `xx` goes from `0` to `F`. it is a bitfield. - enables or disables operators.
- each bit corresponds to an operator. - if `x` is `0`, `y` ranges from `0` to `F`. it is a bitfield, so `y` is the sum of the active operators' bits:
- OP1 is +1, OP2 is +2, OP3 is +4, and OP4 is +8.
- for example, having only OP2 and OP4 on would be 2 + 8 = 10, resulting in an `xy` value of `0A`.
- if `x` is `1` to `4`, the effect targets that operator; `y` turns it off with a value of `0` and on with a value of `1`.
- for example, the effect `6031` enables OP3.
## extended channel 3 ## extended channel 3

View file

@ -82,9 +82,13 @@ thanks to the Z80 sound CPU, DualPCM can play two samples at once! this mode spl
- `5Dxx`: **set D2R/SR of operator 2.** - `5Dxx`: **set D2R/SR of operator 2.**
- `5Exx`: **set D2R/SR of operator 3.** - `5Exx`: **set D2R/SR of operator 3.**
- `5Fxx`: **set D2R/SR of operator 4.** - `5Fxx`: **set D2R/SR of operator 4.**
- `60xx`: **set operator mask.** - `60xy`: **set operator mask.**
- `xx` goes from `0` to `F`. it is a bitfield. - enables or disables operators.
- each bit corresponds to an operator. - if `x` is `0`, `y` ranges from `0` to `F`. it is a bitfield, so `y` is the sum of the active operators' bits:
- OP1 is +1, OP2 is +2, OP3 is +4, and OP4 is +8.
- for example, having only OP2 and OP4 on would be 2 + 8 = 10, resulting in an `xy` value of `0A`.
- if `x` is `1` to `4`, the effect targets that operator; `y` turns it off with a value of `0` and on with a value of `1`.
- for example, the effect `6031` enables OP3.
## info ## info

View file

@ -6,7 +6,7 @@ when copying pattern data from Furnace, it's stored in the clipboard as plain te
org.tildearrow.furnace - Pattern Data (144) org.tildearrow.furnace - Pattern Data (144)
``` ```
this top line of text is always the same except for the number in parentheses, which is the internal build number. for example, 0.6.5 is `215`. this top line of text is always the same except for the number in parentheses, which is the internal build number. for example, 0.6.6 is `218`.
the second line is a number between 0 and 18 (decimal) which indicates which column the clip starts from. the second line is a number between 0 and 18 (decimal) which indicates which column the clip starts from.
- `0`: note. - `0`: note.

View file

@ -32,6 +32,7 @@ these fields are 0 in format versions prior to 100 (0.6pre1).
the format versions are: the format versions are:
- 218: Furnace 0.6.6
- 214: Furnace 0.6.5 - 214: Furnace 0.6.5
- 212: Furnace 0.6.4 - 212: Furnace 0.6.4
- 201: Furnace 0.6.3 - 201: Furnace 0.6.3

16418
po/de.po

File diff suppressed because it is too large Load diff

17689
po/es.po

File diff suppressed because it is too large Load diff

16418
po/fi.po

File diff suppressed because it is too large Load diff

16418
po/fr.po

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

16425
po/hy.po

File diff suppressed because it is too large Load diff

16600
po/id.po

File diff suppressed because it is too large Load diff

16412
po/ja.po

File diff suppressed because it is too large Load diff

17546
po/ko.po

File diff suppressed because it is too large Load diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

16563
po/nl.po

File diff suppressed because it is too large Load diff

18027
po/pl.po

File diff suppressed because it is too large Load diff

17696
po/pt_BR.po

File diff suppressed because it is too large Load diff

15167
po/ru.po

File diff suppressed because it is too large Load diff

16435
po/sk.po

File diff suppressed because it is too large Load diff

17887
po/sv.po

File diff suppressed because it is too large Load diff

16557
po/th.po

File diff suppressed because it is too large Load diff

16418
po/tr.po

File diff suppressed because it is too large Load diff

16424
po/uk.po

File diff suppressed because it is too large Load diff

16514
po/zh.po

File diff suppressed because it is too large Load diff

16514
po/zh_HK.po

File diff suppressed because it is too large Load diff

View file

@ -15,17 +15,17 @@
<key>CFBundleInfoDictionaryVersion</key> <key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string> <string>6.0</string>
<key>CFBundleLongVersionString</key> <key>CFBundleLongVersionString</key>
<string>0.6.5</string> <string>0.6.6</string>
<key>CFBundleName</key> <key>CFBundleName</key>
<string>Furnace</string> <string>Furnace</string>
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>0.6.5</string> <string>0.6.6</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>0.6.5</string> <string>0.6.6</string>
<key>NSHumanReadableCopyright</key> <key>NSHumanReadableCopyright</key>
<string></string> <string></string>
<key>NSHighResolutionCapable</key> <key>NSHighResolutionCapable</key>

View file

@ -325,7 +325,7 @@ if __name__ == "__main__":
<h1>Furnace<br/>User Manual</h1> <h1>Furnace<br/>User Manual</h1>
</div> </div>
<div> <div>
<i>for version 0.6.5</i> <i>for version 0.6.6</i>
</div> </div>
</section> </section>
<section id="authors"> <section id="authors">
@ -348,7 +348,7 @@ if __name__ == "__main__":
<p>this documentation is under the <a href="https://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 Unported</a> license.</p> <p>this documentation is under the <a href="https://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 Unported</a> license.</p>
<p>you may reproduce, modify and/or distribute this documentation provided this copyright notice (including license and attribution) is present and any necessary disclaimers whether modifications have been made.</p> <p>you may reproduce, modify and/or distribute this documentation provided this copyright notice (including license and attribution) is present and any necessary disclaimers whether modifications have been made.</p>
<p>this documentation is provided as-is and without warranty of any kind.</p> <p>this documentation is provided as-is and without warranty of any kind.</p>
<p>this manual is written for version 0.6.5 of Furnace.<br/>it may not necessarily apply to previous or future versions.</p> <p>this manual is written for version 0.6.6 of Furnace.<br/>it may not necessarily apply to previous or future versions.</p>
</section> </section>
<section id="index"> <section id="index">
%s %s

View file

@ -1,6 +1,6 @@
1 VERSIONINFO 1 VERSIONINFO
FILEVERSION 0,6,5,0 FILEVERSION 0,6,6,0
PRODUCTVERSION 0,6,5,0 PRODUCTVERSION 0,6,6,0
{ {
BLOCK "VarFileInfo" BLOCK "VarFileInfo"
{ {
@ -33,10 +33,10 @@
"Furnace" "Furnace"
VALUE "ProductVersion", VALUE "ProductVersion",
"0.6.5" "0.6.6"
VALUE "FileVersion", VALUE "FileVersion",
"0.6.5" "0.6.6"
VALUE "CompanyName", VALUE "CompanyName",
"tildearrow" "tildearrow"

View file

@ -16,7 +16,7 @@ if you find issues (e.g. bugs or annoyances), report them. links below.
- Furnace on GitHub (project page and issue tracker): https://github.com/tildearrow/furnace - Furnace on GitHub (project page and issue tracker): https://github.com/tildearrow/furnace
- issues: https://github.com/tildearrow/furnace/issues - issues: https://github.com/tildearrow/furnace/issues
- discussion: https://github.com/tildearrow/furnace/discussions - discussion: https://github.com/tildearrow/furnace/discussions
- online manual: https://tildearrow.org/furnace/doc/v0.6.5/ - online manual: https://tildearrow.org/furnace/doc/v0.6.6/
# notes # notes

View file

@ -26,7 +26,7 @@ if you find issues (e.g. bugs or annoyances), report them. links below.
- Furnace on GitHub (project page and issue tracker): https://github.com/tildearrow/furnace - Furnace on GitHub (project page and issue tracker): https://github.com/tildearrow/furnace
- issues: https://github.com/tildearrow/furnace/issues - issues: https://github.com/tildearrow/furnace/issues
- discussion: https://github.com/tildearrow/furnace/discussions - discussion: https://github.com/tildearrow/furnace/discussions
- online manual: https://tildearrow.org/furnace/doc/v0.6.5/ - online manual: https://tildearrow.org/furnace/doc/v0.6.6/
# notes # notes

View file

@ -16,8 +16,7 @@ if you find issues (e.g. bugs or annoyances), report them. links below.
- Furnace on GitHub (project page and issue tracker): https://github.com/tildearrow/furnace - Furnace on GitHub (project page and issue tracker): https://github.com/tildearrow/furnace
- issues: https://github.com/tildearrow/furnace/issues - issues: https://github.com/tildearrow/furnace/issues
- discussion: https://github.com/tildearrow/furnace/discussions - discussion: https://github.com/tildearrow/furnace/discussions
- online manual: https://tildearrow.org/furnace/doc/v0.6.5/ - online manual: https://tildearrow.org/furnace/doc/v0.6.6/
# notes # notes
copyright (C) 2021-2024 tildearrow and contributors. copyright (C) 2021-2024 tildearrow and contributors.

View file

@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
FUR_VERSION="0.6.5" FUR_VERSION="0.6.6"
EXPORT_LANGS=("de" "es" "fr" "fi" "hy" "id" "ja" "ko" "nl" "pl" "pt_BR" "ru" "sk" "sv" "th" "tr" "uk" "zh" "zh_HK") EXPORT_LANGS=("de" "es" "fr" "fi" "hy" "id" "ja" "ko" "nl" "pl" "pt_BR" "ru" "sk" "sv" "th" "tr" "uk" "zh" "zh_HK")

View file

@ -52,9 +52,9 @@ class DivWorkPool;
#define EXTERN_BUSY_BEGIN_SOFT e->softLocked=true; e->isBusy.lock(); #define EXTERN_BUSY_BEGIN_SOFT e->softLocked=true; e->isBusy.lock();
#define EXTERN_BUSY_END e->isBusy.unlock(); e->softLocked=false; #define EXTERN_BUSY_END e->isBusy.unlock(); e->softLocked=false;
#define DIV_UNSTABLE //#define DIV_UNSTABLE
#define DIV_VERSION "dev218" #define DIV_VERSION "0.6.6"
#define DIV_ENGINE_VERSION 218 #define DIV_ENGINE_VERSION 218
// for imports // for imports
#define DIV_VERSION_MOD 0xff01 #define DIV_VERSION_MOD 0xff01

View file

@ -127,7 +127,6 @@ struct TiunaMatches {
static void writeCmd(std::vector<TiunaBytes>& cmds, TiunaCmd& cmd, unsigned char ch, int& lastWait, int fromTick, int toTick) { static void writeCmd(std::vector<TiunaBytes>& cmds, TiunaCmd& cmd, unsigned char ch, int& lastWait, int fromTick, int toTick) {
while (fromTick<toTick) { while (fromTick<toTick) {
int val=MIN(toTick-fromTick,256); int val=MIN(toTick-fromTick,256);
assert(val>0);
if (lastWait!=val) { if (lastWait!=val) {
cmd.wait=val; cmd.wait=val;
lastWait=val; lastWait=val;