Merge branch 'master' into metal

This commit is contained in:
tildearrow 2024-04-11 13:27:39 -05:00
commit f51035e8a0
2980 changed files with 800668 additions and 175667 deletions

1
.gitattributes vendored Normal file
View file

@ -0,0 +1 @@
*.sfd text

View file

@ -1 +1,48 @@
<!-- NOTICE: if you are going to write a suggestion, see the Discussions section instead. any suggestions posted in Issues will be closed. -->
# EXTREMELY IMPORTANT NOTICE - PLEASE **READ**!!!!!!!
BY SUBMITTING AN ISSUE, YOU HEREBY AGREE TO COMPLY WITH THESE TERMS.
FAILURE TO DO SO MAY RESULT IN YOUR ISSUE BEING DECLARED VOID.
**ADDITIONALLY, FAILURE TO COMPLY WITH POINTS 1 AND 2 WILL RESULT IN THE INABILITY TO ISSUE FURTHER ISSUE REPORTS.**
1. this section is exclusively for ISSUES related to Furnace (bugs, major annoyances and others). ONLY THINGS THAT COUNT AS **ISSUES** (ad pedem litterae).
2. **THIS SECTION IS NOT FOR SUGGESTIONS, REQUESTS, QUESTIONS, SHOWCASE OR ANY OTHER DISCUSSIONS THAT DO NOT MEET THE CRITERIA AND DEFINITION OF AN __ISSUE__.**
- see the Discussions section if you wish to submit these.
3. check whether your issue has been reported already.
- go to the Issues section, and use the search bar that appears on top of the Issues list.
4. include the following information:
- version of Furnace (help > about)
- operating system (and version)
- whether you have downloaded Furnace, or built it from source.
5. provide these details if you believe the issue is operating system and/or computer-specific:
- CPU model
- Windows: go to Control Panel > System.
- macOS: go to the Apple menu and select About This Mac...
- Linux: use `lscpu` or `cat /proc/cpuinfo`.
- graphics card (and driver version)
- Windows: open `dxdiag` and observe the Render tab.
- macOS: go to the Apple menu and select About This Mac...
- this information is not always shown.
- this information is not necessary if you use an Apple silicon Mac.
- Linux: use `glxinfo | grep OpenGL`.
6. if your issue is an abnormal program termination (a "Crash"), you must provide additional details:
- the furnace_crash.txt file that is created by Furnace after a Crash. this file is located in the following paths:
- Windows: `C:\Users\<username>\furnace_crash.txt`
- Linux/other: `/tmp/furnace_crash.txt`
- on macOS this file is not generated. you may retrieve information about the Crash by clicking on "Report..." or "Show Details" in the "quit unexpectedly" dialog that appears following the Crash.
- make sure to remove any personal information for privacy reasons.
- be sure to select "Don't Send" afterwards.
- the furnace.log file located in:
- Windows: `C:\Users\<username>\AppData\Roaming\furnace\furnace.log`
- macOS: `~/Library/Application Support/furnace/furnace.log`
- Linux: `~/.config/furnace/furnace.log`
- make sure to remove any personal information for privacy reasons.
BY SUBMITTING AN ISSUE, YOU HEREBY AGREE TO COMPLY WITH THESE TERMS.
FAILURE TO DO SO MAY RESULT IN YOUR ISSUE BEING DECLARED VOID.
**ADDITIONALLY, FAILURE TO COMPLY WITH POINTS 1 AND 2 WILL RESULT IN THE INABILITY TO ISSUE FURTHER ISSUE REPORTS.**
***END OF NOTICE***
PLEASE REMOVE THIS NOTICE AFTER READING.
FAILURE TO REMOVE THIS NOTICE IS NEGLIGENCE.

View file

@ -1 +1,4 @@
<!-- NOTICE: if you are contributing a new system, please be sure to ask tildearrow first in order to get system IDs allocated! -->
<!--
NOTICE: if you are contributing a new system, please be sure to ask tildearrow first in order to get system IDs allocated!
Do NOT Force-Push after submitting Pull Request! If you do so, your pull request will be closed.
-->

View file

@ -33,7 +33,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v3.1.0
uses: actions/checkout@v4.1.1
with:
submodules: recursive
@ -106,7 +106,7 @@ jobs:
- name: Setup Toolchain [Windows MSVC]
if: ${{ matrix.config.compiler == 'msvc' }}
uses: vadz/gha-setup-vsdevenv@avoid-deprecation-warnings
uses: lunathir/gha-setup-vsdevenv@avoid-deprecation-warnings
with:
arch: ${{ steps.windows-identify.outputs.vswhere-target }}
@ -150,57 +150,6 @@ jobs:
libjack-jackd2-dev:armhf
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
run: |
export USE_WAE=ON
@ -271,7 +220,7 @@ jobs:
pushd ${{ steps.package-identify.outputs.filename }}
cp -v ../LICENSE LICENSE.txt
cp -v ../README.md README.txt
cp -v ../res/releaseReadme/unstable-win.txt README.txt
cp -vr ../papers ../${binPath}/furnace.exe ./
if [ '${{ matrix.config.compiler }}' == 'msvc' ]; then
cp -v ../${binPath}/furnace.pdb ./
@ -284,8 +233,63 @@ jobs:
if: ${{ runner.os == 'macOS' }}
run: |
pushd build
cpack
mv Furnace-*-Darwin.dmg ../${{ steps.package-identify.outputs.filename }}
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 new
echo "attaching"
echo "y" | hdiutil attach Furnace-*-Darwin.dmg -readonly -mount required -mountpoint orig
echo "copying"
cp -v -r orig/Furnace.app new/Furnace.app
echo "synchronizing"
sync
echo "detaching"
hdiutil detach orig
echo "removing orig"
rmdir orig
rm Furnace-*-Darwin.dmg
if [ -e new/Furnace.app/Contents/Resources/bin/furnace ]; then
rm -v new/Furnace.app/Contents/Resources/bin/furnace
rmdir new/Furnace.app/Contents/Resources/bin
fi
echo "copying extra stuff"
cp -v ../LICENSE new/LICENSE.txt
cp -v ../res/releaseReadme/stable-mac.txt new/README
cp -v -r ../demos new/demos
cp -v -r ../instruments new/instruments
cp -v -r ../wavetables new/wavetables
cd new
wget https://tildearrow.org/furnace/doc/latest/manual.pdf
cd ..
echo "creating new image"
retries=0
while ! hdiutil create -srcfolder new -volname Furnace -format UDZO -fs HFS+ 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 }}
popd
- name: Package [Linux]
@ -317,7 +321,7 @@ jobs:
cd ..
cp ../../LICENSE .
cp ../../README.md .
cp ../../res/releaseReadme/unstable-other.txt .
cp -r ../../papers papers
rmdir usr
@ -329,7 +333,7 @@ jobs:
- name: Upload artifact
if: ${{ github.repository == 'tildearrow/furnace' && github.ref_name == 'master' }}
uses: actions/upload-artifact@v3.1.1
uses: actions/upload-artifact@v4.3.0
with:
name: ${{ steps.package-identify.outputs.id }}
path: ${{ steps.package-identify.outputs.filename }}

12
.gitignore vendored
View file

