diff --git a/CMakeLists.txt b/CMakeLists.txt index d32f4bf..408aecc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -82,6 +82,9 @@ set(HEADERS include/amuse/DSPCodec.hpp include/amuse/N64MusyXCodec.hpp include/amuse/VolumeTable.hpp) +if(NX) + list(APPEND HEADERS include/switch_math.hpp) +endif() unset(EXTRAS) if(TARGET boo) diff --git a/README.md b/README.md index b55a69a..0cb252a 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,51 @@ other audio applications to route their MIDI messages to. This enables tracker, drum machine, and DAW applications to produce sampled audio using Amuse directly. +### Converter Usage + +`amuseconv [gcn|n64|pc]` + +**Note:** `amuseconv` currently only supports SNG-to-MIDI conversion and vice-versa. To batch-extract MIDIs from one of the game files listed below, run `amuseconv ` + +### Player Usage + +`amuseplay []` +— _or_ — +Drag-n-drop data file on amuseplay executable _(Windows and many freedesktop file managers support this)_ + +### Song Renderer Usage + +`amuserender [] [-r ] [-v ]` +— _or_ — +Drag-n-drop data file on amuseplay executable _(Windows and many freedesktop file managers support this)_ + +**Note:** .wav file will be emitted at `-.wav`. If `-r` option is not specified, rate will default to 32KHz + +### Currently Supported Game Containers +- _Indiana Jones and the Infernal Machine_ (N64) `N64 ROM file` +- _Metroid Prime_ (GCN) `AudioGrp.pak` `MidiData.pak` + - _Pass `AudioGrp.pak MidiData.pak` for listening to SongGroup 53 (sequenced ship sounds)_ + - _Pass `AudioGrp.pak` for listening to any SFXGroup_ +- _Metroid Prime 2: Echoes_ (GCN) `AudioGrp.pak` +- _Paper Mario: The Thousand Year Door_ (GCN) `pmario.proj` `pmario.slib` + - _Pass `pmario.proj pmario.slib` for listening to SongGroups (sequenced SFX events)_ + - _Pass `pmario.proj` for listening to any SFXGroup_ +- _Star Fox Adventures_ (GCN) `starfoxm.pro` `starfoxs.pro` `midi.wad` + - _Pass `starfoxm.pro midi.wad` for listening to SongGroup 0 songs only (music)_ + - _Pass `starfoxs.pro midi.wad` for listening to other SongGroups (sequenced ambience)_ + - _Pass `starfoxs.pro` for listening to any SFXGroup_ +- _Star Wars Episode I: Battle for Naboo_ (N64) `N64 ROM file` +- _Star Wars: Rogue Squadron_ (N64) `N64 ROM file` (PC) `data.dat` +- _Star Wars Rogue Squadron II: Rogue Leader_ (GCN) `data.dat` +- _Star Wars Rogue Squadron III: Rebel Strike_ (GCN) `data.dat` +- Any other game with raw `.proj` `.pool` `.sdir` `.samp` files + - _Pass any one of them to Amuse, all in the same directory_ + +### Windows 7 Compatibility + +Installing the MSVC++ 2015 runtime may be required if you haven't already installed/updated it: +https://www.microsoft.com/en-us/download/details.aspx?id=48145 + #### Library The Amuse API exposes full interactivity between a client application diff --git a/include/amuse/Common.hpp b/include/amuse/Common.hpp index 4d6f621..2e02e69 100644 --- a/include/amuse/Common.hpp +++ b/include/amuse/Common.hpp @@ -25,6 +25,12 @@ #include #endif +#if __SWITCH__ +#undef _S + +#include "switch_math.hpp" +#endif + #undef min #undef max diff --git a/include/amuse/DSPCodec.hpp b/include/amuse/DSPCodec.hpp index 157a838..9705093 100644 --- a/include/amuse/DSPCodec.hpp +++ b/include/amuse/DSPCodec.hpp @@ -2,6 +2,7 @@ #define _DSPCODEC_h #include +#include static inline int16_t DSPSampClamp(int32_t val) { diff --git a/include/switch_math.hpp b/include/switch_math.hpp new file mode 100644 index 0000000..efbca3a --- /dev/null +++ b/include/switch_math.hpp @@ -0,0 +1,22 @@ +#ifndef SWITCH_MATH_HPP +#define SWITCH_MATH_HPP + +/* Properly forward math defines to std:: */ +#ifdef __SWITCH__ + +#include +#include + +#undef exp2 +#undef log2 +#undef fabs + +namespace std +{ + using ::exp2; + using ::log2; + using ::fabs; +} +#endif + +#endif //TEST_SWITCH_MATH_HPP diff --git a/lib/AudioGroupSampleDirectory.cpp b/lib/AudioGroupSampleDirectory.cpp index 22564e0..3019cdd 100644 --- a/lib/AudioGroupSampleDirectory.cpp +++ b/lib/AudioGroupSampleDirectory.cpp @@ -612,6 +612,8 @@ static void SetAudioFileTime(const SystemString& path, const Sstat& stat) #else #if __APPLE__ struct timespec times[] = { stat.st_atimespec, stat.st_mtimespec }; +#elif __SWITCH__ + struct timespec times[] = { stat.st_atime, stat.st_mtime }; #else struct timespec times[] = { stat.st_atim, stat.st_mtim }; #endif diff --git a/lib/Common.cpp b/lib/Common.cpp index 869f6bc..822ff2b 100644 --- a/lib/Common.cpp +++ b/lib/Common.cpp @@ -32,6 +32,8 @@ bool Copy(const SystemChar* from, const SystemChar* to) return true; #if __APPLE__ struct timespec times[] = { theStat.st_atimespec, theStat.st_mtimespec }; +#elif __SWITCH__ + struct timespec times[] = { theStat.st_atime, theStat.st_mtime }; #else struct timespec times[] = { theStat.st_atim, theStat.st_mtim }; #endif diff --git a/lib/ContainerRegistry.cpp b/lib/ContainerRegistry.cpp index 33b6ce0..4f6f654 100644 --- a/lib/ContainerRegistry.cpp +++ b/lib/ContainerRegistry.cpp @@ -9,6 +9,64 @@ #include #include +#if __SWITCH__ +/*- + * Copyright (c) 2005 Pascal Gloor + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +static void * +memmem(const void *l, size_t l_len, const void *s, size_t s_len) +{ + char *cur, *last; + const char *cl = (const char *)l; + const char *cs = (const char *)s; + + /* we need something to compare */ + if (l_len == 0 || s_len == 0) + return NULL; + + /* "s" must be smaller or equal to "l" */ + if (l_len < s_len) + return NULL; + + /* special case where s_len == 1 */ + if (s_len == 1) + return memchr(l, (int)*cs, l_len); + + /* the last position where its possible to find "s" in "l" */ + last = (char *)cl + l_len - s_len; + + for (cur = (char *)cl; cur <= last; cur++) + if (cur[0] == cs[0] && memcmp(cur, cs, s_len) == 0) + return cur; + + return NULL; +} +#endif + #if _WIN32 #define WIN32_LEAN_AND_MEAN #include diff --git a/lib/DSPCodec.cpp b/lib/DSPCodec.cpp index 9ada90f..9967da4 100644 --- a/lib/DSPCodec.cpp +++ b/lib/DSPCodec.cpp @@ -1,5 +1,10 @@ #include "amuse/DSPCodec.hpp" #include +#include + +#if __SWITCH__ +#include "switch_math.hpp" +#endif #undef min #undef max