Merge branch 'master' of https://github.com/tildearrow/furnace into nmk112
95
.github/workflows/build.yml
vendored
|
@ -2,7 +2,7 @@ name: Build furnace
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [master, esfm-contest]
|
branches: master
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: master
|
branches: master
|
||||||
|
|
||||||
|
@ -22,8 +22,8 @@ jobs:
|
||||||
- { name: 'Windows MSVC x86_64', os: windows-latest, compiler: msvc, arch: x86_64 }
|
- { name: 'Windows MSVC x86_64', os: windows-latest, compiler: msvc, arch: x86_64 }
|
||||||
#- { name: 'Windows MinGW x86', os: ubuntu-20.04, compiler: mingw, arch: x86 }
|
#- { name: 'Windows MinGW x86', os: ubuntu-20.04, compiler: mingw, arch: x86 }
|
||||||
#- { name: 'Windows MinGW x86_64', os: ubuntu-20.04, compiler: mingw, arch: x86_64 }
|
#- { name: 'Windows MinGW x86_64', os: ubuntu-20.04, compiler: mingw, arch: x86_64 }
|
||||||
#- { name: 'macOS x86_64', os: macos-latest, arch: x86_64 }
|
- { name: 'macOS x86_64', os: macos-latest, arch: x86_64 }
|
||||||
#- { name: 'macOS ARM', os: macos-latest, arch: arm64 }
|
- { name: 'macOS ARM', os: macos-latest, arch: arm64 }
|
||||||
- { name: 'Linux x86_64', os: ubuntu-20.04, arch: x86_64 }
|
- { name: 'Linux x86_64', os: ubuntu-20.04, arch: x86_64 }
|
||||||
#- { name: 'Linux ARM', os: ubuntu-18.04, arch: armhf }
|
#- { name: 'Linux ARM', os: ubuntu-18.04, arch: armhf }
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
|
@ -33,7 +33,7 @@ jobs:
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3.1.0
|
uses: actions/checkout@v4.1.1
|
||||||
with:
|
with:
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
|
||||||
|
@ -106,7 +106,7 @@ jobs:
|
||||||
|
|
||||||
- name: Setup Toolchain [Windows MSVC]
|
- name: Setup Toolchain [Windows MSVC]
|
||||||
if: ${{ matrix.config.compiler == 'msvc' }}
|
if: ${{ matrix.config.compiler == 'msvc' }}
|
||||||
uses: vadz/gha-setup-vsdevenv@avoid-deprecation-warnings
|
uses: lunathir/gha-setup-vsdevenv@avoid-deprecation-warnings
|
||||||
with:
|
with:
|
||||||
arch: ${{ steps.windows-identify.outputs.vswhere-target }}
|
arch: ${{ steps.windows-identify.outputs.vswhere-target }}
|
||||||
|
|
||||||
|
@ -150,57 +150,6 @@ jobs:
|
||||||
libjack-jackd2-dev:armhf
|
libjack-jackd2-dev:armhf
|
||||||
ls /usr/arm-linux-gnueabihf/lib
|
ls /usr/arm-linux-gnueabihf/lib
|
||||||
|
|
||||||
- name: Configure (System Libraries)
|
|
||||||
if: ${{ runner.os == 'Linux' && matrix.config.compiler != 'mingw' && matrix.config.arch == 'x86_64' }}
|
|
||||||
run: |
|
|
||||||
export USE_WAE=ON
|
|
||||||
export CMAKE_EXTRA_ARGS=()
|
|
||||||
if [ '${{ matrix.config.compiler }}' == 'msvc' ]; then
|
|
||||||
CMAKE_EXTRA_ARGS+=('-DCMAKE_GENERATOR_PLATFORM=${{ steps.windows-identify.outputs.msvc-target }}')
|
|
||||||
elif [ '${{ matrix.config.compiler }}' == 'mingw' ]; then
|
|
||||||
CMAKE_EXTRA_ARGS+=('-DCMAKE_TOOLCHAIN_FILE=scripts/Cross-MinGW-${{ steps.windows-identify.outputs.mingw-target }}.cmake')
|
|
||||||
else
|
|
||||||
# Test with system libs
|
|
||||||
CMAKE_EXTRA_ARGS+=(
|
|
||||||
'-DSYSTEM_FMT=OFF'
|
|
||||||
'-DSYSTEM_LIBSNDFILE=ON'
|
|
||||||
'-DSYSTEM_RTMIDI=ON'
|
|
||||||
'-DSYSTEM_ZLIB=ON'
|
|
||||||
'-DWITH_JACK=ON'
|
|
||||||
)
|
|
||||||
# Too old on Ubuntu
|
|
||||||
if [ '${{ runner.os }}' == 'macOS' ]; then
|
|
||||||
CMAKE_EXTRA_ARGS+=('-DSYSTEM_SDL2=ON')
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
cmake \
|
|
||||||
-B ${PWD}/build \
|
|
||||||
-DCMAKE_INSTALL_PREFIX=${PWD}/target \
|
|
||||||
-DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \
|
|
||||||
-DWARNINGS_ARE_ERRORS=${USE_WAE} \
|
|
||||||
"${CMAKE_EXTRA_ARGS[@]}"
|
|
||||||
|
|
||||||
- name: Build (System Libraries)
|
|
||||||
if: ${{ runner.os == 'Linux' && matrix.config.compiler != 'mingw' && matrix.config.arch == 'x86_64' }}
|
|
||||||
run: |
|
|
||||||
cmake \
|
|
||||||
--build ${PWD}/build \
|
|
||||||
--config ${{ env.BUILD_TYPE }} \
|
|
||||||
--parallel ${{ steps.build-cores.outputs.amount }}
|
|
||||||
|
|
||||||
- name: Install (System Libraries)
|
|
||||||
if: ${{ runner.os == 'Linux' && matrix.config.compiler != 'mingw' && matrix.config.arch == 'x86_64' }}
|
|
||||||
run: |
|
|
||||||
cmake \
|
|
||||||
--install ${PWD}/build \
|
|
||||||
--config ${{ env.BUILD_TYPE }}
|
|
||||||
|
|
||||||
- name: Cleanup (System Libraries)
|
|
||||||
if: ${{ runner.os == 'Linux' && matrix.config.compiler != 'mingw' && matrix.config.arch == 'x86_64' }}
|
|
||||||
run: |
|
|
||||||
rm -rf build/ target/
|
|
||||||
|
|
||||||
- name: Configure
|
- name: Configure
|
||||||
run: |
|
run: |
|
||||||
export USE_WAE=ON
|
export USE_WAE=ON
|
||||||
|
@ -284,15 +233,31 @@ jobs:
|
||||||
if: ${{ runner.os == 'macOS' }}
|
if: ${{ runner.os == 'macOS' }}
|
||||||
run: |
|
run: |
|
||||||
pushd build
|
pushd build
|
||||||
cpack
|
retries=0
|
||||||
|
while ! cpack; do
|
||||||
|
echo "TRYING AGAIN..."
|
||||||
|
retries=$((retries+1))
|
||||||
|
if [ $retries -gt 5 ]; then
|
||||||
|
echo "OH NO, WE'VE FAILED..."
|
||||||
|
exit 1
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "making dirs"
|
||||||
mkdir orig
|
mkdir orig
|
||||||
mkdir new
|
mkdir new
|
||||||
|
echo "attaching"
|
||||||
echo "y" | hdiutil attach Furnace-*-Darwin.dmg -readonly -mount required -mountpoint orig
|
echo "y" | hdiutil attach Furnace-*-Darwin.dmg -readonly -mount required -mountpoint orig
|
||||||
|
|
||||||
|
echo "copying"
|
||||||
cp -v -r orig/Furnace.app new/Furnace.app
|
cp -v -r orig/Furnace.app new/Furnace.app
|
||||||
|
echo "synchronizing"
|
||||||
|
sync
|
||||||
|
echo "detaching"
|
||||||
hdiutil detach orig
|
hdiutil detach orig
|
||||||
|
|
||||||
|
echo "removing orig"
|
||||||
rmdir orig
|
rmdir orig
|
||||||
rm Furnace-*-Darwin.dmg
|
rm Furnace-*-Darwin.dmg
|
||||||
|
|
||||||
|
@ -301,6 +266,7 @@ jobs:
|
||||||
rmdir new/Furnace.app/Contents/Resources/bin
|
rmdir new/Furnace.app/Contents/Resources/bin
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
echo "copying extra stuff"
|
||||||
cp -v ../LICENSE new/LICENSE.txt
|
cp -v ../LICENSE new/LICENSE.txt
|
||||||
cp -v ../res/releaseReadme/stable-mac.txt new/README
|
cp -v ../res/releaseReadme/stable-mac.txt new/README
|
||||||
cp -v -r ../demos new/demos
|
cp -v -r ../demos new/demos
|
||||||
|
@ -310,7 +276,18 @@ jobs:
|
||||||
wget https://tildearrow.org/furnace/doc/latest/manual.pdf
|
wget https://tildearrow.org/furnace/doc/latest/manual.pdf
|
||||||
cd ..
|
cd ..
|
||||||
|
|
||||||
hdiutil create -srcfolder new -volname Furnace -format UDZO furnace.dmg
|
echo "creating new image"
|
||||||
|
retries=0
|
||||||
|
while ! hdiutil create -srcfolder new -volname Furnace -format UDZO furnace.dmg; do
|
||||||
|
echo "TRYING AGAIN..."
|
||||||
|
retries=$((retries+1))
|
||||||
|
if [ $retries -gt 5 ]; then
|
||||||
|
echo "OH NO, WE'VE FAILED..."
|
||||||
|
exit 1
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
sleep 5
|
||||||
|
done
|
||||||
|
|
||||||
mv furnace.dmg ../${{ steps.package-identify.outputs.filename }}
|
mv furnace.dmg ../${{ steps.package-identify.outputs.filename }}
|
||||||
popd
|
popd
|
||||||
|
@ -356,7 +333,7 @@ jobs:
|
||||||
|
|
||||||
- name: Upload artifact
|
- name: Upload artifact
|
||||||
if: ${{ github.repository == 'tildearrow/furnace' && github.ref_name == 'master' }}
|
if: ${{ github.repository == 'tildearrow/furnace' && github.ref_name == 'master' }}
|
||||||
uses: actions/upload-artifact@v3.1.1
|
uses: actions/upload-artifact@v4.3.0
|
||||||
with:
|
with:
|
||||||
name: ${{ steps.package-identify.outputs.id }}
|
name: ${{ steps.package-identify.outputs.id }}
|
||||||
path: ${{ steps.package-identify.outputs.filename }}
|
path: ${{ steps.package-identify.outputs.filename }}
|
||||||
|
|
|
@ -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 0)
|
set(CMAKE_PROJECT_VERSION_PATCH 1)
|
||||||
|
|
||||||
set(BUILD_GUI_DEFAULT ON)
|
set(BUILD_GUI_DEFAULT ON)
|
||||||
set(USE_SDL2_DEFAULT ON)
|
set(USE_SDL2_DEFAULT ON)
|
||||||
|
@ -198,14 +198,14 @@ if (BUILD_GUI AND USE_FREETYPE)
|
||||||
# TODO: FIX FIX FIX FIX FIX
|
# TODO: FIX FIX FIX FIX FIX
|
||||||
if (SYSTEM_FREETYPE)
|
if (SYSTEM_FREETYPE)
|
||||||
if (PKG_CONFIG_FOUND)
|
if (PKG_CONFIG_FOUND)
|
||||||
pkg_check_modules(FREETYPE freetype>=2.0.0)
|
pkg_check_modules(FREETYPE freetype2>=2.0.0)
|
||||||
if (FREETYPE_FOUND)
|
if (FREETYPE_FOUND)
|
||||||
list(APPEND DEPENDENCIES_INCLUDE_DIRS ${FMT_INCLUDE_DIRS})
|
list(APPEND DEPENDENCIES_INCLUDE_DIRS ${FREETYPE_INCLUDE_DIRS})
|
||||||
list(APPEND DEPENDENCIES_COMPILE_OPTIONS ${FMT_CFLAGS_OTHER})
|
list(APPEND DEPENDENCIES_COMPILE_OPTIONS ${FREETYPE_CFLAGS_OTHER})
|
||||||
list(APPEND DEPENDENCIES_LIBRARIES ${FMT_LIBRARIES})
|
list(APPEND DEPENDENCIES_LIBRARIES ${FREETYPE_LIBRARIES})
|
||||||
list(APPEND DEPENDENCIES_LIBRARY_DIRS ${FMT_LIBRARY_DIRS})
|
list(APPEND DEPENDENCIES_LIBRARY_DIRS ${FREETYPE_LIBRARY_DIRS})
|
||||||
list(APPEND DEPENDENCIES_LINK_OPTIONS ${FMT_LDFLAGS_OTHER})
|
list(APPEND DEPENDENCIES_LINK_OPTIONS ${FREETYPE_LDFLAGS_OTHER})
|
||||||
list(APPEND DEPENDENCIES_LEGACY_LDFLAGS ${FMT_LDFLAGS})
|
list(APPEND DEPENDENCIES_LEGACY_LDFLAGS ${FREETYPE_LDFLAGS})
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
if (NOT FREETYPE_FOUND)
|
if (NOT FREETYPE_FOUND)
|
||||||
|
@ -495,6 +495,8 @@ extern/YMF276-LLE/fmopn2.c
|
||||||
extern/ESFMu/esfm.c
|
extern/ESFMu/esfm.c
|
||||||
extern/ESFMu/esfm_registers.c
|
extern/ESFMu/esfm_registers.c
|
||||||
|
|
||||||
|
extern/pwrnoise/pwrnoise.c
|
||||||
|
|
||||||
src/pch.cpp
|
src/pch.cpp
|
||||||
|
|
||||||
src/engine/platform/sound/sn76496.cpp
|
src/engine/platform/sound/sn76496.cpp
|
||||||
|
@ -703,6 +705,7 @@ src/engine/platform/k053260.cpp
|
||||||
src/engine/platform/ted.cpp
|
src/engine/platform/ted.cpp
|
||||||
src/engine/platform/c140.cpp
|
src/engine/platform/c140.cpp
|
||||||
src/engine/platform/esfm.cpp
|
src/engine/platform/esfm.cpp
|
||||||
|
src/engine/platform/powernoise.cpp
|
||||||
src/engine/platform/pcmdac.cpp
|
src/engine/platform/pcmdac.cpp
|
||||||
src/engine/platform/dummy.cpp
|
src/engine/platform/dummy.cpp
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@ for other operating systems, you may [build the source](#developer-info).
|
||||||
- YM3812 (OPL2)
|
- YM3812 (OPL2)
|
||||||
- YMF262 (OPL3) with full 4-op support!
|
- YMF262 (OPL3) with full 4-op support!
|
||||||
- Y8950 (OPL with ADPCM)
|
- Y8950 (OPL with ADPCM)
|
||||||
|
- ESS ESFM (like OPL3 but with more features)
|
||||||
- square wave chips:
|
- square wave chips:
|
||||||
- AY-3-8910/YM2149(F) used in several computers and game consoles
|
- AY-3-8910/YM2149(F) used in several computers and game consoles
|
||||||
- Commodore VIC used in the VIC-20
|
- Commodore VIC used in the VIC-20
|
||||||
|
@ -86,6 +87,7 @@ for other operating systems, you may [build the source](#developer-info).
|
||||||
- modern/fantasy:
|
- modern/fantasy:
|
||||||
- Commander X16 VERA
|
- Commander X16 VERA
|
||||||
- tildearrow Sound Unit
|
- tildearrow Sound Unit
|
||||||
|
- PowerNoise
|
||||||
- Generic PCM DAC
|
- Generic PCM DAC
|
||||||
- mix and match sound chips!
|
- mix and match sound chips!
|
||||||
- over 200 ready to use presets from computers, game consoles and arcade boards...
|
- over 200 ready to use presets from computers, game consoles and arcade boards...
|
||||||
|
|
8
TODO.md
|
@ -1,13 +1,5 @@
|
||||||
# to-do
|
# to-do
|
||||||
|
|
||||||
- finish color import improvements (settings refactor)
|
|
||||||
- new undo stuff
|
|
||||||
- fix some bugs
|
|
||||||
- finish auto-clone
|
- finish auto-clone
|
||||||
|
|
||||||
once you have done all of this (maybe not the first one), release 0.6.1
|
|
||||||
|
|
||||||
# and then
|
|
||||||
|
|
||||||
- new oscilloscope renderer - custom code that uses texture and fixes two issues: too many vertices, and broken anti-aliasing
|
- new oscilloscope renderer - custom code that uses texture and fixes two issues: too many vertices, and broken anti-aliasing
|
||||||
- new pattern renderer - performance improvements
|
- new pattern renderer - performance improvements
|
||||||
|
|
|
@ -15,8 +15,8 @@ android {
|
||||||
}
|
}
|
||||||
minSdkVersion 21
|
minSdkVersion 21
|
||||||
targetSdkVersion 26
|
targetSdkVersion 26
|
||||||
versionCode 181
|
versionCode 192
|
||||||
versionName "0.6"
|
versionName "0.6.1"
|
||||||
externalNativeBuild {
|
externalNativeBuild {
|
||||||
cmake {
|
cmake {
|
||||||
arguments "-DANDROID_APP_PLATFORM=android-21", "-DANDROID_STL=c++_static", "-DWARNINGS_ARE_ERRORS=ON"
|
arguments "-DANDROID_APP_PLATFORM=android-21", "-DANDROID_STL=c++_static", "-DWARNINGS_ARE_ERRORS=ON"
|
||||||
|
|
|
@ -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="181"
|
android:versionCode="192"
|
||||||
android:versionName="0.6"
|
android:versionName="0.6.1"
|
||||||
android:installLocation="auto">
|
android:installLocation="auto">
|
||||||
|
|
||||||
<!-- OpenGL ES 2.0 -->
|
<!-- OpenGL ES 2.0 -->
|
||||||
|
|
BIN
demos/amiga/trance_dream.fur
Normal file
BIN
demos/ay8930/One_Minute_Waltz.fur
Normal file
BIN
demos/ay8930/Playing_On_The_Stairs.fur
Normal file
BIN
demos/ay8930/powerful-sample-generator.fur
Normal file
BIN
demos/esfm/AAAA.fur
Normal file
BIN
demos/esfm/ALCATRAZ_ALWAYS.fur
Normal file
BIN
demos/esfm/CampingJourney.fur
Normal file
BIN
demos/esfm/Deadline.fur
Normal file
BIN
demos/esfm/Devil_Detective.fur
Normal file
BIN
demos/esfm/Drinkin_Coffee_Way_Too_Much.fur
Normal file
BIN
demos/esfm/EdgeRunning_2078.fur
Normal file
BIN
demos/esfm/Fighting_the_Dimensions_Big_Bad_Because_its_Fun.fur
Normal file
BIN
demos/esfm/I_Cant_Escape_Your_Memory.fur
Normal file
BIN
demos/esfm/Just_me_and_my_Brain.fur
Normal file
BIN
demos/esfm/Ken_Stage.fur
Normal file
BIN
demos/esfm/Magician_Lake_Cover.fur
Normal file
BIN
demos/esfm/Napalm-Loader.fur
Normal file
BIN
demos/esfm/Perilous059.fur
Normal file
BIN
demos/esfm/Poets_I.fur
Normal file
BIN
demos/esfm/Redial.fur
Normal file
BIN
demos/esfm/SearchPrincess.fur
Normal file
BIN
demos/esfm/Second_Start.fur
Normal file
BIN
demos/esfm/Strange_Sunset.fur
Normal file
BIN
demos/esfm/Tangent_to_a_Segue.fur
Normal file
BIN
demos/esfm/TheOneWayFuture.fur
Normal file
BIN
demos/esfm/Unconscious_Unravelling.fur
Normal file
BIN
demos/esfm/Unknown_Location.fur
Normal file
BIN
demos/esfm/WalkInThePark.fur
Normal file
BIN
demos/esfm/act_of_fighter.fur
Normal file
BIN
demos/esfm/cielos_esfumados.fur
Normal file
BIN
demos/esfm/esfm_ins.fur
Normal file
BIN
demos/esfm/experiment.fur
Normal file
BIN
demos/esfm/flashback.fur
Normal file
BIN
demos/esfm/frosty_dusk.fur
Normal file
BIN
demos/esfm/haunted_castle.fur
Normal file
BIN
demos/esfm/her_wishes.fur
Normal file
BIN
demos/esfm/ledstorm.fur
Normal file
BIN
demos/esfm/loneguitarist.fur
Normal file
BIN
demos/esfm/moon_closedspace.fur
Normal file
BIN
demos/esfm/sticker1.fur
Normal file
BIN
demos/esfm/synthy.fur
Normal file
BIN
demos/esfm/wack.fur
Normal file
BIN
demos/esfm/x_evil_soul.fur
Normal file
BIN
demos/genesis/Kobito_of_the_Shining_Needle.fur
Normal file
BIN
demos/misc/Playground_2xT6W28.fur
Normal file
BIN
demos/misc/Someting_I_can_feel_MSM5232.fur
Normal file
BIN
demos/misc/T_Six_T6W28.fur
Normal file
BIN
demos/msx/Morning_Alarm.fur
Normal file
BIN
demos/multichip/Chip_Duel_AY-3-8910+SN76489.fur
Normal file
BIN
demos/nes/Fur_Nes.fur
Normal file
BIN
demos/nes/Future_Re-ference.fur
Normal file
BIN
demos/specs2/back_into_adventure.fur
Normal file
BIN
demos/specs2/spa.fur
Normal file
|
@ -60,7 +60,22 @@ right-clicking the Save button brings up a menu with the following options:
|
||||||
|
|
||||||
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.
|
||||||
|
- **make me a drum kit**: allows you to instantly create a drum kit using all the samples in the list. see the next section for more information.
|
||||||
- **duplicate**: makes a copy of the selected sample.
|
- **duplicate**: makes a copy of the selected sample.
|
||||||
- **replace...**: opens a file dialog to choose a replacement sample.
|
- **replace...**: opens a file dialog to choose a replacement sample.
|
||||||
- **save**: opens a file dialog to choose where to save the sample.
|
- **save**: opens a file dialog to choose where to save the sample.
|
||||||
- **delete**: removes the sample.
|
- **delete**: removes the sample.
|
||||||
|
|
||||||
|
### make me a drum kit
|
||||||
|
|
||||||
|
I have added this option to make it easier for you to create a drum kit.
|
||||||
|
it puts all the samples into a new instrument with sample map.
|
||||||
|
|
||||||
|
after selecting this option, a list of parameters appears:
|
||||||
|
|
||||||
|
- **Drum kit mode**: select how to arrange the samples in the sample map.
|
||||||
|
- **Normal**: put all samples from the starting octave onwards.
|
||||||
|
- **12 samples per octave**: map the first 12 samples to all octaves, DefleMask-style.
|
||||||
|
- **Starting octave**: change the octave where the first sample will be at.
|
||||||
|
|
||||||
|
following that is a list of viable instrument types. click on one of them to proceed with drum kit creation!
|
||||||
|
|
|
@ -30,7 +30,7 @@ items in _italic_ don't appear in basic mode and are only available in advanced
|
||||||
- clicking the Tick Rate button switches to a more traditional **Base Tempo** BPM setting.
|
- clicking the Tick Rate button switches to a more traditional **Base Tempo** BPM setting.
|
||||||
|
|
||||||
**Speed**: the number of ticks per row.
|
**Speed**: the number of ticks per row.
|
||||||
- clicking the "Speed" button changes to more complex modes covered in the [grooves] page.
|
- 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 tick rate to 150 BPM (60 Hz) and speed to 6.
|
||||||
|
|
|
@ -34,7 +34,7 @@ however, effects are continuous, which means you only need to type it once and t
|
||||||
- `E2xy`: **Note slide down.** `x` is the speed, while `y` is how many semitones to slide down.
|
- `E2xy`: **Note slide down.** `x` is the speed, while `y` is how many semitones to slide down.
|
||||||
- ---
|
- ---
|
||||||
- `EAxx`: **Toggle legato.** while on, new notes instantly change the pitch of the currently playing sound instead of starting it over.
|
- `EAxx`: **Toggle legato.** while on, new notes instantly change the pitch of the currently playing sound instead of starting it over.
|
||||||
- `00xy`: **Arpeggio.** after using this effect the channel will rapidly switch between semitone values of `note`, `note + x` and `note + y`.
|
- `00xy`: **Arpeggio.** this effect produces a rapid cycle between the current note, the note plus `x` semitones and the note plus `y` semitones.
|
||||||
- `E0xx`: **Set arpeggio speed.** this sets the number of ticks between arpeggio values. default is 1.
|
- `E0xx`: **Set arpeggio speed.** this sets the number of ticks between arpeggio values. default is 1.
|
||||||
- ---
|
- ---
|
||||||
- `04xy`: **Vibrato.** changes pitch to be "wavy" with a sine LFO. `x` is the speed, while `y` is the depth.
|
- `04xy`: **Vibrato.** changes pitch to be "wavy" with a sine LFO. `x` is the speed, while `y` is the depth.
|
||||||
|
|
|
@ -9,10 +9,8 @@ alternatively, window > instrument editor displays it.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
**TODO: add descriptions to buttons in the image. it really needs them.**
|
- **Select**: displays a list of instruments in the song.
|
||||||
|
- **Load**: open an instrument file.
|
||||||
- **Instrument Selector**: displays a list of instruments in the song.
|
|
||||||
- **Open**: open an instrument file.
|
|
||||||
- **Save**: save current instrument to a file.
|
- **Save**: save current instrument to a file.
|
||||||
- right-click to see additional options, such as saving in DefleMask preset format (.dmp).
|
- right-click to see additional options, such as saving in DefleMask preset format (.dmp).
|
||||||
- **Name**: changes the instrument name.
|
- **Name**: changes the instrument name.
|
||||||
|
@ -76,6 +74,7 @@ the following instrument types are available:
|
||||||
- [TED](ted.md) - for use with Commodore Plus/4 and Commodore 16's TED chip.
|
- [TED](ted.md) - for use with Commodore Plus/4 and Commodore 16's TED chip.
|
||||||
- [C140](c140.md) - for use with C140 sample chip.
|
- [C140](c140.md) - for use with C140 sample chip.
|
||||||
- [C219](c219.md) - for use with C219 sample chip.
|
- [C219](c219.md) - for use with C219 sample chip.
|
||||||
|
- [PowerNoise](powernoise.md) - for use with PowerNoise chip.
|
||||||
|
|
||||||
## macros
|
## macros
|
||||||
|
|
||||||
|
@ -93,9 +92,6 @@ each macro has the following parameters:
|
||||||
- **Step Length (ticks)**: determines the number of ticks between macro steps. default is 1.
|
- **Step Length (ticks)**: determines the number of ticks between macro steps. default is 1.
|
||||||
- **Delay**: delays the macro until this many ticks have elapsed. default is 0.
|
- **Delay**: delays the macro until this many ticks have elapsed. default is 0.
|
||||||
- the button is highlighted if either of these parameters is set to non-default values.
|
- the button is highlighted if either of these parameters is set to non-default values.
|
||||||
- release mode: determines how macro release (`===` or `REL` in the pattern) is handled:
|
|
||||||
- **Active**: jumps to release position on release.
|
|
||||||
- **Passive**: does not jump to release position. this will result in delay if release position has not been reached yet.
|
|
||||||
|
|
||||||
## macro types
|
## macro types
|
||||||
|
|
||||||
|
@ -115,8 +111,6 @@ this is the most basic macro type. when the instrument is played, every value in
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
**TODO: once again, text in the image. this sucks.**
|
|
||||||
|
|
||||||
the Length field allows you to set the number of steps in the sequence.
|
the Length field allows you to set the number of steps in the sequence.
|
||||||
|
|
||||||
the sequence view allows you to edit the macro.
|
the sequence view allows you to edit the macro.
|
||||||
|
@ -171,6 +165,10 @@ the sequence can be edited in the text input field at the very bottom. the follo
|
||||||
|
|
||||||
in bitmask-style macros, the values are added up in binary and converted to decimal.
|
in bitmask-style macros, the values are added up in binary and converted to decimal.
|
||||||
|
|
||||||
|
the release mode parameter determines how macro release (`===` or `REL` in the pattern) is handled:
|
||||||
|
- **Active**: jumps to release position on release.
|
||||||
|
- **Passive**: does not jump to release position. this will result in delay if release position has not been reached yet.
|
||||||
|
|
||||||
### ADSR
|
### ADSR
|
||||||
|
|
||||||

|

|
||||||
|
|
|
@ -7,13 +7,13 @@ the ESFM editor is divided into 6 tabs:
|
||||||
- **Macros (OP2)**: for macros controlling FM parameters of operator 2.
|
- **Macros (OP2)**: for macros controlling FM parameters of operator 2.
|
||||||
- **Macros (OP3)**: for macros controlling FM parameters of operator 3.
|
- **Macros (OP3)**: for macros controlling FM parameters of operator 3.
|
||||||
- **Macros (OP4)**: for macros controlling FM parameters of operator 4.
|
- **Macros (OP4)**: for macros controlling FM parameters of operator 4.
|
||||||
- **Macros**: for other macros (volume/arp/pitch/pan/noise mode).
|
- **Macros**: for other macros (volume/arp/pitch/pan/operator 4 noise mode).
|
||||||
|
|
||||||
## FM
|
## FM
|
||||||
|
|
||||||
ESFM is four-operator, but it is different from the rest of FM chips.
|
ESFM is four-operator, meaning it takes four oscillators to produce a single sound.
|
||||||
|
|
||||||
the concept of an algorithm does not exist in ESFM. instead, modulation routing is arbitrary, with each operator having output level and modulation input parameters.
|
unlike most four-operator FM synthesizers, however, ESFM does not have an algorithm selection. instead, it uses a fixed operator arrangement, but allows you to independently control the output and modulation input levels of each operator. this allows it to reproduce a few common four-operator algorithms, as well as unique combinations where operators act as modulators and carriers at the same time.
|
||||||
|
|
||||||
these apply to the instrument as a whole:
|
these apply to the instrument as a whole:
|
||||||
- **OP4 Noise Mode**: determines the mode used to produce noise in operator 4.
|
- **OP4 Noise Mode**: determines the mode used to produce noise in operator 4.
|
||||||
|
@ -21,57 +21,114 @@ these apply to the instrument as a whole:
|
||||||
- Snare: takes the snare noise generation mode from OPL. square + noise.
|
- Snare: takes the snare noise generation mode from OPL. square + noise.
|
||||||
- HiHat: ring modulates with operator 3 and adds noise.
|
- HiHat: ring modulates with operator 3 and adds noise.
|
||||||
- Top: ring modulates with operator 3 and double pitch modulation input.
|
- Top: ring modulates with operator 3 and double pitch modulation input.
|
||||||
- this mode is not emulated correctly. subject to change!
|
- these are normally used for the drum channels in ESFM's OPL3 compatibility mode.
|
||||||
|
- however, in ESFM, operator 4 can be modulated by operator 3, whereas in OPL3 drum mode the rhythm channels cannot be modulated.
|
||||||
|
- __note__: usage of noise mode "Top" is discouraged for now as it is not properly emulated yet, and results may change when the emulation gets fixed in the future.
|
||||||
|
- **operator routing preview**: shows how operators are connected with each other and with the audio output (at the bottom).
|
||||||
|
- left-click pops up a small "operators changes with volume?" dialog where each operator can be toggled to scale with volume level.
|
||||||
|
- right-click switches to a preview display of the waveform generated on a new note:
|
||||||
|
- left-click restarts the preview.
|
||||||
|
- middle-click pauses and unpauses the preview.
|
||||||
|
- right-click returns to algorithm view.
|
||||||
|
|
||||||
these apply to each operator:
|
these apply to each operator:
|
||||||
- the crossed-arrows button can be dragged to rearrange operators.
|
- the crossed-arrows button can be dragged to rearrange operators.
|
||||||
- **Amplitude Modulation (AM)**: makes the operator affected by LFO tremolo.
|
- **Amplitude Modulation (AM)**: makes the operator affected by LFO tremolo.
|
||||||
- **Sustain flag (SUS)**: when enabled, value of Sustain Level is in effect.
|
- **AM Depth (DAM/AMD)**: when enabled, LFO tremolo is deeper (1dB off; 4.8dB on).
|
||||||
- **AM Depth (AMD)**: when enabled, LFO tremolo is deeper.
|
- **Sustain flag (SUS)**: when enabled, the envelope pauses ("sustains") once it reaches the Sustain Level and does not proceed to the release phase until note off.
|
||||||
|
- **Envelope Delay (DL)**: determines the delay time before the envelope is triggered. the bigger the value, the longer the delay (0 to 7).
|
||||||
|
- a change of one unit doubles or halves the delay time.
|
||||||
|
- a value of 0 results in no delay.
|
||||||
- **Attack Rate (AR)**: determines the rising time for the sound. the bigger the value, the faster the attack (0 to 15).
|
- **Attack Rate (AR)**: determines the rising time for the sound. the bigger the value, the faster the attack (0 to 15).
|
||||||
- **Decay Rate (DR)**: determines the diminishing time for the sound. the higher the value, the shorter the decay. it's the initial amplitude decay rate (0 to 15).
|
- **Decay Rate (DR)**: determines the diminishing time for the sound. the higher the value, the shorter the decay. it's the initial amplitude decay rate (0 to 15).
|
||||||
- **Sustain Level (SL)**: determines the point at which the sound ceases to decay and changes to a sound having a constant level. the sustain level is expressed as a fraction of the maximum level (0 to 15).
|
- **Sustain Level (SL)**: determines the point at which the sound ceases to decay and changes to a sound having a constant level. the sustain level is expressed as a fraction of the maximum level (0 to 15).
|
||||||
- **Release Rate (RR)**: determines the rate at which the sound disappears after note off. the higher the value, the shorter the release (0 to 15).
|
- **Release Rate (RR)**: determines the rate at which the sound disappears after note off. the higher the value, the shorter the release (0 to 15).
|
||||||
|
|
||||||
- **Total Level (TL)**: represents the envelope’s highest amplitude, with 0 being the largest and 63 (decimal) the smallest. a change of one unit is about 0.75 dB.
|
- **Total Level (TL)**: represents the envelope’s highest amplitude, with 0 being the largest and 63 (decimal) the smallest. a change of one unit is about 0.75 dB.
|
||||||
- **Output Level (OL)**: determines the volume at which the operator will be output.
|
|
||||||
- **Modulation Input (MI)**: determines how much to take from the previous operator for modulation.
|
|
||||||
- this controls feedback level in the case of operator 1.
|
|
||||||
- **Key Scale Level (KSL)**: also known as "Level Scale". determines the degree to which the amplitude decreases according to the pitch.
|
- **Key Scale Level (KSL)**: also known as "Level Scale". determines the degree to which the amplitude decreases according to the pitch.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
- **Key Scale Rate (KSR)**: also known as "Rate Scale". determines the degree to which the envelope execution speed increases according to the pitch.
|
- **Key Scale Rate (KSR)**: also known as "Rate Scale". determines the degree to which the envelope execution speed increases according to the pitch.
|
||||||
- **Frequency Multiplier (MULT)**: sets the coarse pitch offset in relation to the note (0 to 15). 0 is -1 octave, 1 is 0 octaves, 2 is 1 octave, 3 is 1 octave 7 semitones, and so on.
|
- **Frequency Multiplier (MULT)**: sets the coarse pitch offset in relation to the note (0 to 15). 0 is -1 octave, 1 is 0 octaves, 2 is 1 octave, 3 is 1 octave 7 semitones, and so on.
|
||||||
- note that values 11, 13 and 14 behave as 10, 12 and 12 respectively.
|
- note that values 11, 13 and 14 behave as 10, 12 and 15 respectively.
|
||||||
|
- **Tune (CT)**: sets the semitone offset in relation to the note (-24 to 24).
|
||||||
|
- this is a software effect.
|
||||||
|
- **Fine Detune (DT)**: shifts the pitch in fine steps (-128 to 127). 0 is the base pitch, -128 is -1 semitone, 127 is nearly +1 semitone.
|
||||||
|
- this is a software effect.
|
||||||
|
- **Left (L)**: toggles output to the left channel from the operator to the audio output.
|
||||||
|
- **Right (R)**: toggles output to the right channel from the operator to the audio output.
|
||||||
- **Waveform Select (WS)**: changes the waveform of the operator (0 to 7).
|
- **Waveform Select (WS)**: changes the waveform of the operator (0 to 7).
|
||||||
- **Vibrato (VIB)**: makes the operator affected by LFO vibrato.
|
- **Vibrato (VIB)**: makes the operator affected by LFO vibrato.
|
||||||
- **FM Depth (FMD)**: when enabled, vibrato is deeper.
|
- **Vibrato Depth (DVB/FMD)**: when enabled, vibrato is deeper.
|
||||||
|
|
||||||
- **Tune**: sets the coarse tune of the operator.
|
### routing controls
|
||||||
- **Detune**: sets the fine tune of the operator.
|
|
||||||
|
|
||||||
- **Left (L)**: output on the left channel.
|
- **Output Level (OL)**: sets the output level from this operator to the audio output (0 to 7).
|
||||||
- **Right (R)**: output on the right channel.
|
- 7 is the loudest level and 1 is the softest, while 0 disables audio output.
|
||||||
|
- a change of one unit is about 6 dB.
|
||||||
|
- this output scaling factor is applied after TL and envelope scaling have been performed.
|
||||||
|
- **Modulation Input Level (MI)**: sets the modulation level from the previous operator to this operator (0 to 7).
|
||||||
|
- 7 is the strongest level and 1 is the weakest, while 0 disables modulation.
|
||||||
|
- a change of one unit is about 6 dB.
|
||||||
|
- for operator 1 this controls the **feedback level**.
|
||||||
|
- this modulation scaling factor is applied after the previous operator's TL and envelope scaling have been performed, but is unaffected by OL above.
|
||||||
|
|
||||||
|
### common algorithms
|
||||||
|
|
||||||
|
this table contains a list of modulation input/output level values which resemble common algorithms in Yamaha FM chips.
|
||||||
|
|
||||||
|
__note__: MI1 is not included as it is the feedback level.
|
||||||
|
|
||||||
|
| algorithm | OL1 | MI2 | OL2 | MI3 | OL3 | MI4 | OL4 |
|
||||||
|
|--------------------------------|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|
||||||
|
| OPN algorithm **0** | 0 | 7 | 0 | 7 | 0 | 7 | 7 |
|
||||||
|
| OPN algorithm **4** | 0 | 7 | 7 | 0 | 0 | 7 | 7 |
|
||||||
|
| OPN algorithm **6** | 0 | 7 | 7 | 0 | 7 | 0 | 7 |
|
||||||
|
| OPN algorithm **7** | 7 | 0 | 7 | 0 | 7 | 0 | 7 |
|
||||||
|
| OPL3 algorithm **1** | 7 | 0 | 0 | 7 | 0 | 7 | 7 |
|
||||||
|
| OPL3 algorithm **3** | 7 | 0 | 0 | 7 | 7 | 0 | 7 |
|
||||||
|
| OPL3 algorithm **1** (variant) | 0 | 7 | 0 | 7 | 7 | 0 | 7 |
|
||||||
|
|
||||||
### fixed frequency mode
|
### fixed frequency mode
|
||||||
|
|
||||||
each operator has a Fixed Frequency mode. once enabled, the operator runs at the specified frequency regardless of the note.
|
each operator has a Fixed Frequency mode. once enabled, the operator runs at the specified frequency regardless of the note.
|
||||||
|
|
||||||
|
when fixed frequency mode is enabled, the Tune and Fine Detune sliders will be replaced by **Block (Blk)** and **FreqNum (F)**, which allow you to input a raw frequency value into the operator.
|
||||||
|
the actual frequency is determined by the formula: `FreqNum*(2^Block)`.
|
||||||
|
|
||||||
|
in other words, FreqNum defines the base frequency, while Block determines the scaling factor in octaves.
|
||||||
|
|
||||||
## macros
|
## macros
|
||||||
|
|
||||||
these macros allow you to control several parameters of FM per tick.
|
these macros allow you to control several parameters of FM per tick.
|
||||||
|
|
||||||
## OP1-OP4 Macros
|
## OP1-OP4 Macros
|
||||||
|
|
||||||
all parameters are listed above.
|
most parameters are listed above.
|
||||||
|
|
||||||
|
### envelope delay macro tricks
|
||||||
|
|
||||||
|
due to a quirk in how the envelope delay feature works, the **Envelope Delay** macro can control the operator's key-on status for a limited amount of time after a note is played. a value of 0 represents key-on, while a value of 7 represents key-off.
|
||||||
|
|
||||||
|
note that the macro cannot exceed 659.1 ms in length - anything beyond that will be treated as a value of 0.
|
||||||
|
|
||||||
|
### operator arpeggio and pitch macros
|
||||||
|
|
||||||
|
among the available macros are **Op. Arpeggio** and **Op. Pitch**. these work like the **Arpeggio** and **Pitch** macros featured below, but are applied to the individual operator, overriding the **Arpeggio**/**Pitch** macros respectively.
|
||||||
|
|
||||||
|
the **Tune** and **Fine Detune** FM parameters are still respected when using these macros.
|
||||||
|
|
||||||
|
### fixed frequency macros
|
||||||
|
|
||||||
|
when fixed frequency is enabled for an operator, the **Op. Arpeggio** and **Op. Pitch** macros will be replaced by the **Block** and **FreqNum** macros. these can be used to change the operator's fixed frequency over time.
|
||||||
|
|
||||||
## Macros
|
## Macros
|
||||||
|
|
||||||
- **Volume**: volume sequence.
|
- **Volume**: volume sequence.
|
||||||
- **Arpeggio**: pitch sequence.
|
- **Arpeggio**: pitch sequence.
|
||||||
- **OP4 Noise Mode**: noise mode sequence.
|
- **OP4 Noise Mode**: operator 4 noise mode sequence.
|
||||||
- **Panning**: enables output on left/right channels.
|
- **Panning**: enables output on left/right channels.
|
||||||
|
- note that each operator also has its own pan controls, which get masked by this global pan control.
|
||||||
- **Pitch**: fine pitch.
|
- **Pitch**: fine pitch.
|
||||||
- **Relative**: when enabled, pitch changes are relative to the current pitch.
|
- **Relative**: when enabled, pitch changes are relative to the current pitch.
|
||||||
- **Phase Reset**: restarts all operators and resets the waveform to its start.
|
- **Phase Reset**: restarts all operators and resets the waveform to its start.
|
||||||
|
|
|
@ -29,7 +29,7 @@ these apply to the instrument as a whole:
|
||||||
these apply to each operator:
|
these apply to each operator:
|
||||||
- the crossed-arrows button can be dragged to rearrange operators.
|
- the crossed-arrows button can be dragged to rearrange operators.
|
||||||
- **Amplitude Modulation (AM)**: makes the operator affected by LFO tremolo.
|
- **Amplitude Modulation (AM)**: makes the operator affected by LFO tremolo.
|
||||||
- **Sustain flag (SUS)**: when enabled, value of Sustain Level is in effect.
|
- **Sustain flag (SUS)**: when enabled, the envelope pauses ("sustains") once it reaches the Sustain Level and does not proceed to the release phase until note off.
|
||||||
- **Attack Rate (AR)**: determines the rising time for the sound. the bigger the value, the faster the attack (0 to 15).
|
- **Attack Rate (AR)**: determines the rising time for the sound. the bigger the value, the faster the attack (0 to 15).
|
||||||
- **Decay Rate (DR)**: determines the diminishing time for the sound. the higher the value, the shorter the decay. it's the initial amplitude decay rate (0 to 15).
|
- **Decay Rate (DR)**: determines the diminishing time for the sound. the higher the value, the shorter the decay. it's the initial amplitude decay rate (0 to 15).
|
||||||
- **Sustain Level (SL)**: determines the point at which the sound ceases to decay and changes to a sound having a constant level. the sustain level is expressed as a fraction of the maximum level (0 to 15).
|
- **Sustain Level (SL)**: determines the point at which the sound ceases to decay and changes to a sound having a constant level. the sustain level is expressed as a fraction of the maximum level (0 to 15).
|
||||||
|
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 39 KiB |
|
@ -24,6 +24,20 @@ note that using samples on Lynx is CPU expensive!
|
||||||
|
|
||||||
Atari Lynx generates sound using a 12-bit linear feedback shift register with configurable tap. nine separate bits can be enabled to be the source of feedback: 0, 1, 2, 3, 4, 5, 7, 10 and 11. to generate _any_ sound at least one bit _must_ be enabled.
|
Atari Lynx generates sound using a 12-bit linear feedback shift register with configurable tap. nine separate bits can be enabled to be the source of feedback: 0, 1, 2, 3, 4, 5, 7, 10 and 11. to generate _any_ sound at least one bit _must_ be enabled.
|
||||||
|
|
||||||
|
### LFSR-based synthesis
|
||||||
|
|
||||||
|
a linear-feedback shift register is one method used for random number generation.
|
||||||
|
it works by shifting a sequence of binary numbers (bits), taking the last bit into the output. then some of the bits are combined with others, doing a XOR (exclusive or) operation and then being pushed back.
|
||||||
|
|
||||||
|
think of it as a conveyor carrying glass bottles. each bottle may be empty or carrying water.
|
||||||
|
the bottle at the end is taken. if there's water, then the output is 1. if it's empty, the output is 0.
|
||||||
|
depending on the LFSR configuration, many bottles at specific positions ("taps") are looked at. these are combined from left to right, two by two:
|
||||||
|
- if two bottles are identical, an empty bottle is pushed.
|
||||||
|
- if one bottle has water but the other is empty, a water bottle is pushed.
|
||||||
|
the process is repeated indefinitely.
|
||||||
|
|
||||||
|
unlike PowerNoise, Lynx's taps are in fixed positions, but it has many of them.
|
||||||
|
|
||||||
### square wave
|
### square wave
|
||||||
|
|
||||||
the LFSR is shifted at the rate define by sound pitch and generates square wave by setting channel output value to +volume or -volume, depending on the bit shifted in.
|
the LFSR is shifted at the rate define by sound pitch and generates square wave by setting channel output value to +volume or -volume, depending on the bit shifted in.
|
||||||
|
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 38 KiB |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 78 KiB |
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 78 KiB |
78
doc/4-instrument/powernoise.md
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
# PowerNoise instrument editor
|
||||||
|
|
||||||
|
the PowerNoise instrument editor consists of two tabs.
|
||||||
|
|
||||||
|
## LFSR-based synthesis
|
||||||
|
|
||||||
|
PowerNoise employs LFSR-based synthesis for the noise channels, using linear-feedback shift registers for sound generation.
|
||||||
|
|
||||||
|
a linear-feedback shift register is one method used for random number generation.
|
||||||
|
it works by shifting a sequence of binary numbers (bits), taking the last bit into the output. then one of the bits is either pushed back into the register, or combined with another, doing a XOR (exclusive or) operation and then being pushed back.
|
||||||
|
|
||||||
|
think of it as a conveyor carrying glass bottles. each bottle may be empty or carrying water.
|
||||||
|
the bottle at the end is taken. if there's water, then the output is 1. if it's empty, the output is 0.
|
||||||
|
depending on the LFSR configuration:
|
||||||
|
- a bottle is pushed into the conveyor. it is either empty or filled with water depending on the bottle at a specific position in the conveyor (this is called a "tap"), or
|
||||||
|
- two bottles at specific positions ("taps") are looked at and combined as follows:
|
||||||
|
- if the bottles are identical, an empty bottle is pushed.
|
||||||
|
- if one bottle has water but the other is empty, a water bottle is pushed.
|
||||||
|
the process is repeated indefinitely.
|
||||||
|
|
||||||
|
PowerNoise uses either one or two taps for the LFSR, configurable via the Control macro.
|
||||||
|
|
||||||
|
the LFSR must be initialized before it can produce sound. the Load LFSR macro allows you to do so.
|
||||||
|
|
||||||
|
by default the LFSR is configured to produce square waves, by having a single tap in position 1 and an alternating LFSR pattern.
|
||||||
|
|
||||||
|
## Macros (noise)
|
||||||
|
|
||||||
|
- **Volume**: volume sequence.
|
||||||
|
- **Arpeggio**: pitch sequence.
|
||||||
|
- **Panning (left)**: output level for left channel.
|
||||||
|
- **Panning (right)**: output level for right channel.
|
||||||
|
- **Pitch**: fine pitch.
|
||||||
|
- **Phase Reset**: trigger reloading the LFSR.
|
||||||
|
- **Control**: channel settings:
|
||||||
|
- **slope AM**: when enabled, this channel's output and the slope channel go through amplitude modulation.
|
||||||
|
- **tap B**: enables use of two taps for the LFSR.
|
||||||
|
- **Tap A Location**: sets the position of the first tap.
|
||||||
|
- **Tap B Location**: sets the position of the second tap.
|
||||||
|
- **Load LFSR**: allows you to load the LFSR with a specific pattern.
|
||||||
|
|
||||||
|
## PowerNoise tab
|
||||||
|
|
||||||
|
this tab allows you to change the base octave - important when you have set a longer LFSR pattern.
|
||||||
|
|
||||||
|
## PowerNoise (slope) instrument editor
|
||||||
|
|
||||||
|
this channel has its own instrument type, as it does not use LFSR-based synthesis but instead generates saw waves.
|
||||||
|
|
||||||
|
it uses a custom algorithm which will be (roughly) described below.
|
||||||
|
|
||||||
|
the slope channel uses two "portions" - each with length, offset, invert and clip parameters.
|
||||||
|
the channel alternates between these portions as it is cycled.
|
||||||
|
|
||||||
|
on every cycle, the offset of the current portion is either added or subtracted into the accumulator (depending on the invert parameter), effectively behaving like a multiplier.
|
||||||
|
if the clip parameter is enabled, this will make sure the accumulator doesn't go past 0 or 127 (depending on the invert parameter, again). otherwise, the accumulator will be ANDed with 127.
|
||||||
|
once an amount of cycles set by the portion length parameter have elapsed, the channel switches into the other portion.
|
||||||
|
|
||||||
|
the current value of the accumulator is output.
|
||||||
|
|
||||||
|
## Macros (slope)
|
||||||
|
|
||||||
|
- **Volume**: volume sequence.
|
||||||
|
- **Arpeggio**: pitch sequence.
|
||||||
|
- **Panning (left)**: output level for left channel.
|
||||||
|
- **Panning (right)**: output level for right channel.
|
||||||
|
- **Pitch**: fine pitch.
|
||||||
|
- **Control**: channel settings:
|
||||||
|
- **clip A**: sets clip parameter of first portion.
|
||||||
|
- **clip B**: sets clip parameter of second portion.
|
||||||
|
- **reset A**: resets the first portion.
|
||||||
|
- **reset B**: resets the second portion.
|
||||||
|
- **invert A**: sets invert parameter of first portion.
|
||||||
|
- **invert B**: sets invert parameter of second portion.
|
||||||
|
- **Portion A Length**: sets the duration of the first portion.
|
||||||
|
- **Portion B Length**: sets the duration of the second portion.
|
||||||
|
- **Portion A Offset**: sets the accumulator speed of the first portion.
|
||||||
|
- **Portion B Offset**: sets the accumulator speed of the second portion.
|
|
@ -1,6 +1,6 @@
|
||||||
# Capcom QSound instrument editor
|
# Capcom QSound instrument editor
|
||||||
|
|
||||||
the QSound instrument editor contains three tabs: Sample and Macros.
|
the QSound instrument editor contains two tabs: Sample and Macros.
|
||||||
|
|
||||||
## Sample
|
## Sample
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@ note that using samples on VRC6 is CPU expensive!
|
||||||
|
|
||||||
## VRC6 (saw) instrument editor
|
## VRC6 (saw) instrument editor
|
||||||
|
|
||||||
this channel has its own instrument type, a one-of-a-kind thing in Furnace that was decided as a compromise during a debate.
|
this channel has its own instrument type, a thing in Furnace that was decided as a compromise during a debate.
|
||||||
|
|
||||||
the only differences from this instrument type compared to the regular one are:
|
the only differences from this instrument type compared to the regular one are:
|
||||||
- the lack of a Sample tab.
|
- the lack of a Sample tab.
|
||||||
|
|
|
@ -90,6 +90,7 @@ this is the full list of chips that Furnace supports.
|
||||||
- [PET](pet.md)
|
- [PET](pet.md)
|
||||||
- [Pokémon Mini](pokemini.md)
|
- [Pokémon Mini](pokemini.md)
|
||||||
- [POKEY](pokey.md)
|
- [POKEY](pokey.md)
|
||||||
|
- [PowerNoise](powernoise.md)
|
||||||
- [PV-1000](pv1000.md)
|
- [PV-1000](pv1000.md)
|
||||||
- [QSound](qsound.md)
|
- [QSound](qsound.md)
|
||||||
- [RF5C68/RF5C164](ricoh.md)
|
- [RF5C68/RF5C164](ricoh.md)
|
||||||
|
|
|
@ -1,8 +1,12 @@
|
||||||
# ESS ESFM
|
# ESS ESFM
|
||||||
|
|
||||||
an enhanced version of Yamaha's OPL3, adding many features which weren't present on the original chip, such as 4-op on all channels, coarse/fine detune, per-op panning, envelope delay, noise generator and advanced modulation routing (no more algorithms!).
|
an FM synthesizer core included in a series of sound card chipsets made by ESS, which were mildly popular in the DOS days during the mid-late 90s.
|
||||||
|
|
||||||
the technology was present in many of ESS' sound cards (the ES1xxx series in particular).
|
at a cursory glance, it looks like just an [OPL3 clone](opl.md). but hidden under a veil of mystery is its exclusive "native mode", revealing an impressive superset of features, including 4-operator support on all 18 channels, semi-modular operator routing, per-operator pitch control, and even a few unique features.
|
||||||
|
|
||||||
|
for a long time, not much was known about the inner workings of ESFM's native mode, since ESS did not release any documentation to developers on how to use it. this has thankfully changed in recent years thanks to reverse-engineering efforts from the community.
|
||||||
|
|
||||||
|
thanks to ESS's decision to not release any documentation to developers and lock down usage of native mode behind a couple of General MIDI drivers shipping with rather lackluster patch sets, ESFM's native mode was unfortunately not very well used over its original lifespan.
|
||||||
|
|
||||||
## effects
|
## effects
|
||||||
|
|
||||||
|
|
23
doc/7-systems/powernoise.md
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
# PowerNoise
|
||||||
|
|
||||||
|
a fantasy sound chip created by The Beesh-Spweesh! and jvsTSX for the Hexheld fantasy video game console.
|
||||||
|
|
||||||
|
its design employs linear-feedback shift registers (LFSR) for sound generation. this technology is used in many random number generators to produce noise, but it is also capable of producing other tones.
|
||||||
|
|
||||||
|
it has three noise channels and one "slope" channel capable of generating a variety of saw waves.
|
||||||
|
|
||||||
|
it outputs stereo sound with 4-bit volume control per channel and 3-bit master volume control.
|
||||||
|
|
||||||
|
refer to its instrument type's documentation for details on sound synthesis.
|
||||||
|
|
||||||
|
## effect commands
|
||||||
|
|
||||||
|
- `20xx`: **load LFSR value (low byte).**
|
||||||
|
- on the slope channel, this sets its accumulator (from `00` to `7F`).
|
||||||
|
- `21xx`: **load LFSR value (high byte).**
|
||||||
|
- `22xx`: **write to I/O port A.**
|
||||||
|
- `23xx`: **write to I/O port B.**
|
||||||
|
|
||||||
|
## info
|
||||||
|
|
||||||
|
this chip uses the [PowerNoise](../4-instrument/powernoise.md) instrument editor.
|
1646
extern/ESFMu/esfm.c
vendored
33
extern/ESFMu/esfm.h
vendored
|
@ -72,37 +72,6 @@ int16_t ESFM_get_channel_output_native(esfm_chip *chip, int channel_idx);
|
||||||
|
|
||||||
// These are fake types just for syntax sugar.
|
// These are fake types just for syntax sugar.
|
||||||
// Beware of their underlying types when reading/writing to them.
|
// Beware of their underlying types when reading/writing to them.
|
||||||
#ifndef __NO_ESFM_FAST_TYPES
|
|
||||||
#ifndef __ESFM_FAST_TYPES
|
|
||||||
#define __ESFM_FAST_TYPES
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __ESFM_FAST_TYPES
|
|
||||||
|
|
||||||
typedef uint_fast8_t flag;
|
|
||||||
typedef uint_fast8_t uint2;
|
|
||||||
typedef uint_fast8_t uint3;
|
|
||||||
typedef uint_fast8_t uint4;
|
|
||||||
typedef uint_fast8_t uint5;
|
|
||||||
typedef uint_fast8_t uint6;
|
|
||||||
typedef uint_fast8_t uint8;
|
|
||||||
typedef uint_fast16_t uint9;
|
|
||||||
typedef uint_fast16_t uint10;
|
|
||||||
typedef uint_fast16_t uint11;
|
|
||||||
typedef uint_fast16_t uint12;
|
|
||||||
typedef uint_fast16_t uint16;
|
|
||||||
typedef uint_fast32_t uint19;
|
|
||||||
typedef uint_fast32_t uint23;
|
|
||||||
typedef uint_fast32_t uint32;
|
|
||||||
typedef uint_fast64_t uint36;
|
|
||||||
|
|
||||||
typedef int_fast16_t int13;
|
|
||||||
typedef int_fast16_t int14;
|
|
||||||
typedef int_fast16_t int16;
|
|
||||||
typedef int_fast32_t int32;
|
|
||||||
|
|
||||||
#else
|
|
||||||
typedef uint8_t flag;
|
typedef uint8_t flag;
|
||||||
typedef uint8_t uint2;
|
typedef uint8_t uint2;
|
||||||
typedef uint8_t uint3;
|
typedef uint8_t uint3;
|
||||||
|
@ -125,8 +94,6 @@ typedef int16_t int14;
|
||||||
typedef int16_t int16;
|
typedef int16_t int16;
|
||||||
typedef int32_t int32;
|
typedef int32_t int32;
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
enum eg_states
|
enum eg_states
|
||||||
{
|
{
|
||||||
EG_ATTACK,
|
EG_ATTACK,
|
||||||
|
|
2
extern/YMF262-LLE/fmopl3.c
vendored
|
@ -1442,6 +1442,8 @@ void FMOPL3_Clock(fmopl3_t *chip)
|
||||||
|
|
||||||
int sign;
|
int sign;
|
||||||
|
|
||||||
|
chip->op_value_debug = chip->op_value;
|
||||||
|
|
||||||
int accm_a = chip->fsm_out[6] ? 0 : chip->accm_a[1];
|
int accm_a = chip->fsm_out[6] ? 0 : chip->accm_a[1];
|
||||||
accm_a += (chip->pan_l[1][1] & 1) != 0 ? value : 0;
|
accm_a += (chip->pan_l[1][1] & 1) != 0 ? value : 0;
|
||||||
chip->accm_a[0] = accm_a;
|
chip->accm_a[0] = accm_a;
|
||||||
|
|
1
extern/YMF262-LLE/fmopl3.h
vendored
|
@ -297,6 +297,7 @@ typedef struct
|
||||||
int op_mod[2];
|
int op_mod[2];
|
||||||
|
|
||||||
int op_value;
|
int op_value;
|
||||||
|
int op_value_debug;
|
||||||
|
|
||||||
int accm_a[2];
|
int accm_a[2];
|
||||||
int accm_b[2];
|
int accm_b[2];
|
||||||
|
|
4
extern/backward/backward.hpp
vendored
|
@ -4253,7 +4253,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
MessageBox(NULL,"Error","Furnace has crashed! please report this to the issue tracker immediately:\r\nhttps://github.com/tildearrow/furnace/issues/new\r\n\r\na file called furnace_crash.txt will be created in your user directory.\r\nthis will be important for locating the origin of the crash.",MB_OK|MB_ICONERROR);
|
MessageBox(NULL,"Error","Furnace has crashed! please report this to the issue tracker immediately:\r\nhttps://github.com/tildearrow/furnace/issues/new\r\n\r\na file called furnace_crash.txt will be created in your user directory.\r\nthis will be important for locating the origin of the crash.\r\n\r\nif Furnace keeps crashing and you believe it is caused by a configuration problem, you may start Furnace with the -safemode parameter.",MB_OK|MB_ICONERROR);
|
||||||
std::string crashLocation;
|
std::string crashLocation;
|
||||||
char* userProfile=getenv("USERPROFILE");
|
char* userProfile=getenv("USERPROFILE");
|
||||||
if (userProfile==NULL) {
|
if (userProfile==NULL) {
|
||||||
|
@ -4492,7 +4492,7 @@ private:
|
||||||
printer.print(st, std::cerr);
|
printer.print(st, std::cerr);
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
MessageBox(NULL,"Furnace has crashed! please report this to the issue tracker immediately:\r\nhttps://github.com/tildearrow/furnace/issues/new\r\n\r\na file called furnace_crash.txt will be created in your user directory.\r\nthis will be important for locating the origin of the crash.","Error",MB_OK|MB_ICONERROR);
|
MessageBox(NULL,"Furnace has crashed! please report this to the issue tracker immediately:\r\nhttps://github.com/tildearrow/furnace/issues/new\r\n\r\na file called furnace_crash.txt will be created in your user directory.\r\nthis will be important for locating the origin of the crash.\r\n\r\nif Furnace keeps crashing and you believe it is caused by a configuration problem, you may start Furnace with the -safemode parameter.","Error",MB_OK|MB_ICONERROR);
|
||||||
std::string crashLocation;
|
std::string crashLocation;
|
||||||
char* userProfile=getenv("USERPROFILE");
|
char* userProfile=getenv("USERPROFILE");
|
||||||
if (userProfile==NULL) {
|
if (userProfile==NULL) {
|
||||||
|
|
19
extern/pwrnoise/LICENSE
vendored
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
Copyright (c) 2024 scratchminer
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
4
extern/pwrnoise/README.md
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
# pwrnoise
|
||||||
|
An emulator for the PowerNoise fantasy sound chip, part of the [Hexheld](https://github.com/Hexheld/) fantasy console.
|
||||||
|
|
||||||
|
Design by [jvsTSX](https://github.com/jvsTSX/), code by scratchminer.
|
238
extern/pwrnoise/pwrnoise.c
vendored
Normal file
|
@ -0,0 +1,238 @@
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "pwrnoise.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void pwrnoise_noise_write(noise_channel_t *chan, uint8_t reg, uint8_t val) {
|
||||||
|
switch (reg & 0x1f) {
|
||||||
|
case 1:
|
||||||
|
chan->enable = (val & 0x80) != 0;
|
||||||
|
chan->am = (val & 0x02) != 0;
|
||||||
|
chan->tapb_enable = (val & 0x01) != 0;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
chan->period = (chan->period & 0xf00) | val;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
chan->period = (chan->period & 0xff) | (((uint16_t)val << 8) & 0xf00);
|
||||||
|
chan->octave = val >> 4;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
chan->lfsr = (chan->lfsr & 0xff00) | val;
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
chan->lfsr = (chan->lfsr & 0x00ff) | ((uint16_t)val << 8);
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
chan->tapa = val >> 4;
|
||||||
|
chan->tapb = val & 0x0f;
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
chan->vol = val;
|
||||||
|
break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void pwrnoise_noise_step(noise_channel_t *chan, uint16_t cycles) {
|
||||||
|
if (!chan->enable) {
|
||||||
|
chan->out_latch = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
chan->octave_counter += cycles;
|
||||||
|
if (((cycles >= 2) && ((cycles >> (chan->octave + 1)) != 0)) || (!(((chan->octave_counter - 1) >> chan->octave) & 0x0001) && ((chan->octave_counter >> chan->octave) & 0x0001))) {
|
||||||
|
chan->period_counter += (cycles >> (chan->octave + 1));
|
||||||
|
if ((cycles >> (chan->octave + 1)) == 0) ++chan->period_counter;
|
||||||
|
|
||||||
|
while (chan->period_counter >= 4096) {
|
||||||
|
chan->prev = (uint8_t)(chan->lfsr >> 15);
|
||||||
|
uint16_t in = ((chan->lfsr >> chan->tapa) ^ (chan->tapb_enable ? (chan->lfsr >> chan->tapb) : 0)) & 0x0001;
|
||||||
|
chan->lfsr = (chan->lfsr << 1) | in;
|
||||||
|
chan->period_counter -= 4096 - chan->period;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
chan->out_latch = chan->prev ? chan->vol : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void pwrnoise_slope_write(slope_channel_t *chan, uint8_t reg, uint8_t val) {
|
||||||
|
switch (reg & 0x1f) {
|
||||||
|
case 0:
|
||||||
|
chan->accum = val & 0x7f;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
chan->enable = (val & 0x80) != 0;
|
||||||
|
if ((val & 0x40) != 0) {
|
||||||
|
chan->a = 0;
|
||||||
|
chan->b = 0;
|
||||||
|
chan->portion = false;
|
||||||
|
}
|
||||||
|
chan->flags = val & 0x3f;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
chan->period = (chan->period & 0xf00) | val;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
chan->period = (chan->period & 0xff) | (((uint16_t)val << 8) & 0xf00);
|
||||||
|
chan->octave = val >> 4;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
chan->alength = val;
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
chan->blength = val;
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
chan->aoffset = val >> 4;
|
||||||
|
chan->boffset = val & 0x0f;
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
chan->vol = val;
|
||||||
|
break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void pwrnoise_slope_step(slope_channel_t *chan, uint16_t cycles, bool force_zero) {
|
||||||
|
if (!chan->enable) {
|
||||||
|
chan->out_latch = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
chan->octave_counter += cycles;
|
||||||
|
if (((cycles >= 2) && ((cycles >> (chan->octave + 1)) != 0)) || (!(((chan->octave_counter - 1) >> chan->octave) & 0x0001) && ((chan->octave_counter >> chan->octave) & 0x0001))) {
|
||||||
|
chan->period_counter += (cycles >> (chan->octave + 1));
|
||||||
|
if ((cycles >> (chan->octave + 1)) == 0) ++chan->period_counter;
|
||||||
|
|
||||||
|
while (chan->period_counter >= 4096) {
|
||||||
|
if (!chan->portion) {
|
||||||
|
if ((chan->flags & 0x02) != 0) chan->accum -= chan->aoffset;
|
||||||
|
else chan->accum += chan->aoffset;
|
||||||
|
|
||||||
|
if ((chan->flags & 0x20) != 0 && chan->accum > 0x7f) chan->accum = (chan->flags & 0x02) ? 0x00 : 0x7f;
|
||||||
|
chan->accum &= 0x7f;
|
||||||
|
|
||||||
|
if (++chan->a > chan->alength) {
|
||||||
|
if ((chan->flags & 0x04) != 0) chan->accum = (chan->flags & 0x01) ? 0x7f : 0x00;
|
||||||
|
chan->b = 0x00;
|
||||||
|
chan->portion = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if ((chan->flags & 0x01) != 0) chan->accum -= chan->boffset;
|
||||||
|
else chan->accum += chan->boffset;
|
||||||
|
|
||||||
|
if ((chan->flags & 0x10) != 0 && chan->accum > 0x7f) chan->accum = (chan->flags & 0x01) ? 0x00 : 0x7f;
|
||||||
|
chan->accum &= 0x7f;
|
||||||
|
|
||||||
|
if (++chan->b > chan->blength) {
|
||||||
|
if ((chan->flags & 0x08) != 0) chan->accum = (chan->flags & 0x02) ? 0x7f : 0x00;
|
||||||
|
chan->a = 0x00;
|
||||||
|
chan->portion = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
chan->period_counter -= 4096 - chan->period;
|
||||||
|
|
||||||
|
uint8_t left = chan->accum >> 3;
|
||||||
|
uint8_t right = chan->accum >> 3;
|
||||||
|
|
||||||
|
switch (chan->vol >> 4) {
|
||||||
|
case 0:
|
||||||
|
case 1:
|
||||||
|
left >>= 1;
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
left >>= 1;
|
||||||
|
case 4:
|
||||||
|
case 5:
|
||||||
|
case 6:
|
||||||
|
case 7:
|
||||||
|
left >>= 1;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
switch (chan->vol & 0xf) {
|
||||||
|
case 0:
|
||||||
|
case 1:
|
||||||
|
right >>= 1;
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
right >>= 1;
|
||||||
|
case 4:
|
||||||
|
case 5:
|
||||||
|
case 6:
|
||||||
|
case 7:
|
||||||
|
right >>= 1;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
|
||||||
|
left &= (chan->vol >> 4);
|
||||||
|
right &= (chan->vol & 0xf);
|
||||||
|
chan->prev = (left << 4) | right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
chan->out_latch = force_zero ? 0 : chan->prev;
|
||||||
|
}
|
||||||
|
|
||||||
|
void pwrnoise_reset(power_noise_t *pn) {
|
||||||
|
memset(pn, 0, sizeof(power_noise_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
void pwrnoise_write(power_noise_t *pn, uint8_t reg, uint8_t val) {
|
||||||
|
reg &= 0x1f;
|
||||||
|
|
||||||
|
if (reg == 0x00) {
|
||||||
|
pn->flags = val;
|
||||||
|
}
|
||||||
|
else if (reg == 0x08 && !(pn->flags & 0x20)) {
|
||||||
|
pn->gpioa = val;
|
||||||
|
}
|
||||||
|
else if (reg == 0x10 && !(pn->flags & 0x40)) {
|
||||||
|
pn->gpiob = val;
|
||||||
|
}
|
||||||
|
else if (reg < 0x08) {
|
||||||
|
pwrnoise_noise_write(&pn->n1, reg % 8, val);
|
||||||
|
}
|
||||||
|
else if (reg < 0x10) {
|
||||||
|
pwrnoise_noise_write(&pn->n2, reg % 8, val);
|
||||||
|
}
|
||||||
|
else if (reg < 0x18) {
|
||||||
|
pwrnoise_noise_write(&pn->n3, reg % 8, val);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pwrnoise_slope_write(&pn->s, reg % 8, val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void pwrnoise_step(power_noise_t *pn, uint16_t cycles, int16_t *left, int16_t *right) {
|
||||||
|
int32_t final_left, final_right;
|
||||||
|
|
||||||
|
if ((pn->flags & 0x80) != 0) {
|
||||||
|
pwrnoise_noise_step(&pn->n1, cycles);
|
||||||
|
pwrnoise_noise_step(&pn->n2, cycles);
|
||||||
|
pwrnoise_noise_step(&pn->n3, cycles);
|
||||||
|
pwrnoise_slope_step(&pn->s, cycles, (pn->n1.am && !(pn->n1.prev)) || (pn->n2.am && !(pn->n2.prev)) || (pn->n3.am && !(pn->n3.prev)));
|
||||||
|
|
||||||
|
final_left = (pn->n1.out_latch >> 4) + (pn->n2.out_latch >> 4) + (pn->n3.out_latch >> 4) + (pn->s.out_latch >> 4);
|
||||||
|
final_right = (pn->n1.out_latch & 0xf) + (pn->n2.out_latch & 0xf) + (pn->n3.out_latch & 0xf) + (pn->s.out_latch & 0xf);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
final_left = 0;
|
||||||
|
final_right = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
*left = (int16_t)((final_left * 65535 / 63 - 32768) * (pn->flags & 0x7) / 7);
|
||||||
|
*right = (int16_t)((final_right * 65535 / 63 - 32768) * (pn->flags & 0x7) / 7);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
77
extern/pwrnoise/pwrnoise.h
vendored
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
#ifndef PWRNOISE_H
|
||||||
|
#define PWRNOISE_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
bool enable;
|
||||||
|
bool am;
|
||||||
|
|
||||||
|
uint16_t period;
|
||||||
|
uint16_t period_counter;
|
||||||
|
|
||||||
|
uint8_t octave;
|
||||||
|
uint16_t octave_counter;
|
||||||
|
|
||||||
|
uint8_t tapa;
|
||||||
|
uint8_t tapb;
|
||||||
|
bool tapb_enable;
|
||||||
|
|
||||||
|
uint16_t lfsr;
|
||||||
|
uint8_t vol;
|
||||||
|
|
||||||
|
uint8_t out_latch;
|
||||||
|
uint8_t prev;
|
||||||
|
} noise_channel_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
bool enable;
|
||||||
|
uint8_t flags;
|
||||||
|
|
||||||
|
uint16_t period;
|
||||||
|
uint16_t period_counter;
|
||||||
|
|
||||||
|
uint8_t octave;
|
||||||
|
uint16_t octave_counter;
|
||||||
|
|
||||||
|
uint8_t alength;
|
||||||
|
uint8_t blength;
|
||||||
|
uint16_t a;
|
||||||
|
uint16_t b;
|
||||||
|
bool portion;
|
||||||
|
|
||||||
|
uint8_t aoffset;
|
||||||
|
uint8_t boffset;
|
||||||
|
|
||||||
|
uint8_t accum;
|
||||||
|
uint8_t vol;
|
||||||
|
|
||||||
|
uint8_t out_latch;
|
||||||
|
uint8_t prev;
|
||||||
|
} slope_channel_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t flags;
|
||||||
|
uint8_t gpioa;
|
||||||
|
uint8_t gpiob;
|
||||||
|
|
||||||
|
noise_channel_t n1;
|
||||||
|
noise_channel_t n2;
|
||||||
|
noise_channel_t n3;
|
||||||
|
slope_channel_t s;
|
||||||
|
} power_noise_t;
|
||||||
|
|
||||||
|
void pwrnoise_reset(power_noise_t *pn);
|
||||||
|
void pwrnoise_step(power_noise_t *pn, uint16_t cycles, int16_t *left, int16_t *right);
|
||||||
|
void pwrnoise_write(power_noise_t *pn, uint8_t reg, uint8_t val);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
|
@ -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 is `181`.
|
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.1 is `192`.
|
||||||
|
|
||||||
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.
|
||||||
|
|
648
papers/format.md
|
@ -32,6 +32,7 @@ these fields are 0 in format versions prior to 100 (0.6pre1).
|
||||||
|
|
||||||
the format versions are:
|
the format versions are:
|
||||||
|
|
||||||
|
- 192: Furnace 0.6.1
|
||||||
- 181: Furnace 0.6
|
- 181: Furnace 0.6
|
||||||
- 180: Furnace 0.6pre18
|
- 180: Furnace 0.6pre18
|
||||||
- 179: Furnace 0.6pre17
|
- 179: Furnace 0.6pre17
|
||||||
|
@ -234,7 +235,9 @@ size | description
|
||||||
| - 0xce: Namco C140 - 24 channels
|
| - 0xce: Namco C140 - 24 channels
|
||||||
| - 0xcf: Namco C219 - 16 channels
|
| - 0xcf: Namco C219 - 16 channels
|
||||||
| - 0xd0: Namco C352 - 32 channels (UNAVAILABLE)
|
| - 0xd0: Namco C352 - 32 channels (UNAVAILABLE)
|
||||||
| - 0xd1: ESFM - 18 channels (UNAVAILABLE)
|
| - 0xd1: ESFM - 18 channels
|
||||||
|
| - 0xd2: Ensoniq ES5503 (hard pan) - 32 channels (UNAVAILABLE)
|
||||||
|
| - 0xd4: PowerNoise - 4 channels
|
||||||
| - 0xde: YM2610B extended - 19 channels
|
| - 0xde: YM2610B extended - 19 channels
|
||||||
| - 0xe0: QSound - 19 channels
|
| - 0xe0: QSound - 19 channels
|
||||||
| - 0xfc: Pong - 1 channel
|
| - 0xfc: Pong - 1 channel
|
||||||
|
@ -503,628 +506,7 @@ see [newIns.md](newIns.md) for more information.
|
||||||
|
|
||||||
# old instrument (<127)
|
# old instrument (<127)
|
||||||
|
|
||||||
notes:
|
instruments in older versions of Furnace used a different format. see [oldIns.md](oldIns.md) for more information.
|
||||||
|
|
||||||
- the entire instrument is stored, regardless of instrument type.
|
|
||||||
- the macro range varies depending on the instrument type.
|
|
||||||
- "macro open" indicates whether the macro is collapsed or not in the instrument editor.
|
|
||||||
- as of format version 120, bit 1-2 indicates macro mode:
|
|
||||||
- 0: sequence (normal)
|
|
||||||
- 1: ADSR
|
|
||||||
- 2: LFO
|
|
||||||
- see sub-section for information on how to interpret parameters.
|
|
||||||
- FM operator order is:
|
|
||||||
- 1/3/2/4 (internal order) for OPN, OPM, OPZ and OPL 4-op
|
|
||||||
- 1/2/?/? (? = unused) for OPL 2-op and OPLL
|
|
||||||
- meaning of extended macros varies depending on instrument type.
|
|
||||||
- meaning of panning macros varies depending on instrument type:
|
|
||||||
- for hard-panned chips (e.g. FM and Game Boy): left panning is 2-bit panning macro (left/right)
|
|
||||||
- otherwise both left and right panning macros are used
|
|
||||||
|
|
||||||
```
|
|
||||||
size | description
|
|
||||||
-----|------------------------------------
|
|
||||||
4 | "INST" block ID
|
|
||||||
4 | size of this block
|
|
||||||
2 | format version (see header)
|
|
||||||
1 | instrument type
|
|
||||||
| - 0: SN76489/standard
|
|
||||||
| - 1: FM (OPN)
|
|
||||||
| - 2: Game Boy
|
|
||||||
| - 3: C64
|
|
||||||
| - 4: Amiga/sample
|
|
||||||
| - 5: PC Engine
|
|
||||||
| - 6: AY-3-8910
|
|
||||||
| - 7: AY8930
|
|
||||||
| - 8: TIA
|
|
||||||
| - 9: SAA1099
|
|
||||||
| - 10: VIC
|
|
||||||
| - 11: PET
|
|
||||||
| - 12: VRC6
|
|
||||||
| - 13: OPLL
|
|
||||||
| - 14: OPL
|
|
||||||
| - 15: FDS
|
|
||||||
| - 16: Virtual Boy
|
|
||||||
| - 17: Namco 163
|
|
||||||
| - 18: SCC
|
|
||||||
| - 19: OPZ
|
|
||||||
| - 20: POKEY
|
|
||||||
| - 21: PC Speaker
|
|
||||||
| - 22: WonderSwan
|
|
||||||
| - 23: Lynx
|
|
||||||
| - 24: VERA
|
|
||||||
| - 25: X1-010
|
|
||||||
| - 26: VRC6 (saw)
|
|
||||||
| - 27: ES5506
|
|
||||||
| - 28: MultiPCM
|
|
||||||
| - 29: SNES
|
|
||||||
| - 30: Sound Unit
|
|
||||||
| - 31: Namco WSG
|
|
||||||
| - 32: OPL (drums)
|
|
||||||
| - 33: FM (OPM)
|
|
||||||
| - 34: NES
|
|
||||||
| - 35: MSM6258
|
|
||||||
| - 36: MSM6295
|
|
||||||
| - 37: ADPCM-A
|
|
||||||
| - 38: ADPCM-B
|
|
||||||
| - 39: SegaPCM
|
|
||||||
| - 40: QSound
|
|
||||||
| - 41: YMZ280B
|
|
||||||
| - 42: RF5C68
|
|
||||||
| - 43: MSM5232
|
|
||||||
| - 44: T6W28
|
|
||||||
1 | reserved
|
|
||||||
STR | instrument name
|
|
||||||
--- | **FM instrument data**
|
|
||||||
1 | alg (SUS on OPLL)
|
|
||||||
1 | feedback
|
|
||||||
1 | fms (DC on OPLL)
|
|
||||||
1 | ams (DM on OPLL)
|
|
||||||
1 | operator count
|
|
||||||
| - this is either 2 or 4, and is ignored on non-OPL systems.
|
|
||||||
| - always read 4 ops regardless of this value.
|
|
||||||
1 | OPLL preset (>=60) or reserved
|
|
||||||
| - 0: custom
|
|
||||||
| - 1-15: pre-defined patches
|
|
||||||
| - 16: drums (compatibility only!)
|
|
||||||
2 | reserved
|
|
||||||
--- | **FM operator data** × 4
|
|
||||||
1 | am
|
|
||||||
1 | ar
|
|
||||||
1 | dr
|
|
||||||
1 | mult
|
|
||||||
1 | rr
|
|
||||||
1 | sl
|
|
||||||
1 | tl
|
|
||||||
1 | dt2
|
|
||||||
1 | rs
|
|
||||||
1 | dt
|
|
||||||
1 | d2r
|
|
||||||
1 | ssgEnv
|
|
||||||
| - bit 4: on (EG-S on OPLL)
|
|
||||||
| - bit 0-3: envelope type
|
|
||||||
1 | dam (for YMU759 compat; REV on OPZ)
|
|
||||||
1 | dvb (for YMU759 compat; FINE on OPZ)
|
|
||||||
1 | egt (for YMU759 compat; FixedFreq on OPZ)
|
|
||||||
1 | ksl (EGShift on OPZ)
|
|
||||||
1 | sus
|
|
||||||
1 | vib
|
|
||||||
1 | ws
|
|
||||||
1 | ksr
|
|
||||||
1 | operator enabled (>=114) or reserved
|
|
||||||
1 | KVS mode (>=115) or reserved
|
|
||||||
| - 0: off
|
|
||||||
| - 1: on
|
|
||||||
| - 2: auto (depending on alg)
|
|
||||||
10 | reserved
|
|
||||||
--- | **Game Boy instrument data**
|
|
||||||
1 | volume
|
|
||||||
1 | direction
|
|
||||||
1 | length
|
|
||||||
1 | sound length
|
|
||||||
--- | **C64 instrument data**
|
|
||||||
1 | triangle
|
|
||||||
1 | saw
|
|
||||||
1 | pulse
|
|
||||||
1 | noise
|
|
||||||
1 | attack
|
|
||||||
1 | decay
|
|
||||||
1 | sustain
|
|
||||||
1 | release
|
|
||||||
2 | duty
|
|
||||||
1 | ring mod
|
|
||||||
1 | osc sync
|
|
||||||
1 | to filter
|
|
||||||
1 | init filter
|
|
||||||
1 | vol macro is cutoff (<187) or reserved
|
|
||||||
| - from version 187 onwards, volume and cutoff macros are separate.
|
|
||||||
| - if this is on and the version is less than 187, move the volume macro into the ALG one.
|
|
||||||
1 | resonance
|
|
||||||
1 | low pass
|
|
||||||
1 | band pass
|
|
||||||
1 | high pass
|
|
||||||
1 | channel 3 off
|
|
||||||
2 | cutoff
|
|
||||||
1 | duty macro is absolute
|
|
||||||
1 | filter macro is absolute
|
|
||||||
--- | **Amiga instrument data**
|
|
||||||
2 | initial sample
|
|
||||||
1 | mode (>=82) or reserved
|
|
||||||
| - 0: sample
|
|
||||||
| - 1: wavetable
|
|
||||||
1 | wavetable length (-1) (>=82) or reserved
|
|
||||||
12 | reserved
|
|
||||||
--- | **standard instrument data**
|
|
||||||
4 | volume macro length
|
|
||||||
4 | arp macro length
|
|
||||||
4 | duty macro length
|
|
||||||
4 | wave macro length
|
|
||||||
4 | pitch macro length (>=17)
|
|
||||||
4 | extra 1 macro length (>=17)
|
|
||||||
4 | extra 2 macro length (>=17)
|
|
||||||
4 | extra 3 macro length (>=17)
|
|
||||||
4 | volume macro loop
|
|
||||||
4 | arp macro loop
|
|
||||||
4 | duty macro loop
|
|
||||||
4 | wave macro loop
|
|
||||||
4 | pitch macro loop (>=17)
|
|
||||||
4 | extra 1 macro loop (>=17)
|
|
||||||
4 | extra 2 macro loop (>=17)
|
|
||||||
4 | extra 3 macro loop (>=17)
|
|
||||||
1 | arp macro mode (<112) or reserved
|
|
||||||
| - treat this value in a special way.
|
|
||||||
| - before version 112, this byte indicates whether the arp macro mode is fixed or not.
|
|
||||||
| - from that version onwards, the fixed mode is part of the macro values.
|
|
||||||
| - to convert a <112 macro mode to a modern one, do the following:
|
|
||||||
| - is the macro mode set to fixed?
|
|
||||||
| - if yes, then:
|
|
||||||
| - set bit 30 of all arp macro values (this is the fixed mode bit)
|
|
||||||
| - does the macro loop?
|
|
||||||
| - if yes, then do nothing else
|
|
||||||
| - if no, then add one to the macro length, and set the last macro value to 0
|
|
||||||
| - if no, then do nothing
|
|
||||||
1 | reserved (>=17) or volume macro height (>=15) or reserved
|
|
||||||
1 | reserved (>=17) or duty macro height (>=15) or reserved
|
|
||||||
1 | reserved (>=17) or wave macro height (>=15) or reserved
|
|
||||||
4?? | volume macro
|
|
||||||
| - before version 87, if this is the C64 relative cutoff macro, its values were stored offset by 18.
|
|
||||||
4?? | arp macro
|
|
||||||
| - before version 31, this macro's values were stored offset by 12.
|
|
||||||
| - from version 112 onward, bit 30 of a value indicates fixed mode.
|
|
||||||
4?? | duty macro
|
|
||||||
| - before version 87, if this is the C64 relative duty macro, its values were stored offset by 12.
|
|
||||||
4?? | wave macro
|
|
||||||
4?? | pitch macro (>=17)
|
|
||||||
4?? | extra 1 macro (>=17)
|
|
||||||
4?? | extra 2 macro (>=17)
|
|
||||||
4?? | extra 3 macro (>=17)
|
|
||||||
4 | alg macro length (>=29)
|
|
||||||
4 | fb macro length (>=29)
|
|
||||||
4 | fms macro length (>=29)
|
|
||||||
4 | ams macro length (>=29)
|
|
||||||
4 | alg macro loop (>=29)
|
|
||||||
4 | fb macro loop (>=29)
|
|
||||||
4 | fms macro loop (>=29)
|
|
||||||
4 | ams macro loop (>=29)
|
|
||||||
1 | volume macro open (>=29)
|
|
||||||
1 | arp macro open (>=29)
|
|
||||||
1 | duty macro open (>=29)
|
|
||||||
1 | wave macro open (>=29)
|
|
||||||
1 | pitch macro open (>=29)
|
|
||||||
1 | extra 1 macro open (>=29)
|
|
||||||
1 | extra 2 macro open (>=29)
|
|
||||||
1 | extra 3 macro open (>=29)
|
|
||||||
1 | alg macro open (>=29)
|
|
||||||
1 | fb macro open (>=29)
|
|
||||||
1 | fms macro open (>=29)
|
|
||||||
1 | ams macro open (>=29)
|
|
||||||
4?? | alg macro (>=29)
|
|
||||||
4?? | fb macro (>=29)
|
|
||||||
4?? | fms macro (>=29)
|
|
||||||
4?? | ams macro (>=29)
|
|
||||||
--- | **operator macro headers** × 4 (>=29)
|
|
||||||
4 | AM macro length
|
|
||||||
4 | AR macro length
|
|
||||||
4 | DR macro length
|
|
||||||
4 | MULT macro length
|
|
||||||
4 | RR macro length
|
|
||||||
4 | SL macro length
|
|
||||||
4 | TL macro length
|
|
||||||
4 | DT2 macro length
|
|
||||||
4 | RS macro length
|
|
||||||
4 | DT macro length
|
|
||||||
4 | D2R macro length
|
|
||||||
4 | SSG-EG macro length
|
|
||||||
4 | AM macro loop
|
|
||||||
4 | AR macro loop
|
|
||||||
4 | DR macro loop
|
|
||||||
4 | MULT macro loop
|
|
||||||
4 | RR macro loop
|
|
||||||
4 | SL macro loop
|
|
||||||
4 | TL macro loop
|
|
||||||
4 | DT2 macro loop
|
|
||||||
4 | RS macro loop
|
|
||||||
4 | DT macro loop
|
|
||||||
4 | D2R macro loop
|
|
||||||
4 | SSG-EG macro loop
|
|
||||||
1 | AM macro open
|
|
||||||
1 | AR macro open
|
|
||||||
1 | DR macro open
|
|
||||||
1 | MULT macro open
|
|
||||||
1 | RR macro open
|
|
||||||
1 | SL macro open
|
|
||||||
1 | TL macro open
|
|
||||||
1 | DT2 macro open
|
|
||||||
1 | RS macro open
|
|
||||||
1 | DT macro open
|
|
||||||
1 | D2R macro open
|
|
||||||
1 | SSG-EG macro open
|
|
||||||
--- | **operator macros** × 4 (>=29)
|
|
||||||
1?? | AM macro
|
|
||||||
1?? | AR macro
|
|
||||||
1?? | DR macro
|
|
||||||
1?? | MULT macro
|
|
||||||
1?? | RR macro
|
|
||||||
1?? | SL macro
|
|
||||||
1?? | TL macro
|
|
||||||
1?? | DT2 macro
|
|
||||||
1?? | RS macro
|
|
||||||
1?? | DT macro
|
|
||||||
1?? | D2R macro
|
|
||||||
1?? | SSG-EG macro
|
|
||||||
--- | **release points** (>=44)
|
|
||||||
4 | volume macro release
|
|
||||||
4 | arp macro release
|
|
||||||
4 | duty macro release
|
|
||||||
4 | wave macro release
|
|
||||||
4 | pitch macro release
|
|
||||||
4 | extra 1 macro release
|
|
||||||
4 | extra 2 macro release
|
|
||||||
4 | extra 3 macro release
|
|
||||||
4 | alg macro release
|
|
||||||
4 | fb macro release
|
|
||||||
4 | fms macro release
|
|
||||||
4 | ams macro release
|
|
||||||
--- | **operator release points** × 4 (>=44)
|
|
||||||
4 | AM macro release
|
|
||||||
4 | AR macro release
|
|
||||||
4 | DR macro release
|
|
||||||
4 | MULT macro release
|
|
||||||
4 | RR macro release
|
|
||||||
4 | SL macro release
|
|
||||||
4 | TL macro release
|
|
||||||
4 | DT2 macro release
|
|
||||||
4 | RS macro release
|
|
||||||
4 | DT macro release
|
|
||||||
4 | D2R macro release
|
|
||||||
4 | SSG-EG macro release
|
|
||||||
--- | **extended op macro headers** × 4 (>=61)
|
|
||||||
4 | DAM macro length
|
|
||||||
4 | DVB macro length
|
|
||||||
4 | EGT macro length
|
|
||||||
4 | KSL macro length
|
|
||||||
4 | SUS macro length
|
|
||||||
4 | VIB macro length
|
|
||||||
4 | WS macro length
|
|
||||||
4 | KSR macro length
|
|
||||||
4 | DAM macro loop
|
|
||||||
4 | DVB macro loop
|
|
||||||
4 | EGT macro loop
|
|
||||||
4 | KSL macro loop
|
|
||||||
4 | SUS macro loop
|
|
||||||
4 | VIB macro loop
|
|
||||||
4 | WS macro loop
|
|
||||||
4 | KSR macro loop
|
|
||||||
4 | DAM macro release
|
|
||||||
4 | DVB macro release
|
|
||||||
4 | EGT macro release
|
|
||||||
4 | KSL macro release
|
|
||||||
4 | SUS macro release
|
|
||||||
4 | VIB macro release
|
|
||||||
4 | WS macro release
|
|
||||||
4 | KSR macro release
|
|
||||||
1 | DAM macro open
|
|
||||||
1 | DVB macro open
|
|
||||||
1 | EGT macro open
|
|
||||||
1 | KSL macro open
|
|
||||||
1 | SUS macro open
|
|
||||||
1 | VIB macro open
|
|
||||||
1 | WS macro open
|
|
||||||
1 | KSR macro open
|
|
||||||
--- | **extended op macros** × 4 (>=61)
|
|
||||||
1?? | DAM macro
|
|
||||||
1?? | DVB macro
|
|
||||||
1?? | EGT macro
|
|
||||||
1?? | KSL macro
|
|
||||||
1?? | SUS macro
|
|
||||||
1?? | VIB macro
|
|
||||||
1?? | WS macro
|
|
||||||
1?? | KSR macro
|
|
||||||
--- | **OPL drums mode data** (>=63)
|
|
||||||
1 | fixed frequency mode
|
|
||||||
1 | reserved
|
|
||||||
2 | kick frequency
|
|
||||||
2 | snare/hi-hat frequency
|
|
||||||
2 | tom/top frequency
|
|
||||||
--- | **Sample instrument extra data** (>=67)
|
|
||||||
1 | use note map
|
|
||||||
| - only read the following two data structures if this is true!
|
|
||||||
4?? | note frequency × 120
|
|
||||||
| - 480 bytes
|
|
||||||
2?? | note sample × 120
|
|
||||||
| - 240 bytes
|
|
||||||
--- | **Namco 163 data** (>=73)
|
|
||||||
4 | initial waveform
|
|
||||||
1 | wave position
|
|
||||||
1 | wave length
|
|
||||||
1 | wave mode:
|
|
||||||
| - bit 1: update on change
|
|
||||||
| - bit 0: load on playback
|
|
||||||
1 | reserved
|
|
||||||
--- | **even more macros** (>=76)
|
|
||||||
4 | left panning macro length
|
|
||||||
4 | right panning macro length
|
|
||||||
4 | phase reset macro length
|
|
||||||
4 | extra 4 macro length
|
|
||||||
4 | extra 5 macro length
|
|
||||||
4 | extra 6 macro length
|
|
||||||
4 | extra 7 macro length
|
|
||||||
4 | extra 8 macro length
|
|
||||||
4 | left panning macro loop
|
|
||||||
4 | right panning macro loop
|
|
||||||
4 | phase reset macro loop
|
|
||||||
4 | extra 4 macro loop
|
|
||||||
4 | extra 5 macro loop
|
|
||||||
4 | extra 6 macro loop
|
|
||||||
4 | extra 7 macro loop
|
|
||||||
4 | extra 8 macro loop
|
|
||||||
4 | left panning macro release
|
|
||||||
4 | right panning macro release
|
|
||||||
4 | phase reset macro release
|
|
||||||
4 | extra 4 macro release
|
|
||||||
4 | extra 5 macro release
|
|
||||||
4 | extra 6 macro release
|
|
||||||
4 | extra 7 macro release
|
|
||||||
4 | extra 8 macro release
|
|
||||||
1 | left panning macro open
|
|
||||||
1 | right panning macro open
|
|
||||||
1 | phase reset macro open
|
|
||||||
1 | extra 4 macro open
|
|
||||||
1 | extra 5 macro open
|
|
||||||
1 | extra 6 macro open
|
|
||||||
1 | extra 7 macro open
|
|
||||||
1 | extra 8 macro open
|
|
||||||
--- | **even more macro data** (>=76)
|
|
||||||
4?? | left panning macro
|
|
||||||
4?? | right panning macro
|
|
||||||
4?? | phase reset macro
|
|
||||||
4?? | extra 4 macro
|
|
||||||
4?? | extra 5 macro
|
|
||||||
4?? | extra 6 macro
|
|
||||||
4?? | extra 7 macro
|
|
||||||
4?? | extra 8 macro
|
|
||||||
--- | **FDS instrument data** (>=76)
|
|
||||||
4 | modulation speed
|
|
||||||
4 | modulation depth
|
|
||||||
1 | init modulation table with first wave
|
|
||||||
3 | reserved
|
|
||||||
32 | modulation table
|
|
||||||
--- | **OPZ instrument extra data** (>=77)
|
|
||||||
1 | fms2
|
|
||||||
1 | ams2
|
|
||||||
--- | **wavetable synth data** (>=79)
|
|
||||||
4 | first wave
|
|
||||||
4 | second wave
|
|
||||||
1 | rate divider
|
|
||||||
1 | effect
|
|
||||||
| - bit 7: single or dual effect
|
|
||||||
1 | enabled
|
|
||||||
1 | global
|
|
||||||
1 | speed (+1)
|
|
||||||
1 | parameter 1
|
|
||||||
1 | parameter 2
|
|
||||||
1 | parameter 3
|
|
||||||
1 | parameter 4
|
|
||||||
--- | **additional macro mode flags** (>=84)
|
|
||||||
1 | volume macro mode
|
|
||||||
1 | duty macro mode
|
|
||||||
1 | wave macro mode
|
|
||||||
1 | pitch macro mode
|
|
||||||
1 | extra 1 macro mode
|
|
||||||
1 | extra 2 macro mode
|
|
||||||
1 | extra 3 macro mode
|
|
||||||
1 | alg macro mode
|
|
||||||
1 | fb macro mode
|
|
||||||
1 | fms macro mode
|
|
||||||
1 | ams macro mode
|
|
||||||
1 | left panning macro mode
|
|
||||||
1 | right panning macro mode
|
|
||||||
1 | phase reset macro mode
|
|
||||||
1 | extra 4 macro mode
|
|
||||||
1 | extra 5 macro mode
|
|
||||||
1 | extra 6 macro mode
|
|
||||||
1 | extra 7 macro mode
|
|
||||||
1 | extra 8 macro mode
|
|
||||||
--- | **extra C64 data** (>=89)
|
|
||||||
1 | don't test/gate before new note
|
|
||||||
--- | **MultiPCM data** (>=93)
|
|
||||||
1 | attack rate
|
|
||||||
1 | decay 1 rate
|
|
||||||
1 | decay level
|
|
||||||
1 | decay 2 rate
|
|
||||||
1 | release rate
|
|
||||||
1 | rate correction
|
|
||||||
1 | lfo rate
|
|
||||||
1 | vib depth
|
|
||||||
1 | am depth
|
|
||||||
23 | reserved
|
|
||||||
--- | **Sound Unit data** (>=104)
|
|
||||||
1 | use sample
|
|
||||||
1 | switch roles of phase reset timer and frequency
|
|
||||||
--- | **Game Boy envelope sequence** (>=105)
|
|
||||||
1 | length
|
|
||||||
??? | hardware sequence data
|
|
||||||
| size is length*3:
|
|
||||||
| 1 byte: command
|
|
||||||
| - 0: set envelope
|
|
||||||
| - 1: set sweep
|
|
||||||
| - 2: wait
|
|
||||||
| - 3: wait for release
|
|
||||||
| - 4: loop
|
|
||||||
| - 5: loop until release
|
|
||||||
| 2 bytes: data
|
|
||||||
| - for set envelope:
|
|
||||||
| - 1 byte: parameter
|
|
||||||
| - bit 4-7: volume
|
|
||||||
| - bit 3: direction
|
|
||||||
| - bit 0-2: length
|
|
||||||
| - 1 byte: sound length
|
|
||||||
| - for set sweep:
|
|
||||||
| - 1 byte: parameter
|
|
||||||
| - bit 4-6: length
|
|
||||||
| - bit 3: direction
|
|
||||||
| - bit 0-2: shift
|
|
||||||
| - 1 byte: nothing
|
|
||||||
| - for wait:
|
|
||||||
| - 1 byte: length (in ticks)
|
|
||||||
| - 1 byte: nothing
|
|
||||||
| - for wait for release:
|
|
||||||
| - 2 bytes: nothing
|
|
||||||
| - for loop/loop until release:
|
|
||||||
| - 2 bytes: position
|
|
||||||
--- | **Game Boy extra flags** (>=106)
|
|
||||||
1 | use software envelope
|
|
||||||
1 | always init hard env on new note
|
|
||||||
--- | **ES5506 data** (>=107)
|
|
||||||
1 | filter mode
|
|
||||||
| - 0: HPK2_HPK2
|
|
||||||
| - 1: HPK2_LPK1
|
|
||||||
| - 2: LPK2_LPK2
|
|
||||||
| - 3: LPK2_LPK1
|
|
||||||
2 | K1
|
|
||||||
2 | K2
|
|
||||||
2 | envelope count
|
|
||||||
1 | left volume ramp
|
|
||||||
1 | right volume ramp
|
|
||||||
1 | K1 ramp
|
|
||||||
1 | K2 ramp
|
|
||||||
1 | K1 slow
|
|
||||||
1 | K2 slow
|
|
||||||
--- | **SNES data** (>=109)
|
|
||||||
1 | use envelope
|
|
||||||
1 | gain mode
|
|
||||||
1 | gain
|
|
||||||
1 | attack
|
|
||||||
1 | decay
|
|
||||||
1 | sustain
|
|
||||||
| - bit 3: sustain mode (>=118)
|
|
||||||
1 | release
|
|
||||||
--- | **macro speeds/delays** (>=111)
|
|
||||||
1 | volume macro speed
|
|
||||||
1 | arp macro speed
|
|
||||||
1 | duty macro speed
|
|
||||||
1 | wave macro speed
|
|
||||||
1 | pitch macro speed
|
|
||||||
1 | extra 1 macro speed
|
|
||||||
1 | extra 2 macro speed
|
|
||||||
1 | extra 3 macro speed
|
|
||||||
1 | alg macro speed
|
|
||||||
1 | fb macro speed
|
|
||||||
1 | fms macro speed
|
|
||||||
1 | ams macro speed
|
|
||||||
1 | left panning macro speed
|
|
||||||
1 | right panning macro speed
|
|
||||||
1 | phase reset macro speed
|
|
||||||
1 | extra 4 macro speed
|
|
||||||
1 | extra 5 macro speed
|
|
||||||
1 | extra 6 macro speed
|
|
||||||
1 | extra 7 macro speed
|
|
||||||
1 | extra 8 macro speed
|
|
||||||
1 | volume macro delay
|
|
||||||
1 | arp macro delay
|
|
||||||
1 | duty macro delay
|
|
||||||
1 | wave macro delay
|
|
||||||
1 | pitch macro delay
|
|
||||||
1 | extra 1 macro delay
|
|
||||||
1 | extra 2 macro delay
|
|
||||||
1 | extra 3 macro delay
|
|
||||||
1 | alg macro delay
|
|
||||||
1 | fb macro delay
|
|
||||||
1 | fms macro delay
|
|
||||||
1 | ams macro delay
|
|
||||||
1 | left panning macro delay
|
|
||||||
1 | right panning macro delay
|
|
||||||
1 | phase reset macro delay
|
|
||||||
1 | extra 4 macro delay
|
|
||||||
1 | extra 5 macro delay
|
|
||||||
1 | extra 6 macro delay
|
|
||||||
1 | extra 7 macro delay
|
|
||||||
1 | extra 8 macro delay
|
|
||||||
--- | **operator macro speeds/delay** × 4 (>=111)
|
|
||||||
1 | AM macro speed
|
|
||||||
1 | AR macro speed
|
|
||||||
1 | DR macro speed
|
|
||||||
1 | MULT macro speed
|
|
||||||
1 | RR macro speed
|
|
||||||
1 | SL macro speed
|
|
||||||
1 | TL macro speed
|
|
||||||
1 | DT2 macro speed
|
|
||||||
1 | RS macro speed
|
|
||||||
1 | DT macro speed
|
|
||||||
1 | D2R macro speed
|
|
||||||
1 | SSG-EG macro speed
|
|
||||||
1 | DAM macro speed
|
|
||||||
1 | DVB macro speed
|
|
||||||
1 | EGT macro speed
|
|
||||||
1 | KSL macro speed
|
|
||||||
1 | SUS macro speed
|
|
||||||
1 | VIB macro speed
|
|
||||||
1 | WS macro speed
|
|
||||||
1 | KSR macro speed
|
|
||||||
1 | AM macro delay
|
|
||||||
1 | AR macro delay
|
|
||||||
1 | DR macro delay
|
|
||||||
1 | MULT macro delay
|
|
||||||
1 | RR macro delay
|
|
||||||
1 | SL macro delay
|
|
||||||
1 | TL macro delay
|
|
||||||
1 | DT2 macro delay
|
|
||||||
1 | RS macro delay
|
|
||||||
1 | DT macro delay
|
|
||||||
1 | D2R macro delay
|
|
||||||
1 | SSG-EG macro delay
|
|
||||||
1 | DAM macro delay
|
|
||||||
1 | DVB macro delay
|
|
||||||
1 | EGT macro delay
|
|
||||||
1 | KSL macro delay
|
|
||||||
1 | SUS macro delay
|
|
||||||
1 | VIB macro delay
|
|
||||||
1 | WS macro delay
|
|
||||||
1 | KSR macro delay
|
|
||||||
```
|
|
||||||
|
|
||||||
## interpreting macro mode values
|
|
||||||
|
|
||||||
- sequence (normal): I think this is obvious...
|
|
||||||
- ADSR:
|
|
||||||
- `val[0]`: bottom
|
|
||||||
- `val[1]`: top
|
|
||||||
- `val[2]`: attack
|
|
||||||
- `val[3]`: hold time
|
|
||||||
- `val[4]`: decay
|
|
||||||
- `val[5]`: sustain level
|
|
||||||
- `val[6]`: sustain hold time
|
|
||||||
- `val[7]`: decay 2
|
|
||||||
- `val[8]`: release
|
|
||||||
- LFO:
|
|
||||||
- `val[11]`: speed
|
|
||||||
- `val[12]`: waveform
|
|
||||||
- 0: triangle
|
|
||||||
- 1: saw
|
|
||||||
- 2: pulse
|
|
||||||
- `val[13]`: phase
|
|
||||||
- `val[14]`: loop
|
|
||||||
- `val[15]`: global (not sure how will I implement this)
|
|
||||||
|
|
||||||
## C64 compatibility note (>=187)
|
## C64 compatibility note (>=187)
|
||||||
|
|
||||||
|
@ -1332,26 +714,6 @@ size | description
|
||||||
STR | pattern name (>=51)
|
STR | pattern name (>=51)
|
||||||
```
|
```
|
||||||
|
|
||||||
# the Furnace instrument format (.fui)
|
|
||||||
|
|
||||||
the instrument format is pretty similar to the file format, but it also stores wavetables and samples used by the instrument.
|
|
||||||
|
|
||||||
```
|
|
||||||
size | description
|
|
||||||
-----|------------------------------------
|
|
||||||
16 | "-Furnace instr.-" format magic
|
|
||||||
2 | format version
|
|
||||||
2 | reserved
|
|
||||||
4 | pointer to instrument data
|
|
||||||
2 | wavetable count
|
|
||||||
2 | sample count
|
|
||||||
4 | reserved
|
|
||||||
4?? | pointers to wavetables
|
|
||||||
4?? | pointers to samples
|
|
||||||
```
|
|
||||||
|
|
||||||
instrument data follows.
|
|
||||||
|
|
||||||
# the Furnace wavetable format (.fuw)
|
# the Furnace wavetable format (.fuw)
|
||||||
|
|
||||||
similar to the instrument format...
|
similar to the instrument format...
|
||||||
|
|
|
@ -121,6 +121,9 @@ the following instrument types are available:
|
||||||
- 52: TED
|
- 52: TED
|
||||||
- 53: C140
|
- 53: C140
|
||||||
- 54: C219
|
- 54: C219
|
||||||
|
- 55: ESFM
|
||||||
|
- 56: PowerNoise (noise)
|
||||||
|
- 57: PowerNoise (slope)
|
||||||
|
|
||||||
the following feature codes are recognized:
|
the following feature codes are recognized:
|
||||||
|
|
||||||
|
@ -146,6 +149,8 @@ the following feature codes are recognized:
|
||||||
- `ES`: ES5506 ins data
|
- `ES`: ES5506 ins data
|
||||||
- `X1`: X1-010 ins data
|
- `X1`: X1-010 ins data
|
||||||
- `NE`: NES DPCM sample map data
|
- `NE`: NES DPCM sample map data
|
||||||
|
- `EF`: ESFM ins data
|
||||||
|
- `PN`: PowerNoise ins data
|
||||||
- `EN`: end of features
|
- `EN`: end of features
|
||||||
- if you find this feature code, stop reading the instrument.
|
- if you find this feature code, stop reading the instrument.
|
||||||
- it will usually appear only when there sample/wave lists.
|
- it will usually appear only when there sample/wave lists.
|
||||||
|
@ -653,3 +658,11 @@ size | description
|
||||||
|
|
||||||
if some fields are missing, that's because they are defined in the SM feature.
|
if some fields are missing, that's because they are defined in the SM feature.
|
||||||
NES instruments with DPCM sample maps have both SM and NE features.
|
NES instruments with DPCM sample maps have both SM and NE features.
|
||||||
|
|
||||||
|
# PowerNoise data (PN)
|
||||||
|
|
||||||
|
```
|
||||||
|
size | description
|
||||||
|
-----|------------------------------------
|
||||||
|
1 | octave
|
||||||
|
```
|
||||||
|
|
651
papers/oldIns.md
Normal file
|
@ -0,0 +1,651 @@
|
||||||
|
# old instrument format (<127)
|
||||||
|
|
||||||
|
this format is used in older versions of Furnace.
|
||||||
|
|
||||||
|
# header
|
||||||
|
|
||||||
|
.fui files use the following header:
|
||||||
|
|
||||||
|
```
|
||||||
|
size | description
|
||||||
|
-----|------------------------------------
|
||||||
|
16 | "-Furnace instr.-" format magic
|
||||||
|
2 | format version
|
||||||
|
2 | reserved
|
||||||
|
4 | pointer to instrument data
|
||||||
|
2 | wavetable count
|
||||||
|
2 | sample count
|
||||||
|
4 | reserved
|
||||||
|
4?? | pointers to wavetables
|
||||||
|
4?? | pointers to samples
|
||||||
|
```
|
||||||
|
|
||||||
|
instrument data follows.
|
||||||
|
|
||||||
|
this header is not present on instruments inside a .fur file.
|
||||||
|
|
||||||
|
# data
|
||||||
|
|
||||||
|
notes:
|
||||||
|
|
||||||
|
- the entire instrument is stored, regardless of instrument type.
|
||||||
|
- the macro range varies depending on the instrument type.
|
||||||
|
- "macro open" indicates whether the macro is collapsed or not in the instrument editor.
|
||||||
|
- as of format version 120, bit 1-2 indicates macro mode:
|
||||||
|
- 0: sequence (normal)
|
||||||
|
- 1: ADSR
|
||||||
|
- 2: LFO
|
||||||
|
- see sub-section for information on how to interpret parameters.
|
||||||
|
- FM operator order is:
|
||||||
|
- 1/3/2/4 (internal order) for OPN, OPM, OPZ and OPL 4-op
|
||||||
|
- 1/2/?/? (? = unused) for OPL 2-op and OPLL
|
||||||
|
- meaning of extended macros varies depending on instrument type.
|
||||||
|
- meaning of panning macros varies depending on instrument type:
|
||||||
|
- for hard-panned chips (e.g. FM and Game Boy): left panning is 2-bit panning macro (left/right)
|
||||||
|
- otherwise both left and right panning macros are used
|
||||||
|
|
||||||
|
```
|
||||||
|
size | description
|
||||||
|
-----|------------------------------------
|
||||||
|
4 | "INST" block ID
|
||||||
|
4 | size of this block
|
||||||
|
2 | format version (see header)
|
||||||
|
1 | instrument type
|
||||||
|
| - 0: SN76489/standard
|
||||||
|
| - 1: FM (OPN)
|
||||||
|
| - 2: Game Boy
|
||||||
|
| - 3: C64
|
||||||
|
| - 4: Amiga/sample
|
||||||
|
| - 5: PC Engine
|
||||||
|
| - 6: AY-3-8910
|
||||||
|
| - 7: AY8930
|
||||||
|
| - 8: TIA
|
||||||
|
| - 9: SAA1099
|
||||||
|
| - 10: VIC
|
||||||
|
| - 11: PET
|
||||||
|
| - 12: VRC6
|
||||||
|
| - 13: OPLL
|
||||||
|
| - 14: OPL
|
||||||
|
| - 15: FDS
|
||||||
|
| - 16: Virtual Boy
|
||||||
|
| - 17: Namco 163
|
||||||
|
| - 18: SCC
|
||||||
|
| - 19: OPZ
|
||||||
|
| - 20: POKEY
|
||||||
|
| - 21: PC Speaker
|
||||||
|
| - 22: WonderSwan
|
||||||
|
| - 23: Lynx
|
||||||
|
| - 24: VERA
|
||||||
|
| - 25: X1-010
|
||||||
|
| - 26: VRC6 (saw)
|
||||||
|
| - 27: ES5506
|
||||||
|
| - 28: MultiPCM
|
||||||
|
| - 29: SNES
|
||||||
|
| - 30: Sound Unit
|
||||||
|
| - 31: Namco WSG
|
||||||
|
| - 32: OPL (drums)
|
||||||
|
| - 33: FM (OPM)
|
||||||
|
| - 34: NES
|
||||||
|
| - 35: MSM6258
|
||||||
|
| - 36: MSM6295
|
||||||
|
| - 37: ADPCM-A
|
||||||
|
| - 38: ADPCM-B
|
||||||
|
| - 39: SegaPCM
|
||||||
|
| - 40: QSound
|
||||||
|
| - 41: YMZ280B
|
||||||
|
| - 42: RF5C68
|
||||||
|
| - 43: MSM5232
|
||||||
|
| - 44: T6W28
|
||||||
|
1 | reserved
|
||||||
|
STR | instrument name
|
||||||
|
--- | **FM instrument data**
|
||||||
|
1 | alg (SUS on OPLL)
|
||||||
|
1 | feedback
|
||||||
|
1 | fms (DC on OPLL)
|
||||||
|
1 | ams (DM on OPLL)
|
||||||
|
1 | operator count
|
||||||
|
| - this is either 2 or 4, and is ignored on non-OPL systems.
|
||||||
|
| - always read 4 ops regardless of this value.
|
||||||
|
1 | OPLL preset (>=60) or reserved
|
||||||
|
| - 0: custom
|
||||||
|
| - 1-15: pre-defined patches
|
||||||
|
| - 16: drums (compatibility only!)
|
||||||
|
2 | reserved
|
||||||
|
--- | **FM operator data** × 4
|
||||||
|
1 | am
|
||||||
|
1 | ar
|
||||||
|
1 | dr
|
||||||
|
1 | mult
|
||||||
|
1 | rr
|
||||||
|
1 | sl
|
||||||
|
1 | tl
|
||||||
|
1 | dt2
|
||||||
|
1 | rs
|
||||||
|
1 | dt
|
||||||
|
1 | d2r
|
||||||
|
1 | ssgEnv
|
||||||
|
| - bit 4: on (EG-S on OPLL)
|
||||||
|
| - bit 0-3: envelope type
|
||||||
|
1 | dam (for YMU759 compat; REV on OPZ)
|
||||||
|
1 | dvb (for YMU759 compat; FINE on OPZ)
|
||||||
|
1 | egt (for YMU759 compat; FixedFreq on OPZ)
|
||||||
|
1 | ksl (EGShift on OPZ)
|
||||||
|
1 | sus
|
||||||
|
1 | vib
|
||||||
|
1 | ws
|
||||||
|
1 | ksr
|
||||||
|
1 | operator enabled (>=114) or reserved
|
||||||
|
1 | KVS mode (>=115) or reserved
|
||||||
|
| - 0: off
|
||||||
|
| - 1: on
|
||||||
|
| - 2: auto (depending on alg)
|
||||||
|
10 | reserved
|
||||||
|
--- | **Game Boy instrument data**
|
||||||
|
1 | volume
|
||||||
|
1 | direction
|
||||||
|
1 | length
|
||||||
|
1 | sound length
|
||||||
|
--- | **C64 instrument data**
|
||||||
|
1 | triangle
|
||||||
|
1 | saw
|
||||||
|
1 | pulse
|
||||||
|
1 | noise
|
||||||
|
1 | attack
|
||||||
|
1 | decay
|
||||||
|
1 | sustain
|
||||||
|
1 | release
|
||||||
|
2 | duty
|
||||||
|
1 | ring mod
|
||||||
|
1 | osc sync
|
||||||
|
1 | to filter
|
||||||
|
1 | init filter
|
||||||
|
1 | vol macro is cutoff (<187) or reserved
|
||||||
|
| - from version 187 onwards, volume and cutoff macros are separate.
|
||||||
|
| - if this is on and the version is less than 187, move the volume macro into the ALG one.
|
||||||
|
1 | resonance
|
||||||
|
1 | low pass
|
||||||
|
1 | band pass
|
||||||
|
1 | high pass
|
||||||
|
1 | channel 3 off
|
||||||
|
2 | cutoff
|
||||||
|
1 | duty macro is absolute
|
||||||
|
1 | filter macro is absolute
|
||||||
|
--- | **Amiga instrument data**
|
||||||
|
2 | initial sample
|
||||||
|
1 | mode (>=82) or reserved
|
||||||
|
| - 0: sample
|
||||||
|
| - 1: wavetable
|
||||||
|
1 | wavetable length (-1) (>=82) or reserved
|
||||||
|
12 | reserved
|
||||||
|
--- | **standard instrument data**
|
||||||
|
4 | volume macro length
|
||||||
|
4 | arp macro length
|
||||||
|
4 | duty macro length
|
||||||
|
4 | wave macro length
|
||||||
|
4 | pitch macro length (>=17)
|
||||||
|
4 | extra 1 macro length (>=17)
|
||||||
|
4 | extra 2 macro length (>=17)
|
||||||
|
4 | extra 3 macro length (>=17)
|
||||||
|
4 | volume macro loop
|
||||||
|
4 | arp macro loop
|
||||||
|
4 | duty macro loop
|
||||||
|
4 | wave macro loop
|
||||||
|
4 | pitch macro loop (>=17)
|
||||||
|
4 | extra 1 macro loop (>=17)
|
||||||
|
4 | extra 2 macro loop (>=17)
|
||||||
|
4 | extra 3 macro loop (>=17)
|
||||||
|
1 | arp macro mode (<112) or reserved
|
||||||
|
| - treat this value in a special way.
|
||||||
|
| - before version 112, this byte indicates whether the arp macro mode is fixed or not.
|
||||||
|
| - from that version onwards, the fixed mode is part of the macro values.
|
||||||
|
| - to convert a <112 macro mode to a modern one, do the following:
|
||||||
|
| - is the macro mode set to fixed?
|
||||||
|
| - if yes, then:
|
||||||
|
| - set bit 30 of all arp macro values (this is the fixed mode bit)
|
||||||
|
| - does the macro loop?
|
||||||
|
| - if yes, then do nothing else
|
||||||
|
| - if no, then add one to the macro length, and set the last macro value to 0
|
||||||
|
| - if no, then do nothing
|
||||||
|
1 | reserved (>=17) or volume macro height (>=15) or reserved
|
||||||
|
1 | reserved (>=17) or duty macro height (>=15) or reserved
|
||||||
|
1 | reserved (>=17) or wave macro height (>=15) or reserved
|
||||||
|
4?? | volume macro
|
||||||
|
| - before version 87, if this is the C64 relative cutoff macro, its values were stored offset by 18.
|
||||||
|
4?? | arp macro
|
||||||
|
| - before version 31, this macro's values were stored offset by 12.
|
||||||
|
| - from version 112 onward, bit 30 of a value indicates fixed mode.
|
||||||
|
4?? | duty macro
|
||||||
|
| - before version 87, if this is the C64 relative duty macro, its values were stored offset by 12.
|
||||||
|
4?? | wave macro
|
||||||
|
4?? | pitch macro (>=17)
|
||||||
|
4?? | extra 1 macro (>=17)
|
||||||
|
4?? | extra 2 macro (>=17)
|
||||||
|
4?? | extra 3 macro (>=17)
|
||||||
|
4 | alg macro length (>=29)
|
||||||
|
4 | fb macro length (>=29)
|
||||||
|
4 | fms macro length (>=29)
|
||||||
|
4 | ams macro length (>=29)
|
||||||
|
4 | alg macro loop (>=29)
|
||||||
|
4 | fb macro loop (>=29)
|
||||||
|
4 | fms macro loop (>=29)
|
||||||
|
4 | ams macro loop (>=29)
|
||||||
|
1 | volume macro open (>=29)
|
||||||
|
1 | arp macro open (>=29)
|
||||||
|
1 | duty macro open (>=29)
|
||||||
|
1 | wave macro open (>=29)
|
||||||
|
1 | pitch macro open (>=29)
|
||||||
|
1 | extra 1 macro open (>=29)
|
||||||
|
1 | extra 2 macro open (>=29)
|
||||||
|
1 | extra 3 macro open (>=29)
|
||||||
|
1 | alg macro open (>=29)
|
||||||
|
1 | fb macro open (>=29)
|
||||||
|
1 | fms macro open (>=29)
|
||||||
|
1 | ams macro open (>=29)
|
||||||
|
4?? | alg macro (>=29)
|
||||||
|
4?? | fb macro (>=29)
|
||||||
|
4?? | fms macro (>=29)
|
||||||
|
4?? | ams macro (>=29)
|
||||||
|
--- | **operator macro headers** × 4 (>=29)
|
||||||
|
4 | AM macro length
|
||||||
|
4 | AR macro length
|
||||||
|
4 | DR macro length
|
||||||
|
4 | MULT macro length
|
||||||
|
4 | RR macro length
|
||||||
|
4 | SL macro length
|
||||||
|
4 | TL macro length
|
||||||
|
4 | DT2 macro length
|
||||||
|
4 | RS macro length
|
||||||
|
4 | DT macro length
|
||||||
|
4 | D2R macro length
|
||||||
|
4 | SSG-EG macro length
|
||||||
|
4 | AM macro loop
|
||||||
|
4 | AR macro loop
|
||||||
|
4 | DR macro loop
|
||||||
|
4 | MULT macro loop
|
||||||
|
4 | RR macro loop
|
||||||
|
4 | SL macro loop
|
||||||
|
4 | TL macro loop
|
||||||
|
4 | DT2 macro loop
|
||||||
|
4 | RS macro loop
|
||||||
|
4 | DT macro loop
|
||||||
|
4 | D2R macro loop
|
||||||
|
4 | SSG-EG macro loop
|
||||||
|
1 | AM macro open
|
||||||
|
1 | AR macro open
|
||||||
|
1 | DR macro open
|
||||||
|
1 | MULT macro open
|
||||||
|
1 | RR macro open
|
||||||
|
1 | SL macro open
|
||||||
|
1 | TL macro open
|
||||||
|
1 | DT2 macro open
|
||||||
|
1 | RS macro open
|
||||||
|
1 | DT macro open
|
||||||
|
1 | D2R macro open
|
||||||
|
1 | SSG-EG macro open
|
||||||
|
--- | **operator macros** × 4 (>=29)
|
||||||
|
1?? | AM macro
|
||||||
|
1?? | AR macro
|
||||||
|
1?? | DR macro
|
||||||
|
1?? | MULT macro
|
||||||
|
1?? | RR macro
|
||||||
|
1?? | SL macro
|
||||||
|
1?? | TL macro
|
||||||
|
1?? | DT2 macro
|
||||||
|
1?? | RS macro
|
||||||
|
1?? | DT macro
|
||||||
|
1?? | D2R macro
|
||||||
|
1?? | SSG-EG macro
|
||||||
|
--- | **release points** (>=44)
|
||||||
|
4 | volume macro release
|
||||||
|
4 | arp macro release
|
||||||
|
4 | duty macro release
|
||||||
|
4 | wave macro release
|
||||||
|
4 | pitch macro release
|
||||||
|
4 | extra 1 macro release
|
||||||
|
4 | extra 2 macro release
|
||||||
|
4 | extra 3 macro release
|
||||||
|
4 | alg macro release
|
||||||
|
4 | fb macro release
|
||||||
|
4 | fms macro release
|
||||||
|
4 | ams macro release
|
||||||
|
--- | **operator release points** × 4 (>=44)
|
||||||
|
4 | AM macro release
|
||||||
|
4 | AR macro release
|
||||||
|
4 | DR macro release
|
||||||
|
4 | MULT macro release
|
||||||
|
4 | RR macro release
|
||||||
|
4 | SL macro release
|
||||||
|
4 | TL macro release
|
||||||
|
4 | DT2 macro release
|
||||||
|
4 | RS macro release
|
||||||
|
4 | DT macro release
|
||||||
|
4 | D2R macro release
|
||||||
|
4 | SSG-EG macro release
|
||||||
|
--- | **extended op macro headers** × 4 (>=61)
|
||||||
|
4 | DAM macro length
|
||||||
|
4 | DVB macro length
|
||||||
|
4 | EGT macro length
|
||||||
|
4 | KSL macro length
|
||||||
|
4 | SUS macro length
|
||||||
|
4 | VIB macro length
|
||||||
|
4 | WS macro length
|
||||||
|
4 | KSR macro length
|
||||||
|
4 | DAM macro loop
|
||||||
|
4 | DVB macro loop
|
||||||
|
4 | EGT macro loop
|
||||||
|
4 | KSL macro loop
|
||||||
|
4 | SUS macro loop
|
||||||
|
4 | VIB macro loop
|
||||||
|
4 | WS macro loop
|
||||||
|
4 | KSR macro loop
|
||||||
|
4 | DAM macro release
|
||||||
|
4 | DVB macro release
|
||||||
|
4 | EGT macro release
|
||||||
|
4 | KSL macro release
|
||||||
|
4 | SUS macro release
|
||||||
|
4 | VIB macro release
|
||||||
|
4 | WS macro release
|
||||||
|
4 | KSR macro release
|
||||||
|
1 | DAM macro open
|
||||||
|
1 | DVB macro open
|
||||||
|
1 | EGT macro open
|
||||||
|
1 | KSL macro open
|
||||||
|
1 | SUS macro open
|
||||||
|
1 | VIB macro open
|
||||||
|
1 | WS macro open
|
||||||
|
1 | KSR macro open
|
||||||
|
--- | **extended op macros** × 4 (>=61)
|
||||||
|
1?? | DAM macro
|
||||||
|
1?? | DVB macro
|
||||||
|
1?? | EGT macro
|
||||||
|
1?? | KSL macro
|
||||||
|
1?? | SUS macro
|
||||||
|
1?? | VIB macro
|
||||||
|
1?? | WS macro
|
||||||
|
1?? | KSR macro
|
||||||
|
--- | **OPL drums mode data** (>=63)
|
||||||
|
1 | fixed frequency mode
|
||||||
|
1 | reserved
|
||||||
|
2 | kick frequency
|
||||||
|
2 | snare/hi-hat frequency
|
||||||
|
2 | tom/top frequency
|
||||||
|
--- | **Sample instrument extra data** (>=67)
|
||||||
|
1 | use note map
|
||||||
|
| - only read the following two data structures if this is true!
|
||||||
|
4?? | note frequency × 120
|
||||||
|
| - 480 bytes
|
||||||
|
2?? | note sample × 120
|
||||||
|
| - 240 bytes
|
||||||
|
--- | **Namco 163 data** (>=73)
|
||||||
|
4 | initial waveform
|
||||||
|
1 | wave position
|
||||||
|
1 | wave length
|
||||||
|
1 | wave mode:
|
||||||
|
| - bit 1: update on change
|
||||||
|
| - bit 0: load on playback
|
||||||
|
1 | reserved
|
||||||
|
--- | **even more macros** (>=76)
|
||||||
|
4 | left panning macro length
|
||||||
|
4 | right panning macro length
|
||||||
|
4 | phase reset macro length
|
||||||
|
4 | extra 4 macro length
|
||||||
|
4 | extra 5 macro length
|
||||||
|
4 | extra 6 macro length
|
||||||
|
4 | extra 7 macro length
|
||||||
|
4 | extra 8 macro length
|
||||||
|
4 | left panning macro loop
|
||||||
|
4 | right panning macro loop
|
||||||
|
4 | phase reset macro loop
|
||||||
|
4 | extra 4 macro loop
|
||||||
|
4 | extra 5 macro loop
|
||||||
|
4 | extra 6 macro loop
|
||||||
|
4 | extra 7 macro loop
|
||||||
|
4 | extra 8 macro loop
|
||||||
|
4 | left panning macro release
|
||||||
|
4 | right panning macro release
|
||||||
|
4 | phase reset macro release
|
||||||
|
4 | extra 4 macro release
|
||||||
|
4 | extra 5 macro release
|
||||||
|
4 | extra 6 macro release
|
||||||
|
4 | extra 7 macro release
|
||||||
|
4 | extra 8 macro release
|
||||||
|
1 | left panning macro open
|
||||||
|
1 | right panning macro open
|
||||||
|
1 | phase reset macro open
|
||||||
|
1 | extra 4 macro open
|
||||||
|
1 | extra 5 macro open
|
||||||
|
1 | extra 6 macro open
|
||||||
|
1 | extra 7 macro open
|
||||||
|
1 | extra 8 macro open
|
||||||
|
--- | **even more macro data** (>=76)
|
||||||
|
4?? | left panning macro
|
||||||
|
4?? | right panning macro
|
||||||
|
4?? | phase reset macro
|
||||||
|
4?? | extra 4 macro
|
||||||
|
4?? | extra 5 macro
|
||||||
|
4?? | extra 6 macro
|
||||||
|
4?? | extra 7 macro
|
||||||
|
4?? | extra 8 macro
|
||||||
|
--- | **FDS instrument data** (>=76)
|
||||||
|
4 | modulation speed
|
||||||
|
4 | modulation depth
|
||||||
|
1 | init modulation table with first wave
|
||||||
|
3 | reserved
|
||||||
|
32 | modulation table
|
||||||
|
--- | **OPZ instrument extra data** (>=77)
|
||||||
|
1 | fms2
|
||||||
|
1 | ams2
|
||||||
|
--- | **wavetable synth data** (>=79)
|
||||||
|
4 | first wave
|
||||||
|
4 | second wave
|
||||||
|
1 | rate divider
|
||||||
|
1 | effect
|
||||||
|
| - bit 7: single or dual effect
|
||||||
|
1 | enabled
|
||||||
|
1 | global
|
||||||
|
1 | speed (+1)
|
||||||
|
1 | parameter 1
|
||||||
|
1 | parameter 2
|
||||||
|
1 | parameter 3
|
||||||
|
1 | parameter 4
|
||||||
|
--- | **additional macro mode flags** (>=84)
|
||||||
|
1 | volume macro mode
|
||||||
|
1 | duty macro mode
|
||||||
|
1 | wave macro mode
|
||||||
|
1 | pitch macro mode
|
||||||
|
1 | extra 1 macro mode
|
||||||
|
1 | extra 2 macro mode
|
||||||
|
1 | extra 3 macro mode
|
||||||
|
1 | alg macro mode
|
||||||
|
1 | fb macro mode
|
||||||
|
1 | fms macro mode
|
||||||
|
1 | ams macro mode
|
||||||
|
1 | left panning macro mode
|
||||||
|
1 | right panning macro mode
|
||||||
|
1 | phase reset macro mode
|
||||||
|
1 | extra 4 macro mode
|
||||||
|
1 | extra 5 macro mode
|
||||||
|
1 | extra 6 macro mode
|
||||||
|
1 | extra 7 macro mode
|
||||||
|
1 | extra 8 macro mode
|
||||||
|
--- | **extra C64 data** (>=89)
|
||||||
|
1 | don't test/gate before new note
|
||||||
|
--- | **MultiPCM data** (>=93)
|
||||||
|
1 | attack rate
|
||||||
|
1 | decay 1 rate
|
||||||
|
1 | decay level
|
||||||
|
1 | decay 2 rate
|
||||||
|
1 | release rate
|
||||||
|
1 | rate correction
|
||||||
|
1 | lfo rate
|
||||||
|
1 | vib depth
|
||||||
|
1 | am depth
|
||||||
|
23 | reserved
|
||||||
|
--- | **Sound Unit data** (>=104)
|
||||||
|
1 | use sample
|
||||||
|
1 | switch roles of phase reset timer and frequency
|
||||||
|
--- | **Game Boy envelope sequence** (>=105)
|
||||||
|
1 | length
|
||||||
|
??? | hardware sequence data
|
||||||
|
| size is length*3:
|
||||||
|
| 1 byte: command
|
||||||
|
| - 0: set envelope
|
||||||
|
| - 1: set sweep
|
||||||
|
| - 2: wait
|
||||||
|
| - 3: wait for release
|
||||||
|
| - 4: loop
|
||||||
|
| - 5: loop until release
|
||||||
|
| 2 bytes: data
|
||||||
|
| - for set envelope:
|
||||||
|
| - 1 byte: parameter
|
||||||
|
| - bit 4-7: volume
|
||||||
|
| - bit 3: direction
|
||||||
|
| - bit 0-2: length
|
||||||
|
| - 1 byte: sound length
|
||||||
|
| - for set sweep:
|
||||||
|
| - 1 byte: parameter
|
||||||
|
| - bit 4-6: length
|
||||||
|
| - bit 3: direction
|
||||||
|
| - bit 0-2: shift
|
||||||
|
| - 1 byte: nothing
|
||||||
|
| - for wait:
|
||||||
|
| - 1 byte: length (in ticks)
|
||||||
|
| - 1 byte: nothing
|
||||||
|
| - for wait for release:
|
||||||
|
| - 2 bytes: nothing
|
||||||
|
| - for loop/loop until release:
|
||||||
|
| - 2 bytes: position
|
||||||
|
--- | **Game Boy extra flags** (>=106)
|
||||||
|
1 | use software envelope
|
||||||
|
1 | always init hard env on new note
|
||||||
|
--- | **ES5506 data** (>=107)
|
||||||
|
1 | filter mode
|
||||||
|
| - 0: HPK2_HPK2
|
||||||
|
| - 1: HPK2_LPK1
|
||||||
|
| - 2: LPK2_LPK2
|
||||||
|
| - 3: LPK2_LPK1
|
||||||
|
2 | K1
|
||||||
|
2 | K2
|
||||||
|
2 | envelope count
|
||||||
|
1 | left volume ramp
|
||||||
|
1 | right volume ramp
|
||||||
|
1 | K1 ramp
|
||||||
|
1 | K2 ramp
|
||||||
|
1 | K1 slow
|
||||||
|
1 | K2 slow
|
||||||
|
--- | **SNES data** (>=109)
|
||||||
|
1 | use envelope
|
||||||
|
1 | gain mode
|
||||||
|
1 | gain
|
||||||
|
1 | attack
|
||||||
|
1 | decay
|
||||||
|
1 | sustain
|
||||||
|
| - bit 3: sustain mode (>=118)
|
||||||
|
1 | release
|
||||||
|
--- | **macro speeds/delays** (>=111)
|
||||||
|
1 | volume macro speed
|
||||||
|
1 | arp macro speed
|
||||||
|
1 | duty macro speed
|
||||||
|
1 | wave macro speed
|
||||||
|
1 | pitch macro speed
|
||||||
|
1 | extra 1 macro speed
|
||||||
|
1 | extra 2 macro speed
|
||||||
|
1 | extra 3 macro speed
|
||||||
|
1 | alg macro speed
|
||||||
|
1 | fb macro speed
|
||||||
|
1 | fms macro speed
|
||||||
|
1 | ams macro speed
|
||||||
|
1 | left panning macro speed
|
||||||
|
1 | right panning macro speed
|
||||||
|
1 | phase reset macro speed
|
||||||
|
1 | extra 4 macro speed
|
||||||
|
1 | extra 5 macro speed
|
||||||
|
1 | extra 6 macro speed
|
||||||
|
1 | extra 7 macro speed
|
||||||
|
1 | extra 8 macro speed
|
||||||
|
1 | volume macro delay
|
||||||
|
1 | arp macro delay
|
||||||
|
1 | duty macro delay
|
||||||
|
1 | wave macro delay
|
||||||
|
1 | pitch macro delay
|
||||||
|
1 | extra 1 macro delay
|
||||||
|
1 | extra 2 macro delay
|
||||||
|
1 | extra 3 macro delay
|
||||||
|
1 | alg macro delay
|
||||||
|
1 | fb macro delay
|
||||||
|
1 | fms macro delay
|
||||||
|
1 | ams macro delay
|
||||||
|
1 | left panning macro delay
|
||||||
|
1 | right panning macro delay
|
||||||
|
1 | phase reset macro delay
|
||||||
|
1 | extra 4 macro delay
|
||||||
|
1 | extra 5 macro delay
|
||||||
|
1 | extra 6 macro delay
|
||||||
|
1 | extra 7 macro delay
|
||||||
|
1 | extra 8 macro delay
|
||||||
|
--- | **operator macro speeds/delay** × 4 (>=111)
|
||||||
|
1 | AM macro speed
|
||||||
|
1 | AR macro speed
|
||||||
|
1 | DR macro speed
|
||||||
|
1 | MULT macro speed
|
||||||
|
1 | RR macro speed
|
||||||
|
1 | SL macro speed
|
||||||
|
1 | TL macro speed
|
||||||
|
1 | DT2 macro speed
|
||||||
|
1 | RS macro speed
|
||||||
|
1 | DT macro speed
|
||||||
|
1 | D2R macro speed
|
||||||
|
1 | SSG-EG macro speed
|
||||||
|
1 | DAM macro speed
|
||||||
|
1 | DVB macro speed
|
||||||
|
1 | EGT macro speed
|
||||||
|
1 | KSL macro speed
|
||||||
|
1 | SUS macro speed
|
||||||
|
1 | VIB macro speed
|
||||||
|
1 | WS macro speed
|
||||||
|
1 | KSR macro speed
|
||||||
|
1 | AM macro delay
|
||||||
|
1 | AR macro delay
|
||||||
|
1 | DR macro delay
|
||||||
|
1 | MULT macro delay
|
||||||
|
1 | RR macro delay
|
||||||
|
1 | SL macro delay
|
||||||
|
1 | TL macro delay
|
||||||
|
1 | DT2 macro delay
|
||||||
|
1 | RS macro delay
|
||||||
|
1 | DT macro delay
|
||||||
|
1 | D2R macro delay
|
||||||
|
1 | SSG-EG macro delay
|
||||||
|
1 | DAM macro delay
|
||||||
|
1 | DVB macro delay
|
||||||
|
1 | EGT macro delay
|
||||||
|
1 | KSL macro delay
|
||||||
|
1 | SUS macro delay
|
||||||
|
1 | VIB macro delay
|
||||||
|
1 | WS macro delay
|
||||||
|
1 | KSR macro delay
|
||||||
|
```
|
||||||
|
|
||||||
|
## interpreting macro mode values
|
||||||
|
|
||||||
|
- sequence (normal): I think this is obvious...
|
||||||
|
- ADSR:
|
||||||
|
- `val[0]`: bottom
|
||||||
|
- `val[1]`: top
|
||||||
|
- `val[2]`: attack
|
||||||
|
- `val[3]`: hold time
|
||||||
|
- `val[4]`: decay
|
||||||
|
- `val[5]`: sustain level
|
||||||
|
- `val[6]`: sustain hold time
|
||||||
|
- `val[7]`: decay 2
|
||||||
|
- `val[8]`: release
|
||||||
|
- LFO:
|
||||||
|
- `val[11]`: speed
|
||||||
|
- `val[12]`: waveform
|
||||||
|
- 0: triangle
|
||||||
|
- 1: saw
|
||||||
|
- 2: pulse
|
||||||
|
- `val[13]`: phase
|
||||||
|
- `val[14]`: loop
|
||||||
|
- `val[15]`: global (not sure how will I implement this)
|
||||||
|
|
|
@ -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</string>
|
<string>0.6.1</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</string>
|
<string>0.6.1</string>
|
||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>????</string>
|
<string>????</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>0.6</string>
|
<string>0.6.1</string>
|
||||||
<key>NSHumanReadableCopyright</key>
|
<key>NSHumanReadableCopyright</key>
|
||||||
<string></string>
|
<string></string>
|
||||||
<key>NSHighResolutionCapable</key>
|
<key>NSHighResolutionCapable</key>
|
||||||
|
|
|
@ -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</i>
|
<i>for version 0.6.1</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 of Furnace.<br/>it may not necessarily apply to previous or future versions.</p>
|
<p>this manual is written for version 0.6.1 of Furnace.<br/>it may not necessarily apply to previous or future versions.</p>
|
||||||
</section>
|
</section>
|
||||||
<section id="index">
|
<section id="index">
|
||||||
%s
|
%s
|
||||||
|
|
|
@ -4,6 +4,10 @@
|
||||||
|
|
||||||
<name>Furnace</name>
|
<name>Furnace</name>
|
||||||
<summary>Open-source chiptune tracker</summary>
|
<summary>Open-source chiptune tracker</summary>
|
||||||
|
<developer id="tildearrow.org">
|
||||||
|
<name>tildearrow and contributors</name>
|
||||||
|
</developer>
|
||||||
|
<developer_name>tildearrow and contributors</developer_name>
|
||||||
<url type="homepage">https://github.com/tildearrow/furnace</url>
|
<url type="homepage">https://github.com/tildearrow/furnace</url>
|
||||||
|
|
||||||
<metadata_license>CC0-1.0</metadata_license>
|
<metadata_license>CC0-1.0</metadata_license>
|
||||||
|
@ -32,7 +36,8 @@
|
||||||
<launchable type="desktop-id">furnace.desktop</launchable>
|
<launchable type="desktop-id">furnace.desktop</launchable>
|
||||||
<screenshots>
|
<screenshots>
|
||||||
<screenshot type="default">
|
<screenshot type="default">
|
||||||
<image>https://tildearrow.org/storage/images/furnace.png</image>
|
<caption>Furnace during playback</caption>
|
||||||
|
<image>https://raw.githubusercontent.com/tildearrow/furnace/94cce861800c0473bdddb8270e462ebcdd18202a/papers/screenshot3.png</image>
|
||||||
</screenshot>
|
</screenshot>
|
||||||
</screenshots>
|
</screenshots>
|
||||||
|
|
||||||
|
|
479
res/icons.sfd
|
@ -21,7 +21,7 @@ OS2Version: 0
|
||||||
OS2_WeightWidthSlopeOnly: 0
|
OS2_WeightWidthSlopeOnly: 0
|
||||||
OS2_UseTypoMetrics: 0
|
OS2_UseTypoMetrics: 0
|
||||||
CreationTime: 1691897631
|
CreationTime: 1691897631
|
||||||
ModificationTime: 1701817435
|
ModificationTime: 1706927377
|
||||||
PfmFamily: 81
|
PfmFamily: 81
|
||||||
TTFWeight: 400
|
TTFWeight: 400
|
||||||
TTFWidth: 5
|
TTFWidth: 5
|
||||||
|
@ -47,13 +47,13 @@ LangName: 1033
|
||||||
Encoding: UnicodeBmp
|
Encoding: UnicodeBmp
|
||||||
UnicodeInterp: none
|
UnicodeInterp: none
|
||||||
NameList: AGL For New Fonts
|
NameList: AGL For New Fonts
|
||||||
DisplaySize: -96
|
DisplaySize: -24
|
||||||
AntiAlias: 1
|
AntiAlias: 1
|
||||||
FitToEm: 0
|
FitToEm: 0
|
||||||
WinInfo: 57672 8 5
|
WinInfo: 57540 21 12
|
||||||
BeginPrivate: 0
|
BeginPrivate: 0
|
||||||
EndPrivate
|
EndPrivate
|
||||||
BeginChars: 65536 96
|
BeginChars: 65536 98
|
||||||
|
|
||||||
StartChar: space
|
StartChar: space
|
||||||
Encoding: 32 32 0
|
Encoding: 32 32 0
|
||||||
|
@ -2270,15 +2270,15 @@ SplineSet
|
||||||
1653.60449219 798.544921875 1681.75488281 781.904296875 1709.90625 765.263671875 c 1
|
1653.60449219 798.544921875 1681.75488281 781.904296875 1709.90625 765.263671875 c 1
|
||||||
1688.8125 716.044921875 1660.609375 678.232421875 1625.453125 651.982421875 c 0
|
1688.8125 716.044921875 1660.609375 678.232421875 1625.453125 651.982421875 c 0
|
||||||
1590.21875 625.732421875 1544.125 612.685546875 1487.171875 612.685546875 c 0xcbcd
|
1590.21875 625.732421875 1544.125 612.685546875 1487.171875 612.685546875 c 0xcbcd
|
||||||
1289.23339844 435.383789062 m 1
|
1289.23339844 435.383789062 m 5
|
||||||
1289.23339844 -25.1181640625 l 1
|
1289.23339844 -25.1181640625 l 5
|
||||||
1585.29882812 247.456054688 l 1
|
1585.29882812 247.456054688 l 5
|
||||||
1585.29882812 117.280273438 l 1
|
1585.29882812 117.280273438 l 5
|
||||||
1187.45410156 -248.998046875 l 1xd3ce
|
1187.45410156 -248.998046875 l 5xd3ce
|
||||||
1187.45410156 211.504882812 l 1
|
1187.45410156 211.504882812 l 5
|
||||||
891.388671875 -61.0693359375 l 1
|
891.388671875 -61.0693359375 l 5
|
||||||
891.388671875 69.1064453125 l 1
|
891.388671875 69.1064453125 l 5
|
||||||
1289.23339844 435.383789062 l 1
|
1289.23339844 435.383789062 l 5
|
||||||
EndSplineSet
|
EndSplineSet
|
||||||
EndChar
|
EndChar
|
||||||
|
|
||||||
|
@ -6736,54 +6736,8 @@ EndChar
|
||||||
StartChar: uniE159
|
StartChar: uniE159
|
||||||
Encoding: 57689 57689 95
|
Encoding: 57689 57689 95
|
||||||
Width: 1792
|
Width: 1792
|
||||||
Flags: HWO
|
Flags: HW
|
||||||
LayerCount: 2
|
LayerCount: 2
|
||||||
UndoRedoHistory
|
|
||||||
Layer: 0
|
|
||||||
Undoes
|
|
||||||
UndoOperation
|
|
||||||
Index: 0
|
|
||||||
Type: 1
|
|
||||||
WasModified: 0
|
|
||||||
WasOrder2: 0
|
|
||||||
Layer: 1
|
|
||||||
Width: 1792
|
|
||||||
VWidth: 1792
|
|
||||||
LBearingChange: 0
|
|
||||||
UnicodeEnc: 0
|
|
||||||
InstructionsLength: 0
|
|
||||||
SplineSet
|
|
||||||
1632 70 m 1
|
|
||||||
1632 -50 l 1025
|
|
||||||
160 1210 m 1
|
|
||||||
160 1330 l 1025
|
|
||||||
EndSplineSet
|
|
||||||
EndUndoOperation
|
|
||||||
UndoOperation
|
|
||||||
Index: 1
|
|
||||||
Type: 1
|
|
||||||
WasModified: 0
|
|
||||||
WasOrder2: 0
|
|
||||||
Layer: 2
|
|
||||||
Width: 1792
|
|
||||||
VWidth: 1792
|
|
||||||
LBearingChange: 0
|
|
||||||
UnicodeEnc: 0
|
|
||||||
InstructionsLength: 0
|
|
||||||
SplineSet
|
|
||||||
160 1270 m 25
|
|
||||||
160 1270 560 1270 896 640 c 0
|
|
||||||
1232 10 1632 10 1632 10 c 1025
|
|
||||||
1632 70 m 5
|
|
||||||
1632 -50 l 1029
|
|
||||||
160 1210 m 5
|
|
||||||
160 1330 l 1029
|
|
||||||
EndSplineSet
|
|
||||||
EndUndoOperation
|
|
||||||
EndUndoes
|
|
||||||
Redoes
|
|
||||||
EndRedoes
|
|
||||||
EndUndoRedoHistory
|
|
||||||
Back
|
Back
|
||||||
SplineSet
|
SplineSet
|
||||||
160 1270 m 25
|
160 1270 m 25
|
||||||
|
@ -6794,314 +6748,6 @@ SplineSet
|
||||||
160 1210 m 1
|
160 1210 m 1
|
||||||
160 1330 l 1025
|
160 1330 l 1025
|
||||||
EndSplineSet
|
EndSplineSet
|
||||||
UndoRedoHistory
|
|
||||||
Layer: 1
|
|
||||||
Undoes
|
|
||||||
UndoOperation
|
|
||||||
Index: 0
|
|
||||||
Type: 1
|
|
||||||
WasModified: 1
|
|
||||||
WasOrder2: 0
|
|
||||||
Layer: 2
|
|
||||||
Width: 1792
|
|
||||||
VWidth: 1792
|
|
||||||
LBearingChange: 0
|
|
||||||
UnicodeEnc: 0
|
|
||||||
InstructionsLength: 0
|
|
||||||
SplineSet
|
|
||||||
1632 1210.01171875 m 1
|
|
||||||
1632 1329.98828125 l 1
|
|
||||||
1619.75878906 1329.98828125 1193.45019531 1325.24316406 843.048828125 668.2421875 c 0
|
|
||||||
755.229492188 503.581054688 663.75 384.705078125 577.82421875 298.780273438 c 0
|
|
||||||
473.91796875 194.873046875 377.610351562 138.502929688 303.73046875 107.581054688 c 0
|
|
||||||
262.674804688 90.396484375 228.48828125 81.078125 203.702148438 76.0087890625 c 0
|
|
||||||
176.166992188 70.3779296875 160.23046875 70 159.536132812 69.986328125 c 1
|
|
||||||
159.698242188 69.9873046875 160 69.98828125 160 69.98828125 c 1
|
|
||||||
160 -49.98828125 l 1
|
|
||||||
172.241210938 -49.98828125 598.549804688 -45.2431640625 948.951171875 611.7578125 c 0
|
|
||||||
1036.77050781 776.418945312 1128.25 895.294921875 1214.17578125 981.219726562 c 0
|
|
||||||
1318.08203125 1085.12695312 1414.38964844 1141.49707031 1488.26953125 1172.41894531 c 0
|
|
||||||
1529.32519531 1189.60351562 1563.51171875 1198.921875 1588.29785156 1203.99121094 c 0
|
|
||||||
1615.83300781 1209.62207031 1631.76953125 1210 1632.46386719 1210.01367188 c 1
|
|
||||||
1632.30175781 1210.01269531 1632 1210.01171875 1632 1210.01171875 c 1
|
|
||||||
159.999999952 1210.01176537 m 1
|
|
||||||
159.999999952 1329.98823463 l 1
|
|
||||||
170.809951102 1329.98823463 504.536374276 1326.28810718 823.734604363 872.948478072 c 1
|
|
||||||
800.889124326 837.280193024 778.251310121 799.419416229 755.928040313 759.232259114 c 1
|
|
||||||
695.916689064 850.735795855 635.614260663 923.430234862 577.824293264 981.220202232 c 0
|
|
||||||
473.917602143 1085.12689335 377.61065751 1141.49706263 303.730893464 1172.41936621 c 0
|
|
||||||
262.674555191 1189.60345677 228.488523437 1198.92230209 203.702403502 1203.99126863 c 0
|
|
||||||
176.167181121 1209.62244935 160.230079948 1210.00005891 159.536222574 1210.01396385 c 1
|
|
||||||
159.698263781 1210.01275358 159.999999952 1210.01176537 159.999999952 1210.01176537 c 1
|
|
||||||
1632 1090.03515625 m 5
|
|
||||||
1632 1449.96484375 l 5
|
|
||||||
1558.47725996 1449.96484375 1167.58409474 1409.79522486 823.734604363 872.948478072 c 5
|
|
||||||
865.988935134 812.936984165 907.988680731 745.046220598 948.951069976 668.241740764 c 4
|
|
||||||
977.706682766 614.324966782 1006.85482384 565.317167145 1036.07195969 520.767740886 c 5
|
|
||||||
1042.35821703 532.084488601 1048.61953126 543.58571637 1054.85351562 555.274414062 c 4
|
|
||||||
1093.06152344 626.915039062 1265.13574219 948.919921875 1534.69042969 1061.74121094 c 4
|
|
||||||
1536.87304688 1062.65429688 1591.23828125 1085.29492188 1632 1090.03515625 c 5
|
|
||||||
1036.07195969 520.767740886 m 1
|
|
||||||
1096.08331094 429.264204145 1156.38573934 356.569765138 1214.17570674 298.779797768 c 0
|
|
||||||
1318.08239786 194.873106647 1414.38934249 138.502937368 1488.26910654 107.580633787 c 0
|
|
||||||
1529.32544481 90.3965432265 1563.51147656 81.0776979108 1588.2975965 76.0087313726 c 0
|
|
||||||
1615.83281888 70.3775506458 1631.76992005 69.9999410877 1632.46377743 69.986036148 c 1
|
|
||||||
1632.30173622 69.9872464204 1632.00000005 69.9882346324 1632.00000005 69.9882346324 c 1
|
|
||||||
1632.00000005 -49.9882346324 l 1
|
|
||||||
1621.1900489 -49.9882346324 1287.46362572 -46.2881071791 968.265395637 407.051521928 c 1
|
|
||||||
991.110875674 442.719806976 1013.74868988 480.580583771 1036.07195969 520.767740886 c 1
|
|
||||||
968.265395637 407.051521928 m 5
|
|
||||||
926.011064866 467.063015835 884.011319269 534.953779402 843.048930024 611.758259236 c 4
|
|
||||||
814.293317234 665.675033218 785.145176159 714.682832855 755.928040313 759.232259114 c 5
|
|
||||||
749.641782968 747.9155114 743.380468741 736.41428363 737.146484375 724.725585938 c 4
|
|
||||||
698.938476562 653.084960938 526.864257812 331.080078125 257.309570312 218.258789062 c 4
|
|
||||||
255.126953125 217.345703125 200.76171875 194.705078125 160 189.96484375 c 5
|
|
||||||
160 -169.96484375 l 5
|
|
||||||
233.522740042 -169.96484375 624.415905262 -129.795224857 968.265395637 407.051521928 c 5
|
|
||||||
EndSplineSet
|
|
||||||
EndUndoOperation
|
|
||||||
UndoOperation
|
|
||||||
Index: 1
|
|
||||||
Type: 1
|
|
||||||
WasModified: 0
|
|
||||||
WasOrder2: 0
|
|
||||||
Layer: 2
|
|
||||||
Width: 1792
|
|
||||||
VWidth: 1792
|
|
||||||
LBearingChange: 0
|
|
||||||
UnicodeEnc: 0
|
|
||||||
InstructionsLength: 0
|
|
||||||
SplineSet
|
|
||||||
1632 1090.03515625 m 5
|
|
||||||
1632 1449.96484375 l 5
|
|
||||||
1552.21679688 1449.96484375 1098.71386719 1402.66308594 737.146484375 724.725585938 c 4
|
|
||||||
698.938476562 653.084960938 526.864257812 331.080078125 257.309570312 218.258789062 c 4
|
|
||||||
255.126953125 217.345703125 200.76171875 194.705078125 160 189.96484375 c 5
|
|
||||||
160 -169.96484375 l 5
|
|
||||||
239.783203125 -169.96484375 693.286132812 -122.663085938 1054.85351562 555.274414062 c 4
|
|
||||||
1093.06152344 626.915039062 1265.13574219 948.919921875 1534.69042969 1061.74121094 c 4
|
|
||||||
1536.87304688 1062.65429688 1591.23828125 1085.29492188 1632 1090.03515625 c 5
|
|
||||||
1632 1210.01171875 m 1
|
|
||||||
1632 1329.98828125 l 1
|
|
||||||
1619.75878906 1329.98828125 1193.45019531 1325.24316406 843.048828125 668.2421875 c 0
|
|
||||||
755.229492188 503.581054688 663.75 384.705078125 577.82421875 298.780273438 c 0
|
|
||||||
473.91796875 194.873046875 377.610351562 138.502929688 303.73046875 107.581054688 c 0
|
|
||||||
262.674804688 90.396484375 228.48828125 81.078125 203.702148438 76.0087890625 c 0
|
|
||||||
176.166992188 70.3779296875 160.23046875 70 159.536132812 69.986328125 c 1
|
|
||||||
159.698242188 69.9873046875 160 69.98828125 160 69.98828125 c 1
|
|
||||||
160 -49.98828125 l 1
|
|
||||||
172.241210938 -49.98828125 598.549804688 -45.2431640625 948.951171875 611.7578125 c 0
|
|
||||||
1036.77050781 776.418945312 1128.25 895.294921875 1214.17578125 981.219726562 c 0
|
|
||||||
1318.08203125 1085.12695312 1414.38964844 1141.49707031 1488.26953125 1172.41894531 c 0
|
|
||||||
1529.32519531 1189.60351562 1563.51171875 1198.921875 1588.29785156 1203.99121094 c 0
|
|
||||||
1615.83300781 1209.62207031 1631.76953125 1210 1632.46386719 1210.01367188 c 1
|
|
||||||
1632.30175781 1210.01269531 1632 1210.01171875 1632 1210.01171875 c 1
|
|
||||||
159.999999952 1210.01176537 m 5
|
|
||||||
159.999999952 1329.98823463 l 5
|
|
||||||
172.240934135 1329.98823462 598.550052583 1325.24364837 948.951069976 668.241740764 c 4
|
|
||||||
1036.77007573 503.581104976 1128.25010681 384.70539769 1214.17570674 298.779797768 c 4
|
|
||||||
1318.08239786 194.873106647 1414.38934249 138.502937368 1488.26910654 107.580633787 c 4
|
|
||||||
1529.32544481 90.3965432265 1563.51147656 81.0776979108 1588.2975965 76.0087313726 c 4
|
|
||||||
1615.83281888 70.3775506458 1631.76992005 69.9999410877 1632.46377743 69.986036148 c 5
|
|
||||||
1632.30173622 69.9872464204 1632.00000005 69.9882346324 1632.00000005 69.9882346324 c 5
|
|
||||||
1632.00000005 -49.9882346324 l 5
|
|
||||||
1619.75906587 -49.9882346228 1193.44994742 -45.2436483754 843.048930024 611.758259236 c 4
|
|
||||||
755.229924271 776.418895024 663.749893187 895.29460231 577.824293264 981.220202232 c 4
|
|
||||||
473.917602143 1085.12689335 377.61065751 1141.49706263 303.730893464 1172.41936621 c 4
|
|
||||||
262.674555191 1189.60345677 228.488523437 1198.92230209 203.702403502 1203.99126863 c 4
|
|
||||||
176.167181121 1209.62244935 160.230079948 1210.00005891 159.536222574 1210.01396385 c 5
|
|
||||||
159.698263781 1210.01275358 159.999999952 1210.01176537 159.999999952 1210.01176537 c 5
|
|
||||||
EndSplineSet
|
|
||||||
EndUndoOperation
|
|
||||||
UndoOperation
|
|
||||||
Index: 2
|
|
||||||
Type: 1
|
|
||||||
WasModified: 1
|
|
||||||
WasOrder2: 0
|
|
||||||
Layer: 2
|
|
||||||
Width: 1792
|
|
||||||
VWidth: 1792
|
|
||||||
LBearingChange: 0
|
|
||||||
UnicodeEnc: 0
|
|
||||||
InstructionsLength: 0
|
|
||||||
SplineSet
|
|
||||||
160 1270 m 29
|
|
||||||
160 1270 560 1270 896 640 c 4
|
|
||||||
1232 10 1632 10 1632 10 c 1029
|
|
||||||
1632 1210.01171875 m 1
|
|
||||||
1632 1329.98828125 l 1
|
|
||||||
1619.75878906 1329.98828125 1193.45019531 1325.24316406 843.048828125 668.2421875 c 0
|
|
||||||
755.229492188 503.581054688 663.75 384.705078125 577.82421875 298.780273438 c 0
|
|
||||||
473.91796875 194.873046875 377.610351562 138.502929688 303.73046875 107.581054688 c 0
|
|
||||||
262.674804688 90.396484375 228.48828125 81.078125 203.702148438 76.0087890625 c 0
|
|
||||||
176.166992188 70.3779296875 160.23046875 70 159.536132812 69.986328125 c 1
|
|
||||||
159.698242188 69.9873046875 160 69.98828125 160 69.98828125 c 1
|
|
||||||
160 -49.98828125 l 1
|
|
||||||
172.241210938 -49.98828125 598.549804688 -45.2431640625 948.951171875 611.7578125 c 0
|
|
||||||
1036.77050781 776.418945312 1128.25 895.294921875 1214.17578125 981.219726562 c 0
|
|
||||||
1318.08203125 1085.12695312 1414.38964844 1141.49707031 1488.26953125 1172.41894531 c 0
|
|
||||||
1529.32519531 1189.60351562 1563.51171875 1198.921875 1588.29785156 1203.99121094 c 0
|
|
||||||
1615.83300781 1209.62207031 1631.76953125 1210 1632.46386719 1210.01367188 c 1
|
|
||||||
1632.30175781 1210.01269531 1632 1210.01171875 1632 1210.01171875 c 1
|
|
||||||
1632 1090.03515625 m 1
|
|
||||||
1632 1449.96484375 l 1
|
|
||||||
1552.21679688 1449.96484375 1098.71386719 1402.66308594 737.146484375 724.725585938 c 0
|
|
||||||
698.938476562 653.084960938 526.864257812 331.080078125 257.309570312 218.258789062 c 0
|
|
||||||
255.126953125 217.345703125 200.76171875 194.705078125 160 189.96484375 c 1
|
|
||||||
160 -169.96484375 l 1
|
|
||||||
239.783203125 -169.96484375 693.286132812 -122.663085938 1054.85351562 555.274414062 c 0
|
|
||||||
1093.06152344 626.915039062 1265.13574219 948.919921875 1534.69042969 1061.74121094 c 0
|
|
||||||
1536.87304688 1062.65429688 1591.23828125 1085.29492188 1632 1090.03515625 c 1
|
|
||||||
EndSplineSet
|
|
||||||
EndUndoOperation
|
|
||||||
UndoOperation
|
|
||||||
Index: 3
|
|
||||||
Type: 3
|
|
||||||
WasModified: 1
|
|
||||||
WasOrder2: 0
|
|
||||||
Layer: 2
|
|
||||||
EndUndoOperation
|
|
||||||
UndoOperation
|
|
||||||
Index: 4
|
|
||||||
Type: 1
|
|
||||||
WasModified: 1
|
|
||||||
WasOrder2: 0
|
|
||||||
Layer: 2
|
|
||||||
Width: 1792
|
|
||||||
VWidth: 1792
|
|
||||||
LBearingChange: 0
|
|
||||||
UnicodeEnc: 0
|
|
||||||
InstructionsLength: 0
|
|
||||||
SplineSet
|
|
||||||
159.999999952 1210.01176537 m 5
|
|
||||||
159.999999952 1329.98823463 l 5
|
|
||||||
172.240934135 1329.98823462 598.550052583 1325.24364837 948.951069976 668.241740764 c 4
|
|
||||||
1036.77007573 503.581104976 1128.25010681 384.70539769 1214.17570674 298.779797768 c 4
|
|
||||||
1318.08239786 194.873106647 1414.38934249 138.502937368 1488.26910654 107.580633787 c 4
|
|
||||||
1529.32544481 90.3965432265 1563.51147656 81.0776979108 1588.2975965 76.0087313726 c 4
|
|
||||||
1615.83281888 70.3775506458 1631.76992005 69.9999410877 1632.46377743 69.986036148 c 5
|
|
||||||
1632.30173622 69.9872464204 1632.00000005 69.9882346324 1632.00000005 69.9882346324 c 5
|
|
||||||
1632.00000005 -49.9882346324 l 5
|
|
||||||
1619.75906587 -49.9882346228 1193.44994742 -45.2436483754 843.048930024 611.758259236 c 4
|
|
||||||
755.229924271 776.418895024 663.749893187 895.29460231 577.824293264 981.220202232 c 4
|
|
||||||
473.917602143 1085.12689335 377.61065751 1141.49706263 303.730893464 1172.41936621 c 4
|
|
||||||
262.674555191 1189.60345677 228.488523437 1198.92230209 203.702403502 1203.99126863 c 4
|
|
||||||
176.167181121 1209.62244935 160.230079948 1210.00005891 159.536222574 1210.01396385 c 5
|
|
||||||
159.698263781 1210.01275358 159.999999952 1210.01176537 159.999999952 1210.01176537 c 5
|
|
||||||
159.999999857 1090.0352961 m 5
|
|
||||||
159.999999857 1449.9647039 l 5
|
|
||||||
239.782893731 1449.96470383 693.286263441 1402.66324695 1054.85320993 724.725222292 c 4
|
|
||||||
1093.06152816 653.084625607 1265.13598183 331.080480771 1534.69080463 218.25857115 c 4
|
|
||||||
1536.87267214 217.345352617 1591.23876559 194.705394151 1632.00000014 189.964703897 c 5
|
|
||||||
1632.00000014 -169.964703897 l 5
|
|
||||||
1552.21710627 -169.964703835 1098.71373656 -122.663246954 737.146790073 555.274777708 c 4
|
|
||||||
698.938471842 626.915374393 526.864018169 948.919519229 257.309195374 1061.74142885 c 4
|
|
||||||
255.127327856 1062.65464738 200.761234414 1085.29460585 159.999999857 1090.0352961 c 5
|
|
||||||
EndSplineSet
|
|
||||||
EndUndoOperation
|
|
||||||
UndoOperation
|
|
||||||
Index: 5
|
|
||||||
Type: 3
|
|
||||||
WasModified: 1
|
|
||||||
WasOrder2: 0
|
|
||||||
Layer: 2
|
|
||||||
EndUndoOperation
|
|
||||||
UndoOperation
|
|
||||||
Index: 6
|
|
||||||
Type: 1
|
|
||||||
WasModified: 1
|
|
||||||
WasOrder2: 0
|
|
||||||
Layer: 2
|
|
||||||
Width: 1792
|
|
||||||
VWidth: 1792
|
|
||||||
LBearingChange: 0
|
|
||||||
UnicodeEnc: 0
|
|
||||||
InstructionsLength: 0
|
|
||||||
SplineSet
|
|
||||||
160 1270 m 29
|
|
||||||
160 1270 560 1270 896 640 c 4
|
|
||||||
1232 10 1632 10 1632 10 c 1029
|
|
||||||
159.999999952 1210.01176537 m 1
|
|
||||||
159.999999952 1329.98823463 l 1
|
|
||||||
172.240934135 1329.98823462 598.550052583 1325.24364837 948.951069976 668.241740764 c 0
|
|
||||||
1036.77007573 503.581104976 1128.25010681 384.70539769 1214.17570674 298.779797768 c 0
|
|
||||||
1318.08239786 194.873106647 1414.38934249 138.502937368 1488.26910654 107.580633787 c 0
|
|
||||||
1529.32544481 90.3965432265 1563.51147656 81.0776979108 1588.2975965 76.0087313726 c 0
|
|
||||||
1615.83281888 70.3775506458 1631.76992005 69.9999410877 1632.46377743 69.986036148 c 1
|
|
||||||
1632.30173622 69.9872464204 1632.00000005 69.9882346324 1632.00000005 69.9882346324 c 1
|
|
||||||
1632.00000005 -49.9882346324 l 1
|
|
||||||
1619.75906587 -49.9882346228 1193.44994742 -45.2436483754 843.048930024 611.758259236 c 0
|
|
||||||
755.229924271 776.418895024 663.749893187 895.29460231 577.824293264 981.220202232 c 0
|
|
||||||
473.917602143 1085.12689335 377.61065751 1141.49706263 303.730893464 1172.41936621 c 0
|
|
||||||
262.674555191 1189.60345677 228.488523437 1198.92230209 203.702403502 1203.99126863 c 0
|
|
||||||
176.167181121 1209.62244935 160.230079948 1210.00005891 159.536222574 1210.01396385 c 1
|
|
||||||
159.698263781 1210.01275358 159.999999952 1210.01176537 159.999999952 1210.01176537 c 1
|
|
||||||
EndSplineSet
|
|
||||||
EndUndoOperation
|
|
||||||
UndoOperation
|
|
||||||
Index: 7
|
|
||||||
Type: 3
|
|
||||||
WasModified: 1
|
|
||||||
WasOrder2: 0
|
|
||||||
Layer: 2
|
|
||||||
EndUndoOperation
|
|
||||||
UndoOperation
|
|
||||||
Index: 8
|
|
||||||
Type: 1
|
|
||||||
WasModified: 1
|
|
||||||
WasOrder2: 0
|
|
||||||
Layer: 2
|
|
||||||
Width: 1792
|
|
||||||
VWidth: 1792
|
|
||||||
LBearingChange: 0
|
|
||||||
UnicodeEnc: 0
|
|
||||||
InstructionsLength: 0
|
|
||||||
SplineSet
|
|
||||||
160 1270 m 29
|
|
||||||
160 1270 560 1270 896 640 c 4
|
|
||||||
1232 10 1632 10 1632 10 c 1029
|
|
||||||
EndSplineSet
|
|
||||||
EndUndoOperation
|
|
||||||
UndoOperation
|
|
||||||
Index: 9
|
|
||||||
Type: 3
|
|
||||||
WasModified: 1
|
|
||||||
WasOrder2: 0
|
|
||||||
Layer: 2
|
|
||||||
EndUndoOperation
|
|
||||||
UndoOperation
|
|
||||||
Index: 10
|
|
||||||
Type: 2
|
|
||||||
WasModified: 1
|
|
||||||
WasOrder2: 0
|
|
||||||
Layer: 2
|
|
||||||
Width: 1792
|
|
||||||
VWidth: 1792
|
|
||||||
LBearingChange: 0
|
|
||||||
UnicodeEnc: 0
|
|
||||||
InstructionsLength: 0
|
|
||||||
SplineSet
|
|
||||||
160 1270 m 29
|
|
||||||
160 1270 560 1270 896 640 c 4
|
|
||||||
1232 10 1632 10 1632 10 c 1029
|
|
||||||
EndSplineSet
|
|
||||||
EndUndoOperation
|
|
||||||
UndoOperation
|
|
||||||
Index: 11
|
|
||||||
Type: 1
|
|
||||||
WasModified: 1
|
|
||||||
WasOrder2: 0
|
|
||||||
Layer: 1
|
|
||||||
Width: 1792
|
|
||||||
VWidth: 1792
|
|
||||||
LBearingChange: 0
|
|
||||||
UnicodeEnc: 0
|
|
||||||
InstructionsLength: 0
|
|
||||||
EndUndoOperation
|
|
||||||
EndUndoes
|
|
||||||
Redoes
|
|
||||||
EndRedoes
|
|
||||||
EndUndoRedoHistory
|
|
||||||
Fore
|
Fore
|
||||||
SplineSet
|
SplineSet
|
||||||
1632 1210.01171875 m 1
|
1632 1210.01171875 m 1
|
||||||
|
@ -7139,5 +6785,102 @@ SplineSet
|
||||||
991.110875674 442.719806976 1013.74868988 480.580583771 1036.07195969 520.767740886 c 1
|
991.110875674 442.719806976 1013.74868988 480.580583771 1036.07195969 520.767740886 c 1
|
||||||
EndSplineSet
|
EndSplineSet
|
||||||
EndChar
|
EndChar
|
||||||
|
|
||||||
|
StartChar: uniE15A
|
||||||
|
Encoding: 57690 57690 96
|
||||||
|
Width: 1792
|
||||||
|
Flags: HW
|
||||||
|
LayerCount: 2
|
||||||
|
Fore
|
||||||
|
SplineSet
|
||||||
|
170.8046875 72.1796875 m 1
|
||||||
|
170.8046875 351.37890625 170.8046875 630.578125 170.8046875 909.77734375 c 1
|
||||||
|
290.791992188 909.77734375 410.778320312 909.77734375 530.765625 909.77734375 c 1
|
||||||
|
608.40234375 909.77734375 668.36328125 887.0234375 710.74609375 841.41796875 c 128
|
||||||
|
753.2265625 795.8125 774.41796875 734.58203125 774.41796875 657.82421875 c 256
|
||||||
|
774.41796875 580.96875 753.2265625 519.73828125 710.74609375 474.1328125 c 128
|
||||||
|
668.36328125 428.625 608.40234375 405.7734375 530.765625 405.7734375 c 1
|
||||||
|
455.9609375 405.7734375 381.15625 405.7734375 306.3515625 405.7734375 c 1
|
||||||
|
306.3515625 294.576171875 306.3515625 183.377929688 306.3515625 72.1796875 c 1
|
||||||
|
261.168945312 72.1796875 215.987304688 72.1796875 170.8046875 72.1796875 c 1
|
||||||
|
306.3515625 524.62109375 m 1
|
||||||
|
378.356445312 524.62109375 450.362304688 524.62109375 522.3671875 524.62109375 c 1
|
||||||
|
556.7421875 524.62109375 583.59765625 533.60546875 602.73828125 551.57421875 c 128
|
||||||
|
621.9765625 569.54296875 631.546875 595.421875 631.546875 629.015625 c 1
|
||||||
|
631.546875 648.189453125 631.546875 667.362304688 631.546875 686.53515625 c 1
|
||||||
|
631.546875 720.2265625 621.9765625 746.0078125 602.73828125 763.9765625 c 128
|
||||||
|
583.59765625 781.9453125 556.7421875 791.02734375 522.3671875 791.02734375 c 1
|
||||||
|
450.362304688 791.02734375 378.356445312 791.02734375 306.3515625 791.02734375 c 1
|
||||||
|
306.3515625 702.225585938 306.3515625 613.423828125 306.3515625 524.62109375 c 1
|
||||||
|
1196.390625 535.36328125 m 1
|
||||||
|
1165.59667969 594.576171875 1134.80175781 653.788085938 1104.0078125 713 c 1
|
||||||
|
1102.80371094 713 1101.59863281 713 1100.39453125 713 c 1
|
||||||
|
1100.39453125 499.393554688 1100.39453125 285.787109375 1100.39453125 72.1796875 c 1
|
||||||
|
1057.19824219 72.1796875 1014.00097656 72.1796875 970.8046875 72.1796875 c 1
|
||||||
|
970.8046875 351.37890625 970.8046875 630.578125 970.8046875 909.77734375 c 1
|
||||||
|
1021.1953125 909.77734375 1071.5859375 909.77734375 1121.9765625 909.77734375 c 1
|
||||||
|
1213.1875 755.3828125 1304.3984375 600.98828125 1395.609375 446.59375 c 1
|
||||||
|
1426.40332031 387.381835938 1457.19824219 328.169921875 1487.9921875 268.95703125 c 1
|
||||||
|
1489.19628906 268.95703125 1490.40136719 268.95703125 1491.60546875 268.95703125 c 1
|
||||||
|
1491.60546875 482.564453125 1491.60546875 696.170898438 1491.60546875 909.77734375 c 1
|
||||||
|
1534.80175781 909.77734375 1577.99902344 909.77734375 1621.1953125 909.77734375 c 1
|
||||||
|
1621.1953125 630.578125 1621.1953125 351.37890625 1621.1953125 72.1796875 c 1
|
||||||
|
1570.8046875 72.1796875 1520.4140625 72.1796875 1470.0234375 72.1796875 c 1
|
||||||
|
1378.8125 226.57421875 1287.6015625 380.96875 1196.390625 535.36328125 c 1
|
||||||
|
EndSplineSet
|
||||||
|
EndChar
|
||||||
|
|
||||||
|
StartChar: uniE15B
|
||||||
|
Encoding: 57691 57691 97
|
||||||
|
Width: 1792
|
||||||
|
Flags: HWO
|
||||||
|
LayerCount: 2
|
||||||
|
Fore
|
||||||
|
SplineSet
|
||||||
|
938.209960938 435.383789062 m 1
|
||||||
|
938.209960938 -25.1181640625 l 1
|
||||||
|
1234.27539062 247.456054688 l 1
|
||||||
|
1234.27539062 117.280273438 l 1
|
||||||
|
836.430664062 -248.998046875 l 1xd3ce
|
||||||
|
836.430664062 211.504882812 l 1
|
||||||
|
540.365234375 -61.0693359375 l 1
|
||||||
|
540.365234375 69.1064453125 l 1
|
||||||
|
938.209960938 435.383789062 l 1
|
||||||
|
315.962890625 621 m 1
|
||||||
|
315.962890625 844.359375 315.962890625 1067.71875 315.962890625 1291.078125 c 1
|
||||||
|
411.952148438 1291.078125 507.942382812 1291.078125 603.931640625 1291.078125 c 1
|
||||||
|
666.041015625 1291.078125 714.009765625 1272.875 747.916015625 1236.390625 c 128
|
||||||
|
781.900390625 1199.90625 798.853515625 1150.921875 798.853515625 1089.515625 c 256
|
||||||
|
798.853515625 1028.03125 781.900390625 979.046875 747.916015625 942.5625 c 128
|
||||||
|
714.009765625 906.15625 666.041015625 887.875 603.931640625 887.875 c 1
|
||||||
|
544.087890625 887.875 484.244140625 887.875 424.400390625 887.875 c 1
|
||||||
|
424.400390625 798.916992188 424.400390625 709.958984375 424.400390625 621 c 1
|
||||||
|
388.254882812 621 352.108398438 621 315.962890625 621 c 1
|
||||||
|
424.400390625 982.953125 m 1
|
||||||
|
482.004882812 982.953125 539.608398438 982.953125 597.212890625 982.953125 c 1
|
||||||
|
624.712890625 982.953125 646.197265625 990.140625 661.509765625 1004.515625 c 128
|
||||||
|
676.900390625 1018.890625 684.556640625 1039.59375 684.556640625 1066.46875 c 1
|
||||||
|
684.556640625 1081.80761719 684.556640625 1097.14648438 684.556640625 1112.484375 c 1
|
||||||
|
684.556640625 1139.4375 676.900390625 1160.0625 661.509765625 1174.4375 c 128
|
||||||
|
646.197265625 1188.8125 624.712890625 1196.078125 597.212890625 1196.078125 c 1
|
||||||
|
539.608398438 1196.078125 482.004882812 1196.078125 424.400390625 1196.078125 c 1
|
||||||
|
424.400390625 1125.03710938 424.400390625 1053.99511719 424.400390625 982.953125 c 1
|
||||||
|
1136.43164062 991.546875 m 1
|
||||||
|
1111.79589844 1038.91699219 1087.16113281 1086.28710938 1062.52539062 1133.65625 c 1
|
||||||
|
1061.56152344 1133.65625 1060.59863281 1133.65625 1059.63476562 1133.65625 c 1
|
||||||
|
1059.63476562 962.771484375 1059.63476562 791.885742188 1059.63476562 621 c 1
|
||||||
|
1025.07714844 621 990.520507812 621 955.962890625 621 c 1
|
||||||
|
955.962890625 844.359375 955.962890625 1067.71875 955.962890625 1291.078125 c 1
|
||||||
|
996.275390625 1291.078125 1036.58789062 1291.078125 1076.90039062 1291.078125 c 1
|
||||||
|
1149.86914062 1167.5625 1222.83789062 1044.046875 1295.80664062 920.53125 c 1
|
||||||
|
1320.44238281 873.162109375 1345.07714844 825.791992188 1369.71289062 778.421875 c 1
|
||||||
|
1370.67675781 778.421875 1371.63964844 778.421875 1372.60351562 778.421875 c 1
|
||||||
|
1372.60351562 949.307617188 1372.60351562 1120.19335938 1372.60351562 1291.078125 c 1
|
||||||
|
1407.16113281 1291.078125 1441.71777344 1291.078125 1476.27539062 1291.078125 c 1
|
||||||
|
1476.27539062 1067.71875 1476.27539062 844.359375 1476.27539062 621 c 1
|
||||||
|
1435.96289062 621 1395.65039062 621 1355.33789062 621 c 1
|
||||||
|
1282.36914062 744.515625 1209.40039062 868.03125 1136.43164062 991.546875 c 1
|
||||||
|
EndSplineSet
|
||||||
|
EndChar
|
||||||
EndChars
|
EndChars
|
||||||
EndSplineFont
|
EndSplineFont
|
||||||
|
|
BIN
res/icons.ttf
|
@ -16,9 +16,9 @@ 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
|
||||||
- Furnace on Revolt: https://rvlt.gg/GRPS6tmc
|
|
||||||
- Furnace on Discord: https://discord.gg/EfrwT2wq7z
|
- Furnace on Discord: https://discord.gg/EfrwT2wq7z
|
||||||
- online manual: https://tildearrow.org/furnace/doc/v0.6/
|
- Furnace on Revolt: https://rvlt.gg/GRPS6tmc
|
||||||
|
- online manual: https://tildearrow.org/furnace/doc/v0.6.1/
|
||||||
|
|
||||||
# notes
|
# notes
|
||||||
|
|
||||||
|
|
|
@ -26,9 +26,9 @@ 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
|
||||||
- Furnace on Revolt: https://rvlt.gg/GRPS6tmc
|
|
||||||
- Furnace on Discord: https://discord.gg/EfrwT2wq7z
|
- Furnace on Discord: https://discord.gg/EfrwT2wq7z
|
||||||
- online manual: https://tildearrow.org/furnace/doc/v0.6/
|
- Furnace on Revolt: https://rvlt.gg/GRPS6tmc
|
||||||
|
- online manual: https://tildearrow.org/furnace/doc/v0.6.1/
|
||||||
|
|
||||||
# notes
|
# notes
|
||||||
|
|
||||||
|
|