@ -6,6 +6,7 @@ release/
t/
winbuild/
win32build/
xpbuild/
macbuild/
linuxbuild/
*.swp
@ -15,6 +16,8 @@ test/songs/
test/delta/
test/result/
test/assert_delta
android/local.properties
android/.idea/
android/.gradle/
android/app/build/
android/app/.cxx/
@ -24,3 +27,12 @@ CMakePresets.json
extern/imgui_patched/examples/
src/asm/68k/amigatest/*.bin
src/asm/68k/amigatest/player
src/check/calc_checksum
res/binary_to_compressed_c
res/binary_to_compressed_c.exe
res/docpdf/manual.html
res/docpdf/manual.pdf
res/docpdf/.venv
res/docpdf/htmldoc/
res/fonts/compressed/
res/furnace.appdata.xml

3
.gitmodules vendored
View file

@ -12,3 +12,6 @@
[submodule "extern/adpcm"]
path = extern/adpcm
url = https://github.com/superctr/adpcm
[submodule "extern/portaudio"]
path = extern/portaudio
url = https://github.com/PortAudio/portaudio.git

View file

@ -8,6 +8,7 @@ project(furnace)
if (APPLE)
enable_language(OBJC)
enable_language(OBJCXX)
endif()
set(CMAKE_CXX_STANDARD 14)
@ -15,7 +16,7 @@ set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_PROJECT_VERSION_MAJOR 0)
set(CMAKE_PROJECT_VERSION_MINOR 6)
set(CMAKE_PROJECT_VERSION_PATCH 0)
set(CMAKE_PROJECT_VERSION_PATCH 2)
set(BUILD_GUI_DEFAULT ON)
set(USE_SDL2_DEFAULT ON)
@ -25,8 +26,18 @@ set(SYSTEM_SDL2_DEFAULT OFF)
include(CheckIncludeFile)
include(TestBigEndian)
execute_process(COMMAND git status RESULT_VARIABLE DONT_HAVE_GIT WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
if (NOT DONT_HAVE_GIT)
message(STATUS "Git is available")
else()
message(WARNING "either Git is not available, or this Git repository has not been initialized.
if you have used the \"Source code\" option in the GitHub release page, you are doing it wrong! unless you manually initialize submodules, the build is guaranteed to FAIL spectacularly!
read the \"developer info\" section of README.md for more information.")
endif()
if (ANDROID)
set(USE_RTMIDI_DEFAULT OFF)
set(WITH_PORTAUDIO_DEFAULT OFF)
set(USE_BACKWARD_DEFAULT OFF)
find_library(TERMUX rt)
if (TERMUX)
@ -34,6 +45,7 @@ if (ANDROID)
endif()
else()
set(USE_RTMIDI_DEFAULT ON)
set(WITH_PORTAUDIO_DEFAULT ON)
if (WIN32 OR APPLE)
set(USE_BACKWARD_DEFAULT ON)
else()
@ -55,15 +67,13 @@ else()
endif()
set(WITH_RENDER_SDL_DEFAULT ON)
if (APPLE)
set(WITH_RENDER_OPENGL_DEFAULT OFF)
else()
set(WITH_RENDER_OPENGL_DEFAULT ON)
endif()
set(WITH_RENDER_OPENGL_DEFAULT ON)
if (WIN32)
set(WITH_RENDER_DX11_DEFAULT ON)
set(WITH_RENDER_DX9_DEFAULT ON)
else()
set(WITH_RENDER_DX11_DEFAULT OFF)
set(WITH_RENDER_DX9_DEFAULT OFF)
endif()
if (APPLE)
set(WITH_RENDER_METAL_DEFAULT ON)
@ -73,8 +83,14 @@ endif()
if (ANDROID)
set(USE_GLES_DEFAULT ON)
set(WITH_RENDER_OPENGL1_DEFAULT OFF)
else()
set(USE_GLES_DEFAULT OFF)
if (APPLE)
set(WITH_RENDER_OPENGL1_DEFAULT OFF)
else()
set(WITH_RENDER_OPENGL1_DEFAULT ON)
endif()
endif()
option(BUILD_GUI "Build the tracker (disable to build only a headless player)" ${BUILD_GUI_DEFAULT})
@ -83,14 +99,20 @@ option(USE_SDL2 "Build with SDL2. Required to build with GUI." ${USE_SDL2_DEFAUL
option(USE_SNDFILE "Build with libsndfile. Required in order to work with audio files." ${USE_SNDFILE_DEFAULT})
option(USE_BACKWARD "Use backward-cpp to print a backtrace on crash/abort." ${USE_BACKWARD_DEFAULT})
option(WITH_JACK "Whether to build with JACK support. Auto-detects if JACK is available" ${WITH_JACK_DEFAULT})
option(WITH_PORTAUDIO "Whether to build with PortAudio for audio output." ${WITH_PORTAUDIO_DEFAULT})
option(WITH_RENDER_SDL "Whether to build with the SDL_Renderer render backend." ${WITH_RENDER_SDL_DEFAULT})
option(WITH_RENDER_OPENGL "Whether to build with the OpenGL render backend." ${WITH_RENDER_OPENGL_DEFAULT})
option(WITH_RENDER_OPENGL1 "Whether to build with the OpenGL 1.1 render backend." ${WITH_RENDER_OPENGL1_DEFAULT})
option(WITH_RENDER_DX11 "Whether to build with the DirectX 11 render backend." ${WITH_RENDER_DX11_DEFAULT})
option(WITH_RENDER_DX9 "Whether to build with the DirectX 9 render backend." ${WITH_RENDER_DX9_DEFAULT})
option(WITH_RENDER_METAL "Whether to build with the Metal render backend." ${WITH_RENDER_METAL_DEFAULT})
option(USE_GLES "Use OpenGL ES for the OpenGL render backend." ${USE_GLES_DEFAULT})
option(USE_FREETYPE "Use FreeType for font rendering." ON)
option(SYSTEM_FFTW "Use a system-installed version of FFTW instead of the vendored one" OFF)
option(SYSTEM_FMT "Use a system-installed version of fmt instead of the vendored one" OFF)
option(SYSTEM_FREETYPE "Use a system-installed version of FreeType instead of the vendored one" OFF)
option(SYSTEM_LIBSNDFILE "Use a system-installed version of libsndfile instead of the vendored one" OFF)
option(SYSTEM_PORTAUDIO "Use a system-installed version of PortAudio instead of the vendored one" OFF)
option(SYSTEM_RTMIDI "Use a system-installed version of RtMidi instead of the vendored one" OFF)
option(SYSTEM_ZLIB "Use a system-installed version of zlib instead of the vendored one" OFF)
option(SYSTEM_SDL2 "Use a system-installed version of SDL2 instead of the vendored one" ${SYSTEM_SDL2_DEFAULT})
@ -99,8 +121,9 @@ option(WARNINGS_ARE_ERRORS "Whether warnings in furnace's C++ code should be tre
option(WITH_DEMOS "Install demo songs" ON)
option(WITH_INSTRUMENTS "Install instruments" ON)
option(WITH_WAVETABLES "Install wavetables" ON)
option(SHOW_OPEN_ASSETS_MENU_ENTRY "Show option to open built-in assets directory (on supported platforms)" OFF)
set(DEPENDENCIES_INCLUDE_DIRS "")
set(DEPENDENCIES_INCLUDE_DIRS extern/IconFontCppHeaders src/icon)
if (ANDROID AND NOT TERMUX)
set(DEPENDENCIES_DEFINES "IS_MOBILE")
@ -126,19 +149,20 @@ else()
set(SYSTEM_SDL_MIN_VER 2.0.0)
endif()
if (WIN32)
# support Windows XP
if (SUPPORT_XP)
add_compile_definitions("_WIN32_WINNT=0x0501")
endif()
endif()
list(APPEND DEPENDENCIES_INCLUDE_DIRS "extern/SAASound/include")
#list(APPEND DEPENDENCIES_INCLUDE_DIRS "extern/SAASound/include")
list(APPEND DEPENDENCIES_INCLUDE_DIRS "extern/vgsound_emu-modified")
find_package(Threads REQUIRED)
list(APPEND DEPENDENCIES_LIBRARIES ${CMAKE_THREAD_LIBS_INIT})
if (WIN32)
# support Windows XP
if (SUPPORT_XP)
list(APPEND DEPENDENCIES_DEFINES "_WIN32_WINNT=0x0501")
endif()
endif()
if (SYSTEM_FFTW)
find_package(PkgConfig REQUIRED)
pkg_check_modules(FFTW REQUIRED fftw3>=3.3)
@ -184,6 +208,39 @@ else()
message(STATUS "Using vendored fmt")
endif()
if (BUILD_GUI AND USE_FREETYPE)
# TODO: FIX FIX FIX FIX FIX
if (SYSTEM_FREETYPE)
if (PKG_CONFIG_FOUND)
pkg_check_modules(FREETYPE freetype2>=2.0.0)
if (FREETYPE_FOUND)
list(APPEND DEPENDENCIES_INCLUDE_DIRS ${FREETYPE_INCLUDE_DIRS})
list(APPEND DEPENDENCIES_COMPILE_OPTIONS ${FREETYPE_CFLAGS_OTHER})
list(APPEND DEPENDENCIES_LIBRARIES ${FREETYPE_LIBRARIES})
list(APPEND DEPENDENCIES_LIBRARY_DIRS ${FREETYPE_LIBRARY_DIRS})
list(APPEND DEPENDENCIES_LINK_OPTIONS ${FREETYPE_LDFLAGS_OTHER})
list(APPEND DEPENDENCIES_LEGACY_LDFLAGS ${FREETYPE_LDFLAGS})
endif()
endif()
if (NOT FREETYPE_FOUND)
find_package(freetype REQUIRED)
list(APPEND DEPENDENCIES_LIBRARIES freetype::freetype)
endif()
message(STATUS "Using system-installed FreeType")
else()
set(FT_DISABLE_BROTLI ON CACHE BOOL "one" FORCE)
set(FT_DISABLE_BZIP2 ON CACHE BOOL "two" FORCE)
set(FT_DISABLE_HARFBUZZ ON CACHE BOOL "three" FORCE)
set(FT_DISABLE_PNG ON CACHE BOOL "four" FORCE)
set(FT_DISABLE_ZLIB ON CACHE BOOL "five" FORCE)
add_subdirectory(extern/freetype EXCLUDE_FROM_ALL)
list(APPEND DEPENDENCIES_INCLUDE_DIRS extern/freetype/include)
list(APPEND DEPENDENCIES_LIBRARIES freetype)
message(STATUS "Using vendored FreeType")
endif()
list(APPEND DEPENDENCIES_DEFINES HAVE_FREETYPE)
endif()
if (USE_SNDFILE)
list(APPEND DEPENDENCIES_DEFINES HAVE_SNDFILE)
if (SYSTEM_LIBSNDFILE)
@ -210,6 +267,27 @@ else()
message(STATUS "Not using libsndfile")
endif()
if (WITH_PORTAUDIO)
if (SYSTEM_PORTAUDIO)
find_package(PkgConfig REQUIRED)
pkg_check_modules(PORTAUDIO REQUIRED portaudio-2.0)
list(APPEND DEPENDENCIES_INCLUDE_DIRS ${PORTAUDIO_INCLUDE_DIRS})
list(APPEND DEPENDENCIES_COMPILE_OPTIONS ${PORTAUDIO_CFLAGS_OTHER})
list(APPEND DEPENDENCIES_LIBRARIES ${PORTAUDIO_LIBRARIES})
list(APPEND DEPENDENCIES_LIBRARY_DIRS ${PORTAUDIO_LIBRARY_DIRS})
list(APPEND DEPENDENCIES_LINK_OPTIONS ${PORTAUDIO_LDFLAGS_OTHER})
list(APPEND DEPENDENCIES_LEGACY_LDFLAGS ${PORTAUDIO_LDFLAGS})
message(STATUS "Using system-installed PortAudio")
else()
set(PA_BUILD_SHARED_LIBS OFF CACHE BOOL "Build dynamic library" FORCE)
# don't - Furnace has its own implementation
set(PA_USE_JACK OFF CACHE BOOL "Enable support for JACK Audio Connection Kit" FORCE)
add_subdirectory(extern/portaudio EXCLUDE_FROM_ALL)
list(APPEND DEPENDENCIES_LIBRARIES PortAudio)
message(STATUS "Using vendored PortAudio")
endif()
endif()
if (USE_RTMIDI)
if (SYSTEM_RTMIDI)
find_package(PkgConfig REQUIRED)
@ -289,6 +367,18 @@ if (USE_SDL2)
# If you link SDL statically, you also need to define HAVE_LIBC so it builds with the C runtime that your application uses.
# This should probably go in a FAQ.
set(SDL_LIBC ON CACHE BOOL "Tell SDL that we want it to use our C runtime (required for proper static linking)" FORCE)
# https://github.com/tildearrow/furnace/issues/1237
# enabling this will result in SDL finding the Direct3D headers, forcing _WIN32_WINNT to an undesirable value (which makes the Wine headers define GetTickCount64)
if (SUPPORT_XP)
set(SDL_RENDER_D3D OFF CACHE BOOL "Enable the Direct3D render driver" FORCE)
endif()
CHECK_INCLUDE_FILE(GLES/gl.h GLES_GL_FOUND)
if (NOT GLES_GL_FOUND AND NOT USE_GLES)
set(SDL_OPENGLES OFF CACHE BOOL "Enable OpenGL ES" FORCE)
endif()
add_subdirectory(extern/SDL EXCLUDE_FROM_ALL)
list(APPEND DEPENDENCIES_DEFINES HAVE_SDL2)
list(APPEND DEPENDENCIES_INCLUDE_DIRS extern/SDL/include)
@ -313,12 +403,6 @@ else()
endif()
endif()
if (BUILD_GUI)
if (NOT WITH_RENDER_SDL AND NOT WITH_RENDER_OPENGL AND NOT WITH_RENDER_DX11 AND NOT WITH_RENDER_METAL)
message(FATAL_ERROR "No render backends selected!")
endif()
endif()
set(AUDIO_SOURCES
src/audio/abstract.cpp
src/audio/midi.cpp
@ -331,19 +415,29 @@ endif()
if (WITH_JACK)
find_package(PkgConfig REQUIRED)
pkg_check_modules(JACK REQUIRED jack)
list(APPEND AUDIO_SOURCES extern/weakjack/weak_libjack.c)
list(APPEND AUDIO_SOURCES src/audio/jack.cpp)
list(APPEND DEPENDENCIES_INCLUDE_DIRS ${JACK_INCLUDE_DIRS})
list(APPEND DEPENDENCIES_DEFINES HAVE_JACK)
list(APPEND DEPENDENCIES_COMPILE_OPTIONS ${JACK_CFLAGS_OTHER})
list(APPEND DEPENDENCIES_LIBRARIES ${JACK_LIBRARIES})
list(APPEND DEPENDENCIES_LIBRARY_DIRS ${JACK_LIBRARY_DIRS})
list(APPEND DEPENDENCIES_LINK_OPTIONS ${JACK_LDFLAGS_OTHER})
list(APPEND DEPENDENCIES_LEGACY_LDFLAGS ${JACK_LDFLAGS})
list(APPEND DEPENDENCIES_DEFINES USE_WEAK_JACK)
#list(APPEND DEPENDENCIES_COMPILE_OPTIONS ${JACK_CFLAGS_OTHER})
#list(APPEND DEPENDENCIES_LIBRARIES ${JACK_LIBRARIES})
#list(APPEND DEPENDENCIES_LIBRARY_DIRS ${JACK_LIBRARY_DIRS})
#list(APPEND DEPENDENCIES_LINK_OPTIONS ${JACK_LDFLAGS_OTHER})
#list(APPEND DEPENDENCIES_LEGACY_LDFLAGS ${JACK_LDFLAGS})
message(STATUS "Building with JACK support")
else()
message(STATUS "Building without JACK support")
endif()
if (WITH_PORTAUDIO)
list(APPEND AUDIO_SOURCES src/audio/pa.cpp)
message(STATUS "Building with PortAudio")
list(APPEND DEPENDENCIES_DEFINES HAVE_PA)
else()
message(STATUS "Building without PortAudio")
endif()
if (USE_RTMIDI)
list(APPEND AUDIO_SOURCES src/audio/rtmidi.cpp)
message(STATUS "Building with RtMidi")
@ -398,11 +492,24 @@ extern/adpcm/yma_codec.c
extern/adpcm/ymb_codec.c
extern/adpcm/ymz_codec.c
extern/adpcm-xq-s/adpcm-lib.c
extern/opn/ym3438.c
extern/Nuked-PSG/ympsg.c
extern/opm/opm.c
extern/Nuked-OPLL/opll.c
extern/opl/opl3.c
extern/YM3812-LLE/fmopl2.c
extern/YMF262-LLE/fmopl3.c
extern/YMF276-LLE/fmopn2.c
extern/ESFMu/esfm.c
extern/ESFMu/esfm_registers.c
extern/emu2413/emu2413.c
extern/pwrnoise/pwrnoise.c
src/pch.cpp
src/engine/platform/sound/sn76496.cpp
src/engine/platform/sound/ay8910.cpp
src/engine/platform/sound/saa1099.cpp
@ -417,6 +524,8 @@ src/engine/platform/sound/nes/mmc5.c
src/engine/platform/sound/vera_psg.c
src/engine/platform/sound/vera_pcm.c
src/engine/platform/sound/nes_nsfplay/5e01_apu.cpp
src/engine/platform/sound/nes_nsfplay/5e01_dmc.cpp
src/engine/platform/sound/nes_nsfplay/nes_apu.cpp
src/engine/platform/sound/nes_nsfplay/nes_dmc.cpp
src/engine/platform/sound/nes_nsfplay/nes_fds.cpp
@ -461,13 +570,17 @@ src/engine/platform/sound/c64_fp/WaveformCalculator.cpp
src/engine/platform/sound/c64_fp/WaveformGenerator.cpp
src/engine/platform/sound/c64_fp/resample/SincResampler.cpp
src/engine/platform/sound/c64_d/dsid.c
src/engine/platform/sound/tia/AudioChannel.cpp
src/engine/platform/sound/tia/Audio.cpp
src/engine/platform/sound/ymfm/ymfm_adpcm.cpp
src/engine/platform/sound/ymfm/ymfm_opl.cpp
src/engine/platform/sound/ymfm/ymfm_opm.cpp
src/engine/platform/sound/ymfm/ymfm_opn.cpp
src/engine/platform/sound/ymfm/ymfm_opz.cpp
src/engine/platform/sound/ymfm/ymfm_pcm.cpp
src/engine/platform/sound/ymfm/ymfm_ssg.cpp
src/engine/platform/sound/lynx/Mikey.cpp
@ -502,32 +615,53 @@ src/engine/platform/sound/sm8521.c
src/engine/platform/sound/d65modified.c
src/engine/platform/sound/ted-sound.c
src/engine/platform/sound/c140_c219.c
src/engine/platform/sound/dave/dave.cpp
src/engine/platform/sound/nds.cpp
src/engine/platform/oplAInterface.cpp
src/engine/platform/ym2608Interface.cpp
src/engine/platform/ym2610Interface.cpp
src/engine/fileOps/fileOpsCommon.cpp
src/engine/fileOps/dmf.cpp
src/engine/fileOps/fc.cpp
src/engine/fileOps/ftm.cpp
src/engine/fileOps/fur.cpp
src/engine/fileOps/mod.cpp
src/engine/fileOps/s3m.cpp
src/engine/fileOps/text.cpp
src/engine/blip_buf.c
src/engine/brrUtils.c
src/engine/safeReader.cpp
src/engine/safeWriter.cpp
src/engine/workPool.cpp
src/engine/cmdStream.cpp
src/engine/cmdStreamOps.cpp
src/engine/config.cpp
src/engine/configEngine.cpp
src/engine/dispatchContainer.cpp
src/engine/engine.cpp
src/engine/export.cpp
src/engine/fileOps.cpp
src/engine/fileOpsIns.cpp
src/engine/fileOpsSample.cpp
src/engine/filter.cpp
src/engine/instrument.cpp
src/engine/macroInt.cpp
src/engine/pattern.cpp
src/engine/pitchTable.cpp
src/engine/playback.cpp
src/engine/sample.cpp
src/engine/song.cpp
src/engine/sysDef.cpp
src/engine/wavetable.cpp
src/engine/waveSynth.cpp
src/engine/wavOps.cpp
src/engine/vgmOps.cpp
src/engine/zsmOps.cpp
src/engine/zsm.cpp
@ -592,6 +726,15 @@ src/engine/platform/k007232.cpp
src/engine/platform/ga20.cpp
src/engine/platform/sm8521.cpp
src/engine/platform/pv1000.cpp
src/engine/platform/k053260.cpp
src/engine/platform/ted.cpp
src/engine/platform/c140.cpp
src/engine/platform/esfm.cpp
src/engine/platform/powernoise.cpp
src/engine/platform/dave.cpp
src/engine/platform/gbadma.cpp
src/engine/platform/gbaminmod.cpp
src/engine/platform/nds.cpp
src/engine/platform/pcmdac.cpp
src/engine/platform/dummy.cpp
@ -612,6 +755,13 @@ if (WIN32)
list(APPEND ENGINE_SOURCES res/furnace.rc)
endif()
if (APPLE)
if (CMAKE_OSX_DEPLOYMENT_TARGET VERSION_LESS 10.12)
list(APPEND DEPENDENCIES_INCLUDE_DIRS extern/macports-legacy-support/include)
list(APPEND ENGINE_SOURCES extern/macports-legacy-support/src/time.c)
endif()
endif()
set(CLI_SOURCES
src/cli/cli.cpp
)
@ -622,6 +772,7 @@ extern/imgui_patched/imgui_draw.cpp
extern/imgui_patched/imgui_tables.cpp
extern/imgui_patched/imgui_widgets.cpp
extern/imgui_patched/backends/imgui_impl_sdl2.cpp
extern/imgui_software_renderer/imgui_sw.cpp
extern/imgui_patched/misc/cpp/imgui_stdlib.cpp
extern/igfd/ImGuiFileDialog.cpp
@ -629,6 +780,7 @@ src/gui/plot_nolerp.cpp
src/gui/render.cpp
src/gui/render/abstract.cpp
src/gui/render/renderSoftware.cpp
src/gui/font_exo.cpp
src/gui/font_liberationSans.cpp
@ -639,7 +791,9 @@ src/gui/font_proggyClean.cpp
src/gui/font_ptMono.cpp
src/gui/font_unifont.cpp
src/gui/font_icon.cpp
src/gui/font_furicon.cpp
src/gui/fonts.cpp
src/gui/fontzlib.cpp
src/gui/image_icon.cpp
src/gui/image_talogo.cpp
@ -663,6 +817,7 @@ src/gui/channels.cpp
src/gui/chanOsc.cpp
src/gui/clock.cpp
src/gui/compatFlags.cpp
src/gui/csPlayer.cpp
src/gui/cursor.cpp
src/gui/dataList.cpp
src/gui/debugWindow.cpp
@ -670,6 +825,7 @@ src/gui/doAction.cpp
src/gui/editing.cpp
src/gui/editControls.cpp
src/gui/effectList.cpp
src/gui/exportOptions.cpp
src/gui/findReplace.cpp
src/gui/fmPreview.cpp
src/gui/gradient.cpp
@ -677,9 +833,11 @@ src/gui/grooves.cpp
src/gui/insEdit.cpp
src/gui/intro.cpp
src/gui/log.cpp
src/gui/memory.cpp
src/gui/mixer.cpp
src/gui/midiMap.cpp
src/gui/newSong.cpp
src/gui/commandPalette.cpp
src/gui/orders.cpp
src/gui/osc.cpp
src/gui/patManager.cpp
@ -699,11 +857,13 @@ src/gui/subSongs.cpp
src/gui/sysConf.cpp
src/gui/sysEx.cpp
src/gui/sysManager.cpp
src/gui/sysPartNumber.cpp
src/gui/sysPicker.cpp
src/gui/tutorial.cpp
src/gui/util.cpp
src/gui/waveEdit.cpp
src/gui/volMeter.cpp
src/gui/xyOsc.cpp
src/gui/gui.cpp
)
@ -712,6 +872,10 @@ if (WIN32 AND NOT SUPPORT_XP)
list(APPEND GUI_SOURCES extern/nfd-modified/src/nfd_win.cpp)
endif()
if (USE_FREETYPE)
list(APPEND GUI_SOURCES extern/imgui_patched/misc/freetype/imgui_freetype.cpp)
endif()
if (APPLE)
list(APPEND GUI_SOURCES extern/nfd-modified/src/nfd_common.cpp)
list(APPEND GUI_SOURCES src/gui/macstuff.m)
@ -735,12 +899,32 @@ if (WITH_RENDER_OPENGL)
endif()
if (WIN32)
list(APPEND DEPENDENCIES_LIBRARIES opengl32)
elseif(APPLE)
list(APPEND DEPENDENCIES_LIBRARIES "-framework OpenGL")
elseif(USE_GLES)
list(APPEND DEPENDENCIES_LIBRARIES GLESv2)
else()
list(APPEND DEPENDENCIES_LIBRARIES GL)
endif()
message(STATUS "UI render backend: OpenGL")
if (USE_GLES)
message(STATUS "UI render backend: OpenGL ES 2.0")
else()
message(STATUS "UI render backend: OpenGL 3.0/2.0")
endif()
endif()
if (WITH_RENDER_OPENGL1)
list(APPEND GUI_SOURCES src/gui/render/renderGL1.cpp)
list(APPEND GUI_SOURCES extern/imgui_patched/backends/imgui_impl_opengl2.cpp)
list(APPEND DEPENDENCIES_DEFINES HAVE_RENDER_GL1)
if (NOT WITH_RENDER_OPENGL)
if (WIN32)
list(APPEND DEPENDENCIES_LIBRARIES opengl32)
else()
list(APPEND DEPENDENCIES_LIBRARIES GL)
endif()
endif()
message(STATUS "UI render backend: OpenGL 1.1")
endif()
if (WITH_RENDER_DX11)
@ -751,7 +935,7 @@ if (WITH_RENDER_DX11)
list(APPEND GUI_SOURCES src/gui/render/renderDX11.cpp)
list(APPEND GUI_SOURCES extern/imgui_patched/backends/imgui_impl_dx11.cpp)
list(APPEND DEPENDENCIES_DEFINES HAVE_RENDER_DX11)
list(APPEND DEPENDENCIES_LIBRARIES d3d11)
list(APPEND DEPENDENCIES_LIBRARIES d3d11 dxgi)
message(STATUS "UI render backend: DirectX 11")
endif()
else()
@ -759,13 +943,25 @@ if (WITH_RENDER_DX11)
endif()
endif()
#if (WITH_RENDER_DX9)
# if (WIN32)
# list(APPEND GUI_SOURCES src/gui/render/renderDX9.cpp)
# list(APPEND GUI_SOURCES extern/imgui_patched/backends/imgui_impl_dx9.cpp)
# list(APPEND DEPENDENCIES_DEFINES HAVE_RENDER_DX9)
# list(APPEND DEPENDENCIES_LIBRARIES d3d9)
# message(STATUS "UI render backend: DirectX 9")
# else()
# message(FATAL_ERROR "DirectX 9 render backend only for Windows!")
# endif()
#endif()
if (WITH_RENDER_METAL)
if (APPLE)
list(APPEND GUI_SOURCES src/gui/render/renderMetal.cpp)
list(APPEND GUI_SOURCES extern/imgui_patched/backends/imgui_impl_metal.cpp)
list(APPEND DEPENDENCIES_DEFINES HAVE_RENDER_METAL)
# TODO: what is being used?
#list(APPEND DEPENDENCIES_LIBRARIES d3d11)
list(APPEND DEPENDENCIES_LIBRARIES "-framework Metal")
list(APPEND DEPENDENCIES_LIBRARIES "-framework MetalKit")
message(STATUS "UI render backend: Metal")
else()
message(FATAL_ERROR "Metal render backend only for Apple operating systems!")
@ -806,9 +1002,20 @@ set(USED_SOURCES ${ENGINE_SOURCES} ${AUDIO_SOURCES} ${CLI_SOURCES} src/main.cpp)
if (USE_BACKWARD)
list(APPEND USED_SOURCES src/backtrace.cpp)
if (WIN32 AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
if (WIN32)
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
include(CheckCXXCompilerFlag)
check_cxx_compiler_flag(-gcodeview GCC_CODEVIEW)
if (GCC_CODEVIEW)
set(CMAKE_EXE_LINKER_FLAGS "-Wl,--pdb= ")
add_compile_options(-gcodeview)
message(STATUS "Enabling -gcodeview flag for backward-cpp.")
else()
message(WARNING "Could not enable -gcodeview! backward-cpp will not work.")
endif()
list(APPEND DEPENDENCIES_LIBRARIES dbghelp psapi)
endif()
endif()
find_library(EXECINFO_IS_LIBRARY execinfo)
if (EXECINFO_IS_LIBRARY)
list(APPEND DEPENDENCIES_LIBRARIES execinfo)
@ -822,9 +1029,8 @@ if (BUILD_GUI)
list(APPEND USED_SOURCES ${GUI_SOURCES})
list(APPEND DEPENDENCIES_INCLUDE_DIRS
extern/imgui_patched
extern/imgui_conf
extern/imgui_patched/backends
extern/IconFontCppHeaders
extern/imgui_software_renderer
extern/igfd
)
if (WIN32 OR APPLE)
@ -879,12 +1085,21 @@ endif()
string(REPLACE ";" " " WARNING_FLAGS_STRING "${WARNING_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WARNING_FLAGS_STRING}")
if (WARNINGS_ARE_ERRORS)
message(WARNING
message(STATUS
"Treating all warnings in furnace's C++ code as errors! "
"Please report any errors you encounter on the bug tracker."
)
endif()
if (NOT ANDROID OR TERMUX)
if (NOT WIN32 AND NOT APPLE)
if (NOT DONT_HAVE_GIT)
add_custom_command(OUTPUT furnace.appdata.xml COMMAND res/make-appdata.sh ARGS ${CMAKE_SOURCE_DIR}/res/furnace.appdata.xml.in ${CMAKE_BINARY_DIR}/furnace.appdata.xml DEPENDS res/furnace.appdata.xml.in WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
list(APPEND USED_SOURCES furnace.appdata.xml)
endif()
endif()
endif()
if(ANDROID AND NOT TERMUX)
add_library(furnace SHARED ${USED_SOURCES})
elseif(WIN32)
@ -894,7 +1109,6 @@ else()
endif()
target_include_directories(furnace SYSTEM PRIVATE ${DEPENDENCIES_INCLUDE_DIRS})
target_compile_definitions(furnace PRIVATE ${DEPENDENCIES_DEFINES} IMGUI_USER_CONFIG="imconfig_fur.h")
target_compile_options(furnace PRIVATE ${DEPENDENCIES_COMPILE_OPTIONS})
target_link_libraries(furnace PRIVATE ${DEPENDENCIES_LIBRARIES})
if (PKG_CONFIG_FOUND AND (SYSTEM_FMT OR SYSTEM_LIBSNDFILE OR SYSTEM_ZLIB OR SYSTEM_SDL2 OR SYSTEM_RTMIDI OR WITH_JACK))
@ -910,23 +1124,47 @@ if (PKG_CONFIG_FOUND AND (SYSTEM_FMT OR SYSTEM_LIBSNDFILE OR SYSTEM_ZLIB OR SYST
endif()
endif()
# why 3.16..... why not 3.0?
if (NOT "${CMAKE_VERSION}" VERSION_LESS "3.16")
if (BUILD_GUI)
target_precompile_headers(furnace PUBLIC
$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/src/pch.h>
$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/extern/imgui_patched/imgui.h>
$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/extern/imgui_patched/imgui_internal.h>
)
else()
target_precompile_headers(furnace PUBLIC
$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/src/pch.h>
)
endif()
endif()
if (NOT ANDROID OR TERMUX)
if (NOT WIN32 AND NOT APPLE)
include(GNUInstallDirs)
install(TARGETS furnace RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
install(FILES res/furnace.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications)
install(FILES res/furnace.appdata.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo)
if (NOT DONT_HAVE_GIT)
install(FILES ${CMAKE_BINARY_DIR}/furnace.appdata.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo)
endif()
install(DIRECTORY doc DESTINATION ${CMAKE_INSTALL_DOCDIR})
install(DIRECTORY papers DESTINATION ${CMAKE_INSTALL_DOCDIR}/other)
install(FILES LICENSE DESTINATION ${CMAKE_INSTALL_DATADIR}/licenses/furnace)
if (WITH_DEMOS OR WITH_INSTRUMENTS OR WITH_WAVETABLES)
set(FURNACE_DATADIR ${CMAKE_INSTALL_FULL_DATADIR}/furnace)
if (WITH_DEMOS)
install(DIRECTORY demos DESTINATION ${CMAKE_INSTALL_DATADIR}/furnace)
install(DIRECTORY demos DESTINATION ${FURNACE_DATADIR})
endif()
if (WITH_INSTRUMENTS)
install(DIRECTORY instruments DESTINATION ${CMAKE_INSTALL_DATADIR}/furnace)
install(DIRECTORY instruments DESTINATION ${FURNACE_DATADIR})
endif()
if (WITH_WAVETABLES)
install(DIRECTORY wavetables DESTINATION ${CMAKE_INSTALL_DATADIR}/furnace)
install(DIRECTORY wavetables DESTINATION ${FURNACE_DATADIR})
endif()
list(APPEND DEPENDENCIES_DEFINES FURNACE_DATADIR="${FURNACE_DATADIR}")
if (SHOW_OPEN_ASSETS_MENU_ENTRY)
list(APPEND DEPENDENCIES_DEFINES SHOW_OPEN_ASSETS_MENU_ENTRY)
endif()
endif()
foreach(num 16 32 64 128 256 512)
set(res ${num}x${num})
@ -951,7 +1189,10 @@ if (NOT ANDROID OR TERMUX)
set(CPACK_BUNDLE_PLIST ${CMAKE_SOURCE_DIR}/res/Info.plist)
set(CPACK_BUNDLE_ICON ${CMAKE_SOURCE_DIR}/res/icon.icns)
set(CPACK_BUNDLE_STARTUP_COMMAND "furnace")
set(CPACK_BUNDLE_APPLE_CERT_APP "-")
endif()
include(CPack)
endif()
target_compile_definitions(furnace PRIVATE ${DEPENDENCIES_DEFINES})

View file

@ -2,7 +2,19 @@
contributions to Furnace are welcome!
# Getting ready
# Issue reports
if you find an issue with Furnace, see the Issues section.
# Suggestions and other types of discussions
see the Discussions section.
**DO NOT USE THE ISSUES SECTION FOR THESE - it is only for ISSUES.**
# Other
## Getting ready
log into your Github account, and click the Fork button in the header of the project's page.
@ -14,9 +26,9 @@ git clone git@github.com:USERNAME/furnace.git
(replace `USERNAME` with your username)
# Working
## Working
## Code
### Code
bug fixes, improvements and several other things accepted.
@ -35,6 +47,7 @@ the coding style is described here:
- preprocessor directives not intended
- if macro comprises more than one line, indent
- no new line after `template<>`
- do not use `_t` types, except for 64-bit integers and `size_t`.
- prefer built-in types:
- `bool`
- `signed char` or `unsigned char` are 8-bit
@ -48,11 +61,13 @@ the coding style is described here:
- `long long int` or `unsigned long long int` are 64-bit
- avoid using 64-bit numbers as I still build for 32-bit systems.
- two `long`s are required to make Windows happy.
- prefer using `int64_t` or `uint64_t` for this specific case.
- `size_t` are 32-bit or 64-bit, depending on architecture.
- in float/double operations, always use decimal and `f` if single-precision.
- e.g. `1.0f` or `1.0` instead of `1`.
- prefer `NULL` over `nullptr` or any other proprietary null.
- don't use `auto` unless needed.
- only use `auto` if needed.
- avoid using `goto` unless absolutely required.
- use `String` for `std::string` (this is typedef'd in ta-utils.h).
- prefer using operator for String (std::string) comparisons (a=="").
- if you have to work with C strings, only use safe C string operations:
@ -81,19 +96,27 @@ additional guidelines:
- on a switch block, **always** put `default` last and not in any other position.
- I have fear of some C/C++ compilers ignoring the rest of cases upon hitting default.
## Demo Songs
### Do NOT Force-Push after submitting Pull Request
if you do so, your pull request will be closed.
### Demo Songs
just put your demo song in `demos/`! be noted there are some guidelines:
- avoid Nintendo song covers.
- avoid big label song covers.
- low effort compositions/covers may not be accepted at all.
- the following systems are not acceptable:
- YMU759/MA-2: exists only for compatibility.
- Pong: it is a joke system.
- the song shall be in Furnace file format.
# Finishing
## Finishing
after you've done your modifications, commit the changes and push.
then open your fork on GitHub and send a pull request.
# I don't know how to use Git but I want to contribute with a demo song
## I don't know how to use Git but I want to contribute with a demo song
you can also contact me directly! [find me here.](https://tildearrow.org/?p=contact)

View file

@ -9,13 +9,15 @@ the biggest multi-system chiptune tracker ever made!
---
## downloads
check out the [Releases](https://github.com/tildearrow/furnace/releases) page. available for Windows, macOS and Linux (AppImage).
check out the [Releases](https://github.com/tildearrow/furnace/releases) page. available for Windows, macOS and Linux.
for other operating systems, you may [build the source](#developer-info).
[see here](https://nightly.link/tildearrow/furnace/workflows/build/master) for the latest unstable build.
## features
- over 50 sound chips - and counting:
- a large selection of sound chips:
- Yamaha FM chips:
- YM2151 (OPM)
- YM2203 (OPN)
@ -29,6 +31,7 @@ check out the [Releases](https://github.com/tildearrow/furnace/releases) page. a
- YM3812 (OPL2)
- YMF262 (OPL3) with full 4-op support!
- Y8950 (OPL with ADPCM)
- ESS ESFM (like OPL3 but with more features)
- square wave chips:
- AY-3-8910/YM2149(F) used in several computers and game consoles
- Commodore VIC used in the VIC-20
@ -46,8 +49,11 @@ check out the [Releases](https://github.com/tildearrow/furnace/releases) page. a
- Ricoh RF5C68 used in Sega CD and FM Towns
- OKI MSM6258 and MSM6295
- Konami K007232
- Konami K053260
- Irem GA20
- Ensoniq ES5506
- Namco C140
- Namco C219
- wavetable chips:
- HuC6280 used in PC Engine
- Konami Bubble System WSG
@ -71,14 +77,22 @@ check out the [Releases](https://github.com/tildearrow/furnace/releases) page. a
- QuadTone engine
- Pokémon Mini
- Commodore PET
- TED used in Commodore Plus/4
- Casio PV-1000
- TIA used in Atari 2600
- POKEY used in Atari 8-bit computers
- Game Boy
- **Game Boy**
- including SOFTWARE ENVELOPES (zombie mode)
- Virtual Boy
- Game Boy Advance
- DMA (direct memory access) two channel mode
- MinMod software driver by Natt Akuma
- Nintendo DS
- modern/fantasy:
- Commander X16 VERA
- tildearrow Sound Unit
- PowerNoise
- Generic PCM DAC
- mix and match sound chips!
- over 200 ready to use presets from computers, game consoles and arcade boards...
- ...or create your own - up to 32 of them or a total of 128 channels!
@ -90,12 +104,13 @@ check out the [Releases](https://github.com/tildearrow/furnace/releases) page. a
- clean-room design (guesswork and ABX tests only, no decompilation involved)
- some bug/quirk implementation for increased playback accuracy through compatibility flags
- VGM export
- ZSM export for Commander X16
- modular layout that you may adapt to your needs
- audio file export - entire song, per chip or per channel
- quality emulation cores (Nuked, MAME, SameBoy, Mednafen PCE, NSFplay, puNES, reSID, Stella, SAASound, vgsound_emu and ymfm)
- wavetable synthesizer
- available on wavetable chips
- create complex sounds with ease - provide up to two wavetables, select and effect and let go!
- create complex sounds with ease - provide up to two wavetables, select an effect and let go!
- MIDI input support
- additional features:
- FM macros!
@ -120,18 +135,22 @@ check out the [Releases](https://github.com/tildearrow/furnace/releases) page. a
# quick references
- **discussion**: see the [Discussions](https://github.com/tildearrow/furnace/discussions) section, the [official Revolt](https://rvlt.gg/GRPS6tmc) or the [official Discord server](https://discord.gg/EfrwT2wq7z).
- **help**: check out the [documentation](doc/README.md). it's incomplete though.
- **help**: check out the [documentation](doc/README.md).
## packages
[![Packaging status](https://repology.org/badge/tiny-repos/furnace.svg)](https://repology.org/project/furnace/versions)
[![Packaging status](https://repology.org/badge/vertical-allrepos/furnace.svg)](https://repology.org/project/furnace/versions)
some people have provided packages for Unix/Unix-like distributions. here's a list.
- **Flatpak**: yes! Furnace is now available on [Flathub](https://flathub.org/apps/org.tildearrow.furnace) thanks to ColinKinloch.
- **Arch Linux**: [furnace](https://archlinux.org/packages/extra/x86_64/furnace/) is in the official repositories.
- **FreeBSD**: [a package in ports](https://www.freshports.org/audio/furnace/) is available courtesy of ehaupt (warning: 0.5.8!).
- **Chimera Linux**: [furnace](https://pkgs.chimera-linux.org/package/current/contrib/x86_64/furnace) is in the contrib repository.
- **FreeBSD**: [a package in ports](https://www.freshports.org/audio/furnace/) is available courtesy of ehaupt.
- **Nix**: [package](https://search.nixos.org/packages?channel=unstable&show=furnace&from=0&size=50&sort=relevance&type=packages&query=furnace) thanks to OPNA2608.
- **openSUSE**: [a package](https://software.opensuse.org/package/furnace) is available, courtesy of fpesari.
- **Void Linux**: [furnace](https://github.com/void-linux/void-packages/tree/master/srcpkgs/furnace) is available in the official repository.
---
# developer info
@ -156,6 +175,7 @@ otherwise, you may also need the following:
- libx11
- libasound
- libGL
- any other libraries which may be used by SDL
some Linux distributions (e.g. Ubuntu or openSUSE) will require you to install the `-dev` versions of these.
@ -242,18 +262,37 @@ Available options:
| `USE_SDL2` | `ON` | Build with SDL2 (required to build with GUI) |
| `USE_SNDFILE` | `ON` | Build with libsndfile (required in order to work with audio files) |
| `USE_BACKWARD` | `ON` | Use backward-cpp to print a backtrace on crash/abort |
| `WITH_JACK` | `ON` if system-installed JACK detected, otherwise `OFF` | Whether to build with JACK support. Auto-detects if JACK is available |
| `USE_FREETYPE` | `OFF` | Build with FreeType support |
| `WITH_JACK` | auto\* | Whether to build with JACK support. Auto-detects if JACK is available |
| `WITH_PORTAUDIO` | `ON` | Whether to build with PortAudio. |
| `SYSTEM_FFTW` | `OFF` | Use a system-installed version of FFTW instead of the vendored one |
| `SYSTEM_FMT` | `OFF` | Use a system-installed version of fmt instead of the vendored one |
| `SYSTEM_LIBSNDFILE` | `OFF` | Use a system-installed version of libsndfile instead of the vendored one |
| `SYSTEM_RTMIDI` | `OFF` | Use a system-installed version of RtMidi instead of the vendored one |
| `SYSTEM_ZLIB` | `OFF` | Use a system-installed version of zlib instead of the vendored one |
| `SYSTEM_SDL2` | `OFF` | Use a system-installed version of SDL2 instead of the vendored one |
| `SYSTEM_FREETYPE` | `OFF` | Use a system-installed version of FreeType instead of the vendored one |
| `SUPPORT_XP` | `OFF` | Build a Windows XP-compatible binary |
| `WARNINGS_ARE_ERRORS` | `OFF` (but consider enabling this & reporting any errors that arise from it!) | Whether warnings in furnace's C++ code should be treated as errors |
| `WARNINGS_ARE_ERRORS` | `OFF`\*\* | Whether warnings in furnace's C++ code should be treated as errors |
| `WITH_DEMOS` | `ON` | Install demo songs on `make install` |
| `WITH_INSTRUMENTS` | `ON` | Install demo instruments on `make install` |
| `WITH_WAVETABLES` | `ON` | Install wavetables on `make install` |
| `SHOW_OPEN_ASSETS_MENU_ENTRY` | `OFF` | Show option to open built-in assets directory (on supported platforms) |
(\*) `ON` if system-installed JACK detected, otherwise `OFF`
(\*\*) but consider enabling this & reporting any errors that arise from it!
## CMake Error
if it says something about a missing subdirectory in `extern`, then either:
1. you didn't set up submodules, or
2. you downloaded the source as a .zip or .tar.gz. don't do this.
if 1, you may run `git submodule update --init --recursive`. this will initialize submodules.
if 2, clone this repo.
## console usage
@ -289,7 +328,7 @@ this is due to Apple's application signing policy. a workaround is to right clic
> it says "Furnace" is damaged and can't be opened!
**as of Monterey, this workaround no longer works (especially on ARM).** yeah, Apple has decided to be strict on the matter.
if you happen to be on that version, use this workaround instead (on a Terminal):
if you happen to be on that version (or later), use this workaround instead (on a Terminal):
```
xattr -d com.apple.quarantine /path/to/Furnace.app
@ -301,11 +340,11 @@ you may need to log out and/or reboot after doing this.
> where's the manual?
see [doc/](doc/README.md). it's kind of incomplete though.
it is in [doc/](doc/README.md).
> is there a tutorial?
sadly, the in-program tutorial isn't ready yet. however, [a video tutorial is available on YouTube](https://youtube.com/playlist?list=PLCELB6AsTZUnwv0PC5AAGHjvg47F44YQ1), made by Spinning Square Waves.
[a video tutorial (of a previous version) is available on YouTube](https://youtube.com/playlist?list=PLCELB6AsTZUnwv0PC5AAGHjvg47F44YQ1), made by Spinning Square Waves.
> I've lost my song!
@ -330,7 +369,7 @@ you should only save as .dmf if you're really sure, because the DefleMask format
---
# footnotes
copyright (C) 2021-2023 tildearrow and contributors.
copyright (C) 2021-2024 tildearrow and contributors.
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

19
TODO.md
View file

@ -1,12 +1,9 @@
# to-do for 0.6pre6
# to-do for 0.6.3
- tutorial?
- ease-of-use improvements... ideas:
- preset compat flags
- maybe reduced set of presets for the sake of simplicity
- a more preferable highlight/drag system
- some speed/intuitive workflow improvements that go a long way
- make .pdf manual out of doc/
- break compatibility if it relieves complexity
- multi-key binds
- bug fixes
- 9xxx for more chips
- user presets
# to-do long term
- finish auto-clone
- new pattern renderer - performance improvements

View file

@ -15,8 +15,8 @@ android {
}
minSdkVersion 21
targetSdkVersion 26
versionCode 158
versionName "0.6pre5"
versionCode 197
versionName "0.6.2"
externalNativeBuild {
cmake {
arguments "-DANDROID_APP_PLATFORM=android-21", "-DANDROID_STL=c++_static", "-DWARNINGS_ARE_ERRORS=ON"

View file

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

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
demos/arcade/eek_qsound.fur Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
demos/ay8910/vibe_zone.fur Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
demos/c64/deadlock.fur Normal file

Binary file not shown.

BIN
demos/esfm/AAAA.fur Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
demos/esfm/Deadline.fur Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
demos/esfm/Ken_Stage.fur Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
demos/esfm/Perilous059.fur Normal file

Binary file not shown.

BIN
demos/esfm/Poets_I.fur Normal file

Binary file not shown.

BIN
demos/esfm/Redial.fur Normal file

Binary file not shown.

Binary file not shown.

BIN
demos/esfm/Second_Start.fur Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
demos/esfm/esfm_ins.fur Normal file

Binary file not shown.

BIN
demos/esfm/experiment.fur Normal file

Binary file not shown.

BIN
demos/esfm/flashback.fur Normal file

Binary file not shown.

BIN
demos/esfm/frosty_dusk.fur Normal file

Binary file not shown.

Binary file not shown.

BIN
demos/esfm/her_wishes.fur Normal file

Binary file not shown.

BIN
demos/esfm/ledstorm.fur Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
demos/esfm/pcbend.fur Normal file

Binary file not shown.

BIN
demos/esfm/sticker1.fur Normal file

Binary file not shown.

BIN
demos/esfm/synthy.fur Normal file

Binary file not shown.

BIN
demos/esfm/wack.fur Normal file

Binary file not shown.

BIN
demos/esfm/x_evil_soul.fur Normal file

Binary file not shown.

BIN
demos/gameboy/On_Hold.fur Normal file

Binary file not shown.

Binary file not shown.

BIN
demos/gameboy/cheap.fur Normal file

Binary file not shown.

Binary file not shown.

BIN
demos/gameboy/dtect.fur Normal file

Binary file not shown.

BIN
demos/gameboy/freedom.fur Normal file

Binary file not shown.

Binary file not shown.

BIN
demos/gameboy/lagtrain.fur Normal file

Binary file not shown.

BIN
demos/gameboy/minos.fur Normal file

Binary file not shown.

BIN
demos/gameboy/spreadtro.fur Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
demos/genesis/darkstar.fur Normal file

Binary file not shown.

Binary file not shown.

BIN
demos/genesis/mm5_boss.fur Normal file

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show more