From 43bbe994a98a90a894a8d23059025bf027af5c65 Mon Sep 17 00:00:00 2001 From: dbalsom Date: Sun, 30 Jun 2024 14:38:35 -0400 Subject: [PATCH] Working example --- .idea/.gitignore | 5 - Cargo.lock | 808 +++++++++++++++++++++- Cargo.toml | 10 +- build.rs | 34 +- examples/play_tune/{src => }/Cargo.lock | 0 examples/play_tune/Cargo.toml | 12 + examples/play_tune/src/Cargo.toml | 7 - examples/play_tune/src/main.rs | 154 ++++- examples/play_tune/src/music_player.rs | 402 +++++++++++ examples/play_tune/src/opl.rs | 162 ++++- examples/play_tune/src/opl_instruments.rs | 134 ++++ src/lib.rs | 227 +++++- src/nuked-opl3/opl3.c | 14 + test.raw | Bin 0 -> 192000 bytes 14 files changed, 1862 insertions(+), 107 deletions(-) delete mode 100644 .idea/.gitignore rename examples/play_tune/{src => }/Cargo.lock (100%) create mode 100644 examples/play_tune/Cargo.toml delete mode 100644 examples/play_tune/src/Cargo.toml create mode 100644 examples/play_tune/src/music_player.rs create mode 100644 examples/play_tune/src/opl_instruments.rs create mode 100644 test.raw diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index b58b603..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ diff --git a/Cargo.lock b/Cargo.lock index 81348af..4472eac 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11,13 +11,61 @@ dependencies = [ "memchr", ] +[[package]] +name = "alsa" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37fe60779335388a88c01ac6c3be40304d1e349de3ada3b15f7808bb90fa9dce" +dependencies = [ + "alsa-sys", + "bitflags 2.6.0", + "libc", +] + +[[package]] +name = "alsa-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "autocfg" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + [[package]] name = "bindgen" version = "0.69.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" dependencies = [ - "bitflags", + "bitflags 2.6.0", "cexpr", "clang-sys", "itertools", @@ -34,17 +82,58 @@ dependencies = [ "which", ] +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bytemuck" +version = "1.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" + [[package]] name = "cc" version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac367972e516d45567c7eafc73d24e1c193dcf200a8d94e9db7b3d38b349572d" +dependencies = [ + "jobserver", + "libc", + "once_cell", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" [[package]] name = "cexpr" @@ -61,6 +150,20 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chrono" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-targets 0.52.5", +] + [[package]] name = "clang-sys" version = "1.8.1" @@ -72,12 +175,113 @@ dependencies = [ "libloading", ] +[[package]] +name = "claxon" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bfbf56724aa9eca8afa4fcfadeb479e722935bb2a0900c2d37e0cc477af0688" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "coreaudio-rs" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "321077172d79c662f64f5071a03120748d5bb652f5231570141be24cfcd2bace" +dependencies = [ + "bitflags 1.3.2", + "core-foundation-sys", + "coreaudio-sys", +] + +[[package]] +name = "coreaudio-sys" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f01585027057ff5f0a5bf276174ae4c1594a2c5bde93d5f46a016d76270f5a9" +dependencies = [ + "bindgen", +] + +[[package]] +name = "cpal" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "873dab07c8f743075e57f524c583985fbaf745602acbe916a01539364369a779" +dependencies = [ + "alsa", + "core-foundation-sys", + "coreaudio-rs", + "dasp_sample", + "jni", + "js-sys", + "libc", + "mach2", + "ndk", + "ndk-context", + "oboe", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "dasp_sample" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" + [[package]] name = "either" version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +[[package]] +name = "encoding_rs" +version = "0.8.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + [[package]] name = "errno" version = "0.3.9" @@ -85,7 +289,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -94,6 +298,12 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + [[package]] name = "heck" version = "0.5.0" @@ -106,7 +316,46 @@ version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" dependencies = [ - "windows-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "hound" +version = "3.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62adaabb884c94955b19907d60019f4e145d091c75345379e70d1ee696f7854f" + +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core 0.52.0", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "indexmap" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +dependencies = [ + "equivalent", + "hashbrown", ] [[package]] @@ -118,6 +367,46 @@ dependencies = [ "either", ] +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -130,6 +419,17 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +[[package]] +name = "lewton" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "777b48df9aaab155475a83a7df3070395ea1ac6902f5cd062b8f2b028075c030" +dependencies = [ + "byteorder", + "ogg", + "tinyvec", +] + [[package]] name = "libc" version = "0.2.155" @@ -143,7 +443,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e310b3a6b5907f99202fcdb4960ff45b93735d7c7d96b760fcff8db2dc0e103d" dependencies = [ "cfg-if", - "windows-targets", + "windows-targets 0.52.5", ] [[package]] @@ -158,6 +458,15 @@ version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +[[package]] +name = "mach2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" +dependencies = [ + "libc", +] + [[package]] name = "memchr" version = "2.7.4" @@ -170,6 +479,35 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +[[package]] +name = "ndk" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" +dependencies = [ + "bitflags 2.6.0", + "jni-sys", + "log", + "ndk-sys", + "num_enum", + "thiserror", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.5.0+25.2.9519653" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" +dependencies = [ + "jni-sys", +] + [[package]] name = "nom" version = "7.1.3" @@ -180,6 +518,79 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "oboe" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8b61bebd49e5d43f5f8cc7ee2891c16e0f41ec7954d36bcb6c14c5e0de867fb" +dependencies = [ + "jni", + "ndk", + "ndk-context", + "num-derive", + "num-traits", + "oboe-sys", +] + +[[package]] +name = "oboe-sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8bb09a4a2b1d668170cfe0a7d5bc103f8999fb316c98099b6a9939c9f2e79d" +dependencies = [ + "cc", +] + +[[package]] +name = "ogg" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6951b4e8bf21c8193da321bcce9c9dd2e13c858fe078bf9054a288b419ae5d6e" +dependencies = [ + "byteorder", +] + [[package]] name = "once_cell" version = "1.19.0" @@ -188,13 +599,30 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opl3-rs" -version = "0.1.1" +version = "0.1.2" dependencies = [ "bindgen", "cc", "heck", ] +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + +[[package]] +name = "play_tune" +version = "0.1.2" +dependencies = [ + "chrono", + "crossbeam-channel", + "opl3-rs", + "rodio", + "timer", +] + [[package]] name = "prettyplease" version = "0.2.20" @@ -205,6 +633,15 @@ dependencies = [ "syn", ] +[[package]] +name = "proc-macro-crate" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +dependencies = [ + "toml_edit", +] + [[package]] name = "proc-macro2" version = "1.0.86" @@ -252,6 +689,20 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +[[package]] +name = "rodio" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1fceb9d127d515af1586d8d0cc601e1245bdb0af38e75c865a156290184f5b3" +dependencies = [ + "claxon", + "cpal", + "hound", + "lewton", + "symphonia", + "thiserror", +] + [[package]] name = "rustc-hash" version = "1.1.0" @@ -264,11 +715,20 @@ version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ - "bitflags", + "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", ] [[package]] @@ -277,6 +737,55 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "symphonia" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "815c942ae7ee74737bb00f965fa5b5a2ac2ce7b6c01c0cc169bbeaf7abd5f5a9" +dependencies = [ + "lazy_static", + "symphonia-bundle-mp3", + "symphonia-core", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-bundle-mp3" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c01c2aae70f0f1fb096b6f0ff112a930b1fb3626178fba3ae68b09dce71706d4" +dependencies = [ + "lazy_static", + "log", + "symphonia-core", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-core" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "798306779e3dc7d5231bd5691f5a813496dc79d3f56bf82e25789f2094e022c3" +dependencies = [ + "arrayvec", + "bitflags 1.3.2", + "bytemuck", + "lazy_static", + "log", +] + +[[package]] +name = "symphonia-metadata" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc622b9841a10089c5b18e99eb904f4341615d5aa55bbf4eedde1be721a4023c" +dependencies = [ + "encoding_rs", + "lazy_static", + "log", + "symphonia-core", +] + [[package]] name = "syn" version = "2.0.68" @@ -288,12 +797,159 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "thiserror" +version = "1.0.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "timer" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31d42176308937165701f50638db1c31586f183f1aab416268216577aec7306b" +dependencies = [ + "chrono", +] + +[[package]] +name = "tinyvec" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c55115c6fbe2d2bef26eb09ad74bde02d8255476fc0c7b515ef09fbb35742d82" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "toml_datetime" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" + +[[package]] +name = "toml_edit" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow", +] + [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "web-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "which" version = "4.4.2" @@ -306,13 +962,84 @@ dependencies = [ "rustix", ] +[[package]] +name = "winapi-util" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "windows" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" +dependencies = [ + "windows-core 0.54.0", + "windows-targets 0.52.5", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.5", +] + +[[package]] +name = "windows-core" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" +dependencies = [ + "windows-result", + "windows-targets 0.52.5", +] + +[[package]] +name = "windows-result" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +dependencies = [ + "windows-targets 0.52.5", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + [[package]] name = "windows-sys" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets", + "windows-targets 0.52.5", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", ] [[package]] @@ -321,28 +1048,46 @@ version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_aarch64_msvc" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_gnu" version = "0.52.5" @@ -355,26 +1100,59 @@ version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_i686_msvc" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + [[package]] name = "windows_x86_64_gnu" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "windows_x86_64_msvc" version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] diff --git a/Cargo.toml b/Cargo.toml index d139918..0fe2c89 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ name = "opl3-rs" description = "Rust bindings for Nuked-OPL3, a Yamaha OPL3 FM-synthesis chip emulation library." authors = ["Daniel Balsom"] license = "LGPL-2.1" -version = "0.1.1" +version = "0.1.2" edition = "2021" repository = "https://github.com/dbalsom/opl3-rs" keywords = ["OPL", "emulation", "audio", "synthesizer", "retro"] @@ -11,8 +11,14 @@ categories = ["multimedia::audio", "emulators"] build = "build.rs" [build-dependencies] -bindgen= "0.69" +bindgen = "0.69" cc = "1.0" heck = "0.5.0" [dependencies] + + +[workspace] +members = [ + "examples/*", +] \ No newline at end of file diff --git a/build.rs b/build.rs index 2d7422a..7e121b1 100644 --- a/build.rs +++ b/build.rs @@ -1,13 +1,19 @@ use std::env; use std::path::PathBuf; -use heck::ToUpperCamelCase; + use bindgen::callbacks::{EnumVariantValue, ParseCallbacks}; +use heck::ToUpperCamelCase; #[derive(Debug)] struct RenameCallbacks; impl ParseCallbacks for RenameCallbacks { - fn enum_variant_name(&self, _enum_name: Option<&str>, original_variant_name: &str, _variant_value: EnumVariantValue) -> Option { + fn enum_variant_name( + &self, + _enum_name: Option<&str>, + original_variant_name: &str, + _variant_value: EnumVariantValue, + ) -> Option { Some(original_variant_name.to_upper_camel_case()) } @@ -18,10 +24,11 @@ impl ParseCallbacks for RenameCallbacks { fn main() { // The path to the header file + let lib_path = "./src/nuked-opl3/"; let header_path = "./src/nuked-opl3/opl3.h"; - // Tell cargo to invalidate the built crate whenever the wrapper changes - println!("cargo:rerun-if-changed={}", header_path); + // Tell cargo to rerun build.rs when the C library changes + println!("cargo:rerun-if-changed={}", lib_path); let bindings_result = bindgen::Builder::default() .header(header_path) @@ -31,18 +38,12 @@ fn main() { match bindings_result { Ok(bindings) => { - println!("Bindings built successfully!"); - // Write the bindings to the $OUT_DIR/bindings.rs file let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); - println!("Writing bindings to {:?}", out_path.join("bindings.rs")); - match bindings - .write_to_file(out_path.join("bindings.rs")) { - - Ok(_) => println!("Bindings written successfully!"), - Err(e) => panic!("Failed to write bindings: {:?}", e), + if let Err(e) = bindings.write_to_file(out_path.join("bindings.rs")) { + panic!("Failed to write bindings: {:?}", e); } - }, + } Err(e) => panic!("Failed to generate bindings: {:?}", e), } @@ -50,4 +51,9 @@ fn main() { cc::Build::new() .file("./src/nuked-opl3/opl3.c") .compile("opl3"); -} \ No newline at end of file + + // Link the compiled library + println!("cargo:rustc-link-lib=static=opl3"); + + println!("cargo:warning=Ran build.rs..."); +} diff --git a/examples/play_tune/src/Cargo.lock b/examples/play_tune/Cargo.lock similarity index 100% rename from examples/play_tune/src/Cargo.lock rename to examples/play_tune/Cargo.lock diff --git a/examples/play_tune/Cargo.toml b/examples/play_tune/Cargo.toml new file mode 100644 index 0000000..5007ecc --- /dev/null +++ b/examples/play_tune/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "play_tune" +version = "0.1.2" +edition = "2021" +publish = false + +[dependencies] +"opl3-rs" = { path = "../.." } +"rodio" = "0.18" +"chrono" = "0.4" +"timer" = "0.2" +"crossbeam-channel" = "0.5" \ No newline at end of file diff --git a/examples/play_tune/src/Cargo.toml b/examples/play_tune/src/Cargo.toml deleted file mode 100644 index c7d9ee7..0000000 --- a/examples/play_tune/src/Cargo.toml +++ /dev/null @@ -1,7 +0,0 @@ -[package] -name = "play_tune" -version = "0.1.0" -edition = "2021" - -[dependencies] -"rodio" = "0.18" diff --git a/examples/play_tune/src/main.rs b/examples/play_tune/src/main.rs index f7be10b..c298483 100644 --- a/examples/play_tune/src/main.rs +++ b/examples/play_tune/src/main.rs @@ -1,23 +1,153 @@ -//! This is a example program that plays a simple, 3-channel tune via opl3-rs and the rodio audio +//! This is a example program that plays a simple, 3-channel tune via opl3-rs and the `rodio` audio //! library. //! //! Original code by Maarten Janssen (maarten@cheerful.nl) 2016-04-13 //! Most recent version of the library can be found at my GitHub: https://github.com/DhrBaksteen/ArduinoOPL2 //! Hacked for a OPL2LPT test program by pdewacht@gmail.com. +//! Rewritten in Rust by Daniel Balsom for opl3-rs +//! +use std::io::Write; +use std::sync::{Arc, Mutex}; + +use chrono::Duration; +use crossbeam_channel::unbounded; +use rodio::cpal::traits::HostTrait; +use rodio::DeviceTrait; +use timer::Timer; +use crate::music_player::CallbackMessage; +use crate::music_player::MusicPlayer; +use crate::opl::*; +use crate::opl_instruments::*; + +mod music_player; mod opl; +mod opl_instruments; + +const TIMER_FREQ: i64 = 100; // We will set a timer callback at 100Hz fn main() { - println!("Hello, world!"); + let audio_device = rodio::cpal::default_host() + .default_output_device() + .expect("No audio device found."); + + let device_name = audio_device.name().expect("Couldn't get adapter name."); + + let config = audio_device + .default_output_config() + .expect("Couldn't get device configuration."); + + let sample_rate = config.sample_rate().0; + let channels = config.channels() as usize; + let sample_format = config.sample_format().to_string(); + + let (_stream, stream_handle) = + rodio::OutputStream::try_from_device(&audio_device).expect("Couldn't open rodio stream."); + + println!( + "Opened audio device: {}, sample rate: {}, channels: {}, format: {:?}", + device_name, sample_rate, channels, sample_format + ); + + play_music(sample_rate, stream_handle); + //play_note(sample_rate, stream_handle); } -struct Tune { - data: Vec, - channel: i32, - octave: i32, - note_duration: i32, - note_length: i32, - unsigned long nextNoteTime; - unsigned long releaseTime; - int index; -}; +#[allow(dead_code)] +fn play_note(sample_rate: u32, stream_handle: rodio::OutputStreamHandle) { + // Create a stereo buffer one second long. (Length = Sample rate * 2 channels) + let mut samples = vec![0; 2 * sample_rate as usize]; + + // Create the music player. We don't use this channel in this example. + let (s, _r) = unbounded(); + let mut player = MusicPlayer::new(sample_rate, s); + + // Start the player and play a single note, leaving it sustained. + player.setup(); + player.play_test_note(&OPL_INSTRUMENT_ORGAN1, NOTE_C, 2); + + // Generate 1 second of samples. + player.generate_direct(&mut samples); + + // Write buf to file + let mut file = std::fs::File::create("test.raw").unwrap(); + for sample in &samples { + file.write(&sample.to_le_bytes()).unwrap(); + } + + // Convert samples to f32. + let channel_samples: Vec = samples + .iter_mut() + .map(|c| *c as f32 / i16::MAX as f32) + .collect(); + + for sample in &channel_samples[1000..2000] { + println!("Sample: {}", sample); + } + + println!("Got {} samples", channel_samples.len()); + let samples_buf = rodio::buffer::SamplesBuffer::new(2, sample_rate, channel_samples); + + stream_handle + .play_raw(samples_buf) + .expect("Couldn't play sound"); + + std::thread::sleep(std::time::Duration::from_secs(1)); +} + +fn play_music(sample_rate: u32, stream_handle: rodio::OutputStreamHandle) { + // Create a channel to receive the audio samples as they are generated by the timer callback. + let (s, r) = unbounded(); + + // Create the music player. + let mut player = MusicPlayer::new(sample_rate, s); + // Start the player + player.setup(); + // Wrap the player in an Arc> so we can share it with the timer callback. + let player_arc = Arc::new(Mutex::new(player)); + + let sink = rodio::Sink::try_new(&stream_handle).expect("Couldn't create sink!"); + + let freq_duration = Duration::milliseconds(1000 / TIMER_FREQ); + let timer = Timer::new(); + + // Set up the timer callback. The result of schedule_repeating is saved to a guard variable to + // determine the callback's lifetime. + let _guard = { + timer.schedule_repeating(freq_duration, move || { + let mut player_lock = player_arc.lock().unwrap_or_else(|e| { + eprintln!("Error locking player: {:?}", e); + // exit to os + std::process::exit(1); + }); + player_lock.timer_callback(); + }) + }; + + // Start playing the sink. + sink.play(); + + // Loop and receive messages/samples from the callback. + let mut end_playback = false; + while !end_playback { + let message = r.recv().unwrap_or_else(|e| { + eprintln!("Error receiving channel message: {:?}", e); + // exit to os + CallbackMessage::Error + }); + match message { + CallbackMessage::Error | CallbackMessage::EndPlayback => { + end_playback = true; + } + CallbackMessage::HaveSamples(samples) => { + let channel_samples: Vec = samples + .iter() + .map(|c| *c as f32 / i16::MAX as f32) + .collect(); + + let buf = rodio::buffer::SamplesBuffer::new(2, sample_rate, channel_samples); + sink.append(buf); + } + } + } +} diff --git a/examples/play_tune/src/music_player.rs b/examples/play_tune/src/music_player.rs new file mode 100644 index 0000000..81ca364 --- /dev/null +++ b/examples/play_tune/src/music_player.rs @@ -0,0 +1,402 @@ +//! This is a example program that plays a simple, 3-channel tune via opl3-rs and the `rodio` audio +//! library. +//! +//! Original code by Maarten Janssen (maarten@cheerful.nl) 2016-04-13 +//! Most recent version of the library can be found at my GitHub: https://github.com/DhrBaksteen/ArduinoOPL2 +//! Hacked for a OPL2LPT test program by pdewacht@gmail.com. +//! Rewritten in Rust by Daniel Balsom for opl3-rs +//! + +use crossbeam_channel::Sender; + +use opl3_rs::Opl3Device; + +use crate::opl::*; +use crate::opl_instruments::{OPL_INSTRUMENT_PIANO1, OplInstrument}; + +const TIMER_FREQ: i64 = 100; // We will set a timer callback at 100Hz +const SONG_LENGTH: u32 = 30; // Length of the song in seconds +const SONG_TIMER_LENGTH: u32 = SONG_LENGTH * TIMER_FREQ as u32; // Length of the song in timer ticks + +const NOTE_DEFS: [u8; 21] = [ + NOTE_A, + NOTE_A - 1, + NOTE_A + 1, + NOTE_B, + NOTE_B - 1, + NOTE_B + 1, + NOTE_C, + 0, + NOTE_C + 1, + NOTE_D, + NOTE_D - 1, + NOTE_D + 1, + NOTE_E, + NOTE_E - 1, + NOTE_E + 1, + NOTE_F, + NOTE_F - 1, + NOTE_F + 1, + NOTE_G, + NOTE_G - 1, + NOTE_G + 1, +]; + +const TUNE_DATA: [&'static str; 3] = [ + "t150m200o5l8egredgrdcerceraagdefefedr4.regredgrdcerceraagdedcr4.ccea>crcrcdfegredgrdcerceraagdedcr4.cro3c2", + "m85o3l8crer
drcrcrcrerdgcrer
drcrcrceger4.rfrafergedrfdcrec
dcdrcrcrcege", + "m85o3l8r4gr4.gr4.er4.err4fr4.gr4.gr4.grr4gr4.er4.er4.frr4gr4>ccr4ccr4dr4.r), +} + +#[derive(Default)] +pub struct TuneData { + data: Vec, + cursor: usize, +} + +impl TuneData { + fn new(data: &str) -> TuneData { + TuneData { + data: data.as_bytes().to_vec(), + cursor: 0, + } + } + + fn index(&self) -> usize { + self.cursor + } + + fn get(&mut self) -> u8 { + if self.cursor >= self.data.len() { + return 0; + } + let result = self.data[self.cursor]; + self.cursor += 1; + return result; + } + + fn peek(&self) -> u8 { + if self.cursor >= self.data.len() { + return 0; + } + return self.data[self.cursor]; + } + + fn peek_next(&self) -> u8 { + if (self.cursor + 1) >= self.data.len() { + return 0; + } + return self.data[self.cursor + 1]; + } + + fn next(&mut self) { + self.cursor += 1; + } + + fn prev(&mut self) { + self.cursor -= 1; + } + + fn reset(&mut self) { + self.cursor = 0; + } +} + +struct Tune { + data: TuneData, + channel: u8, + octave: i32, + note_duration: i32, + note_length: u32, + next_note_time: u32, + release_time: u32, +} + +impl Default for Tune { + fn default() -> Tune { + Tune { + data: TuneData::default(), + channel: 4, + octave: 4, + note_duration: 4, + note_length: 85, + next_note_time: 0, + release_time: 0, + } + } +} + +impl Tune { + fn new(index: usize) -> Tune { + Tune { + channel: index as u8, + data: TuneData::new(TUNE_DATA[index]), + ..Tune::default() + } + } +} + +pub struct MusicPlayer { + tunes: Vec, + tempo: u32, + timer: u32, + sample_buf: Vec, + opl3: Opl3Device, + sender: Sender, + playing: bool, +} + +impl MusicPlayer { + pub fn new(sample_rate: u32, sender: Sender) -> MusicPlayer { + let samples_per_interval = (sample_rate / TIMER_FREQ as u32) as usize; + println!("Samples per interval: {}", samples_per_interval); + MusicPlayer { + tunes: vec![Tune::new(0), Tune::new(1), Tune::new(2)], + tempo: 120, + timer: 0, + sample_buf: vec![0; samples_per_interval * 2], + opl3: Opl3Device::new(sample_rate), + sender, + playing: false, + } + } + + pub fn buffer_len(&self) -> usize { + self.sample_buf.len() + } + + pub fn setup(&mut self) { + self.tempo = 120; + self.opl3.reset(None); + + self.opl3.write_register(0x01, 0x20); // Set WSE=1 + + set_instrument(&mut self.opl3, 0, &OPL_INSTRUMENT_PIANO1); + set_block(&mut self.opl3, 0, 5); + set_instrument(&mut self.opl3, 1, &OPL_INSTRUMENT_PIANO1); + set_block(&mut self.opl3, 1, 4); + set_instrument(&mut self.opl3, 2, &OPL_INSTRUMENT_PIANO1); + set_block(&mut self.opl3, 2, 4); + + self.playing = true; + } + + pub fn play_test_note(&mut self, instrument: &OplInstrument, note: u8, octave: u8) { + set_instrument(&mut self.opl3, 0, instrument); + set_block(&mut self.opl3, 0, octave); + set_key_on(&mut self.opl3, 0, false); + let f = get_note_frequency(&mut self.opl3, 0, 4, NOTE_DEFS[note as usize]); + set_frequency(&mut self.opl3, 0, f); + set_key_on(&mut self.opl3, 0, true); + } + + pub fn generate_direct(&mut self, samples: &mut [i16]) { + self.opl3.generate_samples(samples); + } + + pub fn timer_callback(&mut self) { + //println!("Hello from timer callback! Playing is {:?}", self.playing); + if self.playing { + self.timer += 1; + + if self.timer >= SONG_TIMER_LENGTH { + self.playing = false; + self.sender.send(CallbackMessage::EndPlayback).unwrap(); + return; + } + self.main_loop(); + self.opl3.generate_samples(&mut self.sample_buf); + + /* + let min = self.sample_buf.iter().cloned().fold(i16::MAX, i16::min); + let max = self.sample_buf.iter().cloned().fold(i16::MIN, i16::max); + println!( + "Sending {} samples, min: {}, max: {}, Example: {:?}", + self.sample_buf.len(), + min, + max, + &self.sample_buf[0..16] + ); + */ + + self.sender + .send(CallbackMessage::HaveSamples(self.sample_buf.clone())) + .unwrap(); + } + } + + pub fn get_timer(&self) -> u32 { + self.timer + } + + pub fn main_loop(&mut self) { + //println!("Hello from main_loop()!"); + let mut busy = false; + for i in 0..3 { + if (self.get_timer() >= self.tunes[i].release_time + && get_key_on(&mut self.opl3, self.tunes[i].channel)) + { + //println!("Releasing note."); + set_key_on(&mut self.opl3, self.tunes[i].channel, false); + } + if (self.get_timer() >= self.tunes[i].next_note_time && self.tunes[i].data.peek() != 0) + { + self.parse_tune(i); + } + if (self.tunes[i].data.peek() != 0 || self.get_timer() < self.tunes[i].next_note_time) { + busy = true; + } + } + + if !busy { + // If all tunes are done, reset them. + println!("Resetting music..."); + for i in 0..3 { + self.tunes[i].data.reset(); + self.tunes[i].next_note_time = self.get_timer() + 500; + } + } + } + + fn parse_tune(&mut self, t: usize) { + while (self.tunes[t].data.peek() != 0) { + if (self.tunes[t].data.peek() == b'<' && self.tunes[t].octave > 1) { + // Decrease octave if greater than 1. + self.tunes[t].octave -= 1; + } else if (self.tunes[t].data.peek() == b'>' && self.tunes[t].octave < 7) { + // Increase octave if less than 7. + self.tunes[t].octave += 1; + } else if (self.tunes[t].data.peek() == b'o' + && self.tunes[t].data.peek_next() >= b'1' + && self.tunes[t].data.peek_next() <= b'7') + { + // Set octave. + self.tunes[t].octave = self.tunes[t].data.peek_next() as i32 - 48; + self.tunes[t].data.next(); + } else if (self.tunes[t].data.peek() == b'l') { + // Set default note duration. + self.tunes[t].data.next(); + let duration = self.parse_number(t); + if (duration != 0) { + self.tunes[t].note_duration = duration as i32; + } + } else if (self.tunes[t].data.peek() == b'm') { + // Set note length in percent. + self.tunes[t].data.next(); + self.tunes[t].note_length = self.parse_number(t) as u32; + } else if (self.tunes[t].data.peek() == b't') { + // Set song tempo. + self.tunes[t].data.next(); + self.tempo = self.parse_number(t) as u32; + if self.tempo == 0 { + // Tempo cannot be 0 + self.tempo = 1; + } + } else if (self.tunes[t].data.peek() == b'p' || self.tunes[t].data.peek() == b'r') { + // Pause. + self.tunes[t].data.next(); + self.tunes[t].next_note_time = self.get_timer() + self.parse_duration(t); + break; + } else if (self.tunes[t].data.peek() >= b'a' && self.tunes[t].data.peek() <= b'g') { + // Next character is a note A..G so play it. + self.parse_note(t); + break; + } + + self.tunes[t].data.next(); + } + } + + fn parse_note(&mut self, t: usize) { + // Get index of note in base frequency table. + let note_char = self.tunes[t].data.peek() as char; + let note_idx = self.tunes[t].data.index(); + let mut note: u8 = (self.tunes[t].data.peek() - 97) * 3; + self.tunes[t].data.next(); + + if (self.tunes[t].data.peek() == b'-') { + note += 1; + self.tunes[t].data.next(); + } else if (self.tunes[t].data.peek() == b'+') { + note += 2; + self.tunes[t].data.next(); + } + + // Get duration, set delay and play note. + let duration = self.parse_duration(t); + self.tunes[t].next_note_time = self.get_timer() + duration; + self.tunes[t].release_time = + self.get_timer() + (duration * self.tunes[t].note_length / 100); + + set_key_on(&mut self.opl3, self.tunes[t].channel, false); + let f = get_note_frequency( + &mut self.opl3, + self.tunes[t].channel, + self.tunes[t].octave as u8, + NOTE_DEFS[note as usize], + ); + set_frequency(&mut self.opl3, self.tunes[t].channel, f); + + println!( + "Index: {:05} Next: {:05} Char: {} Note: {:02}, channel: {} octave: {} freq: {:04} timer: {:05} duration: {} length: {} release_time: {}", + note_idx, + self.tunes[t].data.index(), + note_char, + note, + self.tunes[t].channel, + self.tunes[t].octave, + f, + self.get_timer(), + duration, + self.tunes[t].note_length, + self.tunes[t].release_time + ); + set_key_on(&mut self.opl3, self.tunes[t].channel, true); + } + + fn parse_duration(&mut self, t: usize) -> u32 { + let mut duration: u32 = self.parse_number(t) as u32; + if duration == 0 { + duration = self.tunes[t].note_duration as u32; + } + + // See whether we need to double the duration + let base; + if (self.tunes[t].data.peek_next() == b'.') { + self.tunes[t].data.next(); + base = 6; + } else { + base = 4; + } + + if duration == 0 { + duration = 1; + } + // Calculate note duration in timer ticks (0.01s) + let ticks = 6000u32 * base / duration / self.tempo; + return ticks; + } + + fn parse_number(&mut self, t: usize) -> u8 { + let mut number = 0; + if (self.tunes[t].data.peek() != 0 + && self.tunes[t].data.peek() >= b'0' + && self.tunes[t].data.peek() <= b'9') + { + while (self.tunes[t].data.peek() != 0 + && self.tunes[t].data.peek() >= b'0' + && self.tunes[t].data.peek() <= b'9') + { + number = number * 10 + (self.tunes[t].data.get() - 48); + } + self.tunes[t].data.prev() + } + return number; + } +} diff --git a/examples/play_tune/src/opl.rs b/examples/play_tune/src/opl.rs index 942f7c1..7325d94 100644 --- a/examples/play_tune/src/opl.rs +++ b/examples/play_tune/src/opl.rs @@ -1,18 +1,146 @@ +//! Original code by Maarten Janssen (maarten@cheerful.nl) 2016-04-13 +//! Most recent version of the library can be found at my GitHub: https://github.com/DhrBaksteen/ArduinoOPL2 +//! Hacked for a OPL2LPT test program by pdewacht@gmail.com. +//! Rewritten in Rust by Daniel Balsom for opl3-rs +#![allow(dead_code)] -#[repr(u8)] -pub enum OplNotes { - NoteC = 0, - NoteCSharp = 1, - NoteD = 2, - NoteDSharp = 3, - NoteE = 4, - NoteF = 5, - NoteFSharp = 6, - NoteG = 7, - NoteGSharp = 8, - NoteA = 9, - NoteASharp = 10, - NoteB = 11, -} - -pub const OPL_INSTRUMENT_PIANO: [u8; 12] = [ 0x00, 0x33, 0x5A, 0xB2, 0x50, 0x01, 0x00, 0x31, 0x00, 0xB1, 0xF5, 0x01 ]; \ No newline at end of file +use std::cmp; + +use opl3_rs::Opl3Device; + +pub const NOTE_C: u8 = 0; +pub const NOTE_CS: u8 = 1; +pub const NOTE_D: u8 = 2; +pub const NOTE_DS: u8 = 3; +pub const NOTE_E: u8 = 4; +pub const NOTE_F: u8 = 5; +pub const NOTE_FS: u8 = 6; +pub const NOTE_G: u8 = 7; +pub const NOTE_GS: u8 = 8; +pub const NOTE_A: u8 = 9; +pub const NOTE_AS: u8 = 10; +pub const NOTE_B: u8 = 11; + +pub const OPL_INSTRUMENT_BASE_REGS: [u16; 6] = [0x20, 0x40, 0x60, 0x80, 0xE0, 0xC0]; +pub const OPL_OFFSET: [[u16; 9]; 2] = [ + [0x00, 0x01, 0x02, 0x08, 0x09, 0x0A, 0x10, 0x11, 0x12], /* initializers for operator 0 */ + [0x03, 0x04, 0x05, 0x0B, 0x0C, 0x0D, 0x13, 0x14, 0x15], /* initializers for operator 1 */ +]; +pub const OPL_NOTE_FREQUENCIES: [u32; 12] = [ + 26163, 27718, // C, C# + 29366, 31113, // D, D# + 32963, // E + 34923, 36999, // F, F# + 39200, 41530, // G, G# + 44000, 46616, // A, A# + 49388, // B +]; +pub const OPL_F_INTERVALS: [u32; 8] = [48, 95, 190, 379, 759, 1517, 3034, 6069]; + +#[inline] +pub fn get_ch(channel: usize) -> usize { + cmp::max(0x00, cmp::min(channel, 0x08)) +} + +pub fn get_register_offset(channel: usize, operator: usize) -> u16 { + let opr = operator & 1; + let ch = get_ch(channel); + OPL_OFFSET[opr][ch] +} + +pub fn set_instrument(opl3: &mut Opl3Device, channel: usize, instrument: &[u8; 12]) { + set_waveform_select(opl3, true); + for (i, byte) in instrument.iter().skip(1).enumerate() { + opl3.write_register( + OPL_INSTRUMENT_BASE_REGS[i % 6] + get_register_offset(channel, (i > 5) as usize), + *byte, + ); + } +} + +pub fn set_waveform_select(opl3: &mut Opl3Device, enable: bool) { + if enable { + opl3.write_register(0x01, opl3.read_register(0x01) | 0x20); + } else { + opl3.write_register(0x01, opl3.read_register(0x01) & 0xDF); + } +} + +/// Return the frequency block of the given channel. +pub fn get_block(opl3: &mut Opl3Device, channel: u8) -> u8 { + let offset = cmp::max(0x00, cmp::min(channel as u16, 0x08)); + return (opl3.read_register(0xB0 + offset) & 0x1C) >> 2; +} + +/// Set frequency block for the given channel. +/// 0x00 is lowest, 0x07 is highest. This determines the frequency interval between notes. +/// 0 - 0.048 Hz, Range: 0.047 Hz -> 48.503 Hz +/// 1 - 0.095 Hz, Range: 0.094 Hz -> 97.006 Hz +/// 2 - 0.190 Hz, Range: 0.189 Hz -> 194.013 Hz +/// 3 - 0.379 Hz, Range: 0.379 Hz -> 388.026 Hz +/// 4 - 0.759 Hz, Range: 0.758 Hz -> 776.053 Hz +/// 5 - 1.517 Hz, Range: 1.517 Hz -> 1552.107 Hz +/// 6 - 3.034 Hz, Range: 3.034 Hz -> 3104.215 Hz +/// 7 - 6.069 Hz, Range: 6.068 Hz -> 6208.431 Hz +pub fn set_block(opl3: &mut Opl3Device, channel: u8, octave: u8) { + let reg: u16 = 0xB0 + cmp::max(0x00, cmp::min(channel as u16, 0x08)); + opl3.write_register( + reg, + (opl3.read_register(reg) & 0xE3) | ((octave & 0x07) << 2), + ); +} + +/// Return whether the voice for the given channel is currently on. +pub fn get_key_on(opl3: &mut Opl3Device, channel: u8) -> bool { + let offset: u16 = cmp::max(0x00, cmp::min(channel as u16, 0x08)); + return (opl3.read_register(0xB0 + offset) & 0x20) != 0; +} + +/// Enable the voice for the given channel. +pub fn set_key_on(opl3: &mut Opl3Device, channel: u8, key_on: bool) { + let reg: u16 = 0xB0 + cmp::max(0x00, cmp::min(channel as u16, 0x08)); + let old_reg = opl3.read_register(reg); + if key_on { + opl3.write_register(reg, old_reg | 0x20); + } else { + opl3.write_register(reg, old_reg & 0xDF); + } +} + +pub fn get_note_frequency(opl3: &mut Opl3Device, channel: u8, octave: u8, note: u8) -> u16 { + let octave = cmp::max(0, cmp::min(octave + (note / 12), 7)); + let interval = OPL_F_INTERVALS[get_block(opl3, channel) as usize]; + let mut freq = OPL_NOTE_FREQUENCIES[(note % 12) as usize] * 10; + + if octave < 4 { + for _i in 0..(4 - octave) { + freq /= 2; + } + } else if octave > 4 { + for _i in 0..(octave - 4) { + freq *= 2; + } + } + + let result = cmp::max(0, cmp::min(freq / interval, 1023)); + return result as u16; +} + +/// Returns the F-number of the given channel. +pub fn get_frequency(opl3: &mut Opl3Device, channel: u8) -> u16 { + let offset: u16 = cmp::max(0x00, cmp::min(channel as u16, 0x08)); + return (((opl3.read_register(0xB0 + offset) & 0x03) as u16) << 8) + | opl3.read_register(0xA0 + offset) as u16; +} + +/// Set the F-number of the given channel. +/// Returns the register number that was written to. +pub fn set_frequency(opl3: &mut Opl3Device, channel: u8, frequency: u16) -> u16 { + let reg = 0xA0 + cmp::max(0x00, cmp::min(channel as u16, 0x08)); + opl3.write_register(reg, (frequency & 0xFF) as u8); + opl3.write_register( + reg + 0x10, + (opl3.read_register(reg + 0x10) & 0xFC) | ((frequency & 0x0300) >> 8) as u8, + ); + return reg; +} diff --git a/examples/play_tune/src/opl_instruments.rs b/examples/play_tune/src/opl_instruments.rs new file mode 100644 index 0000000..5db4ecc --- /dev/null +++ b/examples/play_tune/src/opl_instruments.rs @@ -0,0 +1,134 @@ +//! Original code by Maarten Janssen (maarten@cheerful.nl) 2016-04-13 +//! Most recent version of the library can be found at my GitHub: https://github.com/DhrBaksteen/ArduinoOPL2 +//! Hacked for a OPL2LPT test program by pdewacht@gmail.com. +//! Rewritten in Rust by Daniel Balsom for opl3-rs +#![allow(dead_code)] +#![cfg_attr(rustfmt, rustfmt_skip)] +pub type OplInstrument = [u8; 12]; +pub const OPL_INSTRUMENT_PIANO1: OplInstrument = [ 0x00, 0x33, 0x5A, 0xB2, 0x50, 0x01, 0x00, 0x31, 0x00, 0xB1, 0xF5, 0x01 ]; +pub const OPL_INSTRUMENT_PIANO2: OplInstrument = [ 0x00, 0x31, 0x49, 0xF2, 0x53, 0x07, 0x01, 0x11, 0x03, 0xF1, 0xF5, 0x00 ]; +pub const OPL_INSTRUMENT_PIANO3: OplInstrument = [ 0x00, 0x31, 0x95, 0xD1, 0x83, 0x0D, 0x01, 0x32, 0x03, 0xC1, 0xF5, 0x00 ]; +pub const OPL_INSTRUMENT_HONKTONK: OplInstrument = [ 0x00, 0x34, 0x9B, 0xF3, 0x63, 0x01, 0x01, 0x11, 0x00, 0x92, 0xF5, 0x01 ]; +pub const OPL_INSTRUMENT_EP1: OplInstrument = [ 0x00, 0x27, 0x28, 0xF8, 0xB7, 0x01, 0x02, 0x91, 0x00, 0xF1, 0xF9, 0x00 ]; +pub const OPL_INSTRUMENT_EP2: OplInstrument = [ 0x00, 0x1A, 0x2D, 0xF3, 0xEE, 0x01, 0x01, 0x11, 0x00, 0xF1, 0xF5, 0x00 ]; +pub const OPL_INSTRUMENT_HARPSIC: OplInstrument = [ 0x00, 0x35, 0x95, 0xF2, 0x58, 0x0F, 0x01, 0x32, 0x02, 0x81, 0xF6, 0x01 ]; +pub const OPL_INSTRUMENT_CLAVIC: OplInstrument = [ 0x00, 0x31, 0x85, 0xC9, 0x40, 0x01, 0x00, 0x35, 0x00, 0xC2, 0xB9, 0x01 ]; +pub const OPL_INSTRUMENT_CELESTA: OplInstrument = [ 0x00, 0x09, 0x15, 0xC7, 0x64, 0x08, 0x00, 0x01, 0x05, 0xB2, 0x35, 0x00 ]; +pub const OPL_INSTRUMENT_GLOCK: OplInstrument = [ 0x00, 0x06, 0x03, 0xF4, 0x44, 0x00, 0x01, 0x01, 0x1B, 0xF2, 0x34, 0x00 ]; +pub const OPL_INSTRUMENT_MUSICBOX: OplInstrument = [ 0x00, 0x04, 0x06, 0xA9, 0x24, 0x0A, 0x01, 0x01, 0x01, 0xF5, 0x74, 0x00 ]; +pub const OPL_INSTRUMENT_VIBES: OplInstrument = [ 0x00, 0xD4, 0x00, 0xF6, 0x33, 0x00, 0x00, 0xF1, 0x00, 0x61, 0xE3, 0x00 ]; +pub const OPL_INSTRUMENT_MARIMBA: OplInstrument = [ 0x00, 0xD4, 0x00, 0xF7, 0xE8, 0x04, 0x00, 0xD1, 0x00, 0xA4, 0x64, 0x00 ]; +pub const OPL_INSTRUMENT_XYLO: OplInstrument = [ 0x00, 0x36, 0x16, 0xF7, 0xF7, 0x01, 0x00, 0x31, 0x07, 0xB5, 0xF5, 0x00 ]; +pub const OPL_INSTRUMENT_TUBEBELL: OplInstrument = [ 0x00, 0x03, 0x1B, 0xA2, 0x43, 0x0B, 0x00, 0x00, 0x00, 0xF3, 0x74, 0x00 ]; +pub const OPL_INSTRUMENT_SANTUR: OplInstrument = [ 0x00, 0xC3, 0x8E, 0xF8, 0x35, 0x01, 0x01, 0x11, 0x00, 0xC3, 0x94, 0x01 ]; +pub const OPL_INSTRUMENT_ORGAN1: OplInstrument = [ 0x00, 0xE2, 0x07, 0xF4, 0x1B, 0x06, 0x01, 0xE0, 0x00, 0xF4, 0x0D, 0x01 ]; +pub const OPL_INSTRUMENT_ORGAN2: OplInstrument = [ 0x00, 0xF2, 0x00, 0xF6, 0x2C, 0x04, 0x00, 0xF0, 0x00, 0xF5, 0x0B, 0x01 ]; +pub const OPL_INSTRUMENT_ORGAN3: OplInstrument = [ 0x00, 0xF1, 0x06, 0xB6, 0x15, 0x0A, 0x00, 0xF0, 0x00, 0xBF, 0x07, 0x00 ]; +pub const OPL_INSTRUMENT_PIPEORG: OplInstrument = [ 0x00, 0x22, 0x03, 0x79, 0x16, 0x08, 0x01, 0xE0, 0x00, 0x6D, 0x08, 0x01 ]; +pub const OPL_INSTRUMENT_REEDORG: OplInstrument = [ 0x00, 0x31, 0x27, 0x63, 0x06, 0x01, 0x00, 0x72, 0x00, 0x51, 0x17, 0x01 ]; +pub const OPL_INSTRUMENT_ACORDIAN: OplInstrument = [ 0x00, 0xB4, 0x1D, 0x53, 0x16, 0x0F, 0x01, 0x71, 0x00, 0x51, 0x17, 0x01 ]; +pub const OPL_INSTRUMENT_HARMONIC: OplInstrument = [ 0x00, 0x25, 0x29, 0x97, 0x15, 0x01, 0x00, 0x32, 0x00, 0x53, 0x08, 0x01 ]; +pub const OPL_INSTRUMENT_BANDNEON: OplInstrument = [ 0x00, 0x24, 0x9E, 0x67, 0x15, 0x0F, 0x00, 0x31, 0x00, 0x53, 0x06, 0x01 ]; +pub const OPL_INSTRUMENT_NYLONGT: OplInstrument = [ 0x00, 0x13, 0x27, 0xA3, 0xB4, 0x05, 0x01, 0x31, 0x00, 0xD2, 0xF8, 0x00 ]; +pub const OPL_INSTRUMENT_STEELGT: OplInstrument = [ 0x00, 0x17, 0xA3, 0xF3, 0x32, 0x01, 0x00, 0x11, 0x00, 0xE2, 0xC7, 0x01 ]; +pub const OPL_INSTRUMENT_JAZZGT: OplInstrument = [ 0x00, 0x33, 0x24, 0xD2, 0xC1, 0x0F, 0x01, 0x31, 0x00, 0xF1, 0x9C, 0x00 ]; +pub const OPL_INSTRUMENT_CLEANGT: OplInstrument = [ 0x00, 0x31, 0x05, 0xF8, 0x44, 0x01, 0x00, 0x32, 0x02, 0xF2, 0xC9, 0x01 ]; +pub const OPL_INSTRUMENT_MUTEGT: OplInstrument = [ 0x00, 0x21, 0x09, 0x9C, 0x7B, 0x07, 0x00, 0x02, 0x03, 0x95, 0xFB, 0x00 ]; +pub const OPL_INSTRUMENT_OVERDGT: OplInstrument = [ 0x00, 0x21, 0x84, 0x81, 0x98, 0x07, 0x01, 0x21, 0x04, 0xA1, 0x59, 0x00 ]; +pub const OPL_INSTRUMENT_DISTGT: OplInstrument = [ 0x00, 0xB1, 0x0C, 0x78, 0x43, 0x01, 0x00, 0x22, 0x03, 0x91, 0xFC, 0x03 ]; +pub const OPL_INSTRUMENT_GTHARMS: OplInstrument = [ 0x00, 0x00, 0x0A, 0x82, 0x8C, 0x09, 0x00, 0x08, 0x02, 0xB4, 0xEC, 0x00 ]; +pub const OPL_INSTRUMENT_ACOUBASS: OplInstrument = [ 0x00, 0x21, 0x13, 0xAB, 0x46, 0x01, 0x00, 0x21, 0x00, 0x93, 0xF7, 0x00 ]; +pub const OPL_INSTRUMENT_FINGBASS: OplInstrument = [ 0x00, 0x01, 0x0A, 0xF9, 0x32, 0x01, 0x00, 0x22, 0x04, 0xC1, 0x58, 0x00 ]; +pub const OPL_INSTRUMENT_PICKBASS: OplInstrument = [ 0x00, 0x21, 0x07, 0xFA, 0x77, 0x0B, 0x00, 0x22, 0x02, 0xC3, 0x6A, 0x00 ]; +pub const OPL_INSTRUMENT_FRETLESS: OplInstrument = [ 0x00, 0x21, 0x17, 0x71, 0x57, 0x0B, 0x00, 0x21, 0x00, 0x62, 0x87, 0x00 ]; +pub const OPL_INSTRUMENT_SLAPBAS1: OplInstrument = [ 0x00, 0x25, 0x01, 0xFA, 0x78, 0x07, 0x01, 0x12, 0x00, 0xF3, 0x97, 0x00 ]; +pub const OPL_INSTRUMENT_SLAPBAS2: OplInstrument = [ 0x00, 0x21, 0x03, 0xFA, 0x88, 0x0D, 0x00, 0x13, 0x00, 0xB3, 0x97, 0x00 ]; +pub const OPL_INSTRUMENT_SYNBASS1: OplInstrument = [ 0x00, 0x21, 0x09, 0xF5, 0x7F, 0x09, 0x01, 0x23, 0x04, 0xF3, 0xCC, 0x00 ]; +pub const OPL_INSTRUMENT_SYNBASS2: OplInstrument = [ 0x00, 0x01, 0x10, 0xA3, 0x9B, 0x09, 0x00, 0x01, 0x00, 0x93, 0xAA, 0x00 ]; +pub const OPL_INSTRUMENT_VIOLIN: OplInstrument = [ 0x00, 0xE2, 0x19, 0xF6, 0x29, 0x0D, 0x01, 0xE1, 0x00, 0x78, 0x08, 0x01 ]; +pub const OPL_INSTRUMENT_VIOLA: OplInstrument = [ 0x00, 0xE2, 0x1C, 0xF6, 0x29, 0x0D, 0x01, 0xE1, 0x00, 0x78, 0x08, 0x01 ]; +pub const OPL_INSTRUMENT_CELLO: OplInstrument = [ 0x00, 0x61, 0x19, 0x69, 0x16, 0x0B, 0x01, 0x61, 0x00, 0x54, 0x27, 0x01 ]; +pub const OPL_INSTRUMENT_CONTRAB: OplInstrument = [ 0x00, 0x71, 0x18, 0x82, 0x31, 0x0D, 0x01, 0x32, 0x00, 0x61, 0x56, 0x00 ]; +pub const OPL_INSTRUMENT_TREMSTR: OplInstrument = [ 0x00, 0xE2, 0x23, 0x70, 0x06, 0x0D, 0x01, 0xE1, 0x00, 0x75, 0x16, 0x01 ]; +pub const OPL_INSTRUMENT_PIZZ: OplInstrument = [ 0x00, 0x02, 0x00, 0x88, 0xE6, 0x08, 0x00, 0x61, 0x00, 0xF5, 0xF6, 0x01 ]; +pub const OPL_INSTRUMENT_HARP: OplInstrument = [ 0x00, 0x12, 0x20, 0xF6, 0xD5, 0x0F, 0x01, 0x11, 0x80, 0xF3, 0xE3, 0x00 ]; +pub const OPL_INSTRUMENT_TIMPANI: OplInstrument = [ 0x00, 0x61, 0x0E, 0xF4, 0xF4, 0x01, 0x01, 0x00, 0x00, 0xB5, 0xF5, 0x00 ]; +pub const OPL_INSTRUMENT_STRINGS: OplInstrument = [ 0x00, 0x61, 0x1E, 0x9C, 0x04, 0x0F, 0x01, 0x21, 0x80, 0x71, 0x16, 0x00 ]; +pub const OPL_INSTRUMENT_SLOWSTR: OplInstrument = [ 0x00, 0xA2, 0x2A, 0xC0, 0xD6, 0x0F, 0x02, 0x21, 0x00, 0x30, 0x55, 0x01 ]; +pub const OPL_INSTRUMENT_SYNSTR1: OplInstrument = [ 0x00, 0x61, 0x21, 0x72, 0x35, 0x0F, 0x01, 0x61, 0x00, 0x62, 0x36, 0x01 ]; +pub const OPL_INSTRUMENT_SYNSTR2: OplInstrument = [ 0x00, 0x21, 0x1A, 0x72, 0x23, 0x0F, 0x01, 0x21, 0x02, 0x51, 0x07, 0x00 ]; +pub const OPL_INSTRUMENT_CHOIR: OplInstrument = [ 0x00, 0xE1, 0x16, 0x97, 0x31, 0x09, 0x00, 0x61, 0x00, 0x62, 0x39, 0x00 ]; +pub const OPL_INSTRUMENT_OOHS: OplInstrument = [ 0x00, 0x22, 0xC3, 0x79, 0x45, 0x01, 0x00, 0x21, 0x00, 0x66, 0x27, 0x00 ]; +pub const OPL_INSTRUMENT_SYNVOX: OplInstrument = [ 0x00, 0x21, 0xDE, 0x63, 0x55, 0x01, 0x01, 0x21, 0x00, 0x73, 0x46, 0x00 ]; +pub const OPL_INSTRUMENT_ORCHIT: OplInstrument = [ 0x00, 0x42, 0x05, 0x86, 0xF7, 0x0A, 0x00, 0x50, 0x00, 0x74, 0x76, 0x01 ]; +pub const OPL_INSTRUMENT_TRUMPET: OplInstrument = [ 0x00, 0x31, 0x1C, 0x61, 0x02, 0x0F, 0x00, 0x61, 0x81, 0x92, 0x38, 0x00 ]; +pub const OPL_INSTRUMENT_TROMBONE: OplInstrument = [ 0x00, 0x71, 0x1E, 0x52, 0x23, 0x0F, 0x00, 0x61, 0x02, 0x71, 0x19, 0x00 ]; +pub const OPL_INSTRUMENT_TUBA: OplInstrument = [ 0x00, 0x21, 0x1A, 0x76, 0x16, 0x0F, 0x00, 0x21, 0x01, 0x81, 0x09, 0x00 ]; +pub const OPL_INSTRUMENT_MUTETRP: OplInstrument = [ 0x00, 0x25, 0x28, 0x89, 0x2C, 0x07, 0x02, 0x20, 0x00, 0x83, 0x4B, 0x02 ]; +pub const OPL_INSTRUMENT_FRHORN: OplInstrument = [ 0x00, 0x21, 0x1F, 0x79, 0x16, 0x09, 0x00, 0xA2, 0x05, 0x71, 0x59, 0x00 ]; +pub const OPL_INSTRUMENT_BRASS1: OplInstrument = [ 0x00, 0x21, 0x19, 0x87, 0x16, 0x0F, 0x00, 0x21, 0x03, 0x82, 0x39, 0x00 ]; +pub const OPL_INSTRUMENT_SYNBRAS1: OplInstrument = [ 0x00, 0x21, 0x17, 0x75, 0x35, 0x0F, 0x00, 0x22, 0x82, 0x84, 0x17, 0x00 ]; +pub const OPL_INSTRUMENT_SYNBRAS2: OplInstrument = [ 0x00, 0x21, 0x22, 0x62, 0x58, 0x0F, 0x00, 0x21, 0x02, 0x72, 0x16, 0x00 ]; +pub const OPL_INSTRUMENT_SOPSAX: OplInstrument = [ 0x00, 0xB1, 0x1B, 0x59, 0x07, 0x01, 0x01, 0xA1, 0x00, 0x7B, 0x0A, 0x00 ]; +pub const OPL_INSTRUMENT_ALTOSAX: OplInstrument = [ 0x00, 0x21, 0x16, 0x9F, 0x04, 0x0B, 0x00, 0x21, 0x00, 0x85, 0x0C, 0x01 ]; +pub const OPL_INSTRUMENT_TENSAX: OplInstrument = [ 0x00, 0x21, 0x0F, 0xA8, 0x20, 0x0D, 0x00, 0x23, 0x00, 0x7B, 0x0A, 0x01 ]; +pub const OPL_INSTRUMENT_BARISAX: OplInstrument = [ 0x00, 0x21, 0x0F, 0x88, 0x04, 0x09, 0x00, 0x26, 0x00, 0x79, 0x18, 0x01 ]; +pub const OPL_INSTRUMENT_OBOE: OplInstrument = [ 0x00, 0x31, 0x18, 0x8F, 0x05, 0x01, 0x00, 0x32, 0x01, 0x73, 0x08, 0x00 ]; +pub const OPL_INSTRUMENT_ENGLHORN: OplInstrument = [ 0x00, 0xA1, 0x0A, 0x8C, 0x37, 0x01, 0x01, 0x24, 0x04, 0x77, 0x0A, 0x00 ]; +pub const OPL_INSTRUMENT_BASSOON: OplInstrument = [ 0x00, 0x31, 0x04, 0xA8, 0x67, 0x0B, 0x00, 0x75, 0x00, 0x51, 0x19, 0x00 ]; +pub const OPL_INSTRUMENT_CLARINET: OplInstrument = [ 0x00, 0xA2, 0x1F, 0x77, 0x26, 0x01, 0x01, 0x21, 0x01, 0x74, 0x09, 0x00 ]; +pub const OPL_INSTRUMENT_PICCOLO: OplInstrument = [ 0x00, 0xE1, 0x07, 0xB8, 0x94, 0x01, 0x01, 0x21, 0x01, 0x63, 0x28, 0x00 ]; +pub const OPL_INSTRUMENT_FLUTE1: OplInstrument = [ 0x00, 0xA1, 0x93, 0x87, 0x59, 0x01, 0x00, 0xE1, 0x00, 0x65, 0x0A, 0x00 ]; +pub const OPL_INSTRUMENT_RECORDER: OplInstrument = [ 0x00, 0x22, 0x10, 0x9F, 0x38, 0x01, 0x00, 0x61, 0x00, 0x67, 0x29, 0x00 ]; +pub const OPL_INSTRUMENT_PANFLUTE: OplInstrument = [ 0x00, 0xE2, 0x0D, 0x88, 0x9A, 0x01, 0x01, 0x21, 0x00, 0x67, 0x09, 0x00 ]; +pub const OPL_INSTRUMENT_BOTTLEB: OplInstrument = [ 0x00, 0xA2, 0x10, 0x98, 0x94, 0x0F, 0x00, 0x21, 0x01, 0x6A, 0x28, 0x00 ]; +pub const OPL_INSTRUMENT_SHAKU: OplInstrument = [ 0x00, 0xF1, 0x1C, 0x86, 0x26, 0x0F, 0x00, 0xF1, 0x00, 0x55, 0x27, 0x00 ]; +pub const OPL_INSTRUMENT_WHISTLE: OplInstrument = [ 0x00, 0xE1, 0x3F, 0x9F, 0x09, 0x00, 0x00, 0xE1, 0x00, 0x6F, 0x08, 0x00 ]; +pub const OPL_INSTRUMENT_OCARINA: OplInstrument = [ 0x00, 0xE2, 0x3B, 0xF7, 0x19, 0x01, 0x00, 0x21, 0x00, 0x7A, 0x07, 0x00 ]; +pub const OPL_INSTRUMENT_SQUARWAV: OplInstrument = [ 0x00, 0x22, 0x1E, 0x92, 0x0C, 0x0F, 0x00, 0x61, 0x06, 0xA2, 0x0D, 0x00 ]; +pub const OPL_INSTRUMENT_SAWWAV: OplInstrument = [ 0x00, 0x21, 0x15, 0xF4, 0x22, 0x0F, 0x01, 0x21, 0x00, 0xA3, 0x5F, 0x00 ]; +pub const OPL_INSTRUMENT_SYNCALLI: OplInstrument = [ 0x00, 0xF2, 0x20, 0x47, 0x66, 0x03, 0x01, 0xF1, 0x00, 0x42, 0x27, 0x00 ]; +pub const OPL_INSTRUMENT_CHIFLEAD: OplInstrument = [ 0x00, 0x61, 0x19, 0x88, 0x28, 0x0F, 0x00, 0x61, 0x05, 0xB2, 0x49, 0x00 ]; +pub const OPL_INSTRUMENT_CHARANG: OplInstrument = [ 0x00, 0x21, 0x16, 0x82, 0x1B, 0x01, 0x00, 0x23, 0x00, 0xB2, 0x79, 0x01 ]; +pub const OPL_INSTRUMENT_SOLOVOX: OplInstrument = [ 0x00, 0x21, 0x00, 0xCA, 0x93, 0x01, 0x00, 0x22, 0x00, 0x7A, 0x1A, 0x00 ]; +pub const OPL_INSTRUMENT_FIFTHSAW: OplInstrument = [ 0x00, 0x23, 0x00, 0x92, 0xC9, 0x08, 0x01, 0x22, 0x00, 0x82, 0x28, 0x01 ]; +pub const OPL_INSTRUMENT_BASSLEAD: OplInstrument = [ 0x00, 0x21, 0x1D, 0xF3, 0x7B, 0x0F, 0x00, 0x22, 0x02, 0xC3, 0x5F, 0x00 ]; +pub const OPL_INSTRUMENT_FANTASIA: OplInstrument = [ 0x00, 0xE1, 0x00, 0x81, 0x25, 0x00, 0x01, 0xA6, 0x86, 0xC4, 0x95, 0x01 ]; +pub const OPL_INSTRUMENT_WARMPAD: OplInstrument = [ 0x00, 0x21, 0x27, 0x31, 0x01, 0x0F, 0x00, 0x21, 0x00, 0x44, 0x15, 0x00 ]; +pub const OPL_INSTRUMENT_POLYSYN: OplInstrument = [ 0x00, 0x60, 0x14, 0x83, 0x35, 0x0D, 0x02, 0x61, 0x00, 0xD1, 0x06, 0x00 ]; +pub const OPL_INSTRUMENT_SPACEVOX: OplInstrument = [ 0x00, 0xE1, 0x5C, 0xD3, 0x01, 0x01, 0x01, 0x62, 0x00, 0x82, 0x37, 0x00 ]; +pub const OPL_INSTRUMENT_BOWEDGLS: OplInstrument = [ 0x00, 0x28, 0x38, 0x34, 0x86, 0x01, 0x02, 0x21, 0x00, 0x41, 0x35, 0x00 ]; +pub const OPL_INSTRUMENT_METALPAD: OplInstrument = [ 0x00, 0x24, 0x12, 0x52, 0xF3, 0x05, 0x01, 0x23, 0x02, 0x32, 0xF5, 0x01 ]; +pub const OPL_INSTRUMENT_HALOPAD: OplInstrument = [ 0x00, 0x61, 0x1D, 0x62, 0xA6, 0x0B, 0x00, 0xA1, 0x00, 0x61, 0x26, 0x00 ]; +pub const OPL_INSTRUMENT_SWEEPPAD: OplInstrument = [ 0x00, 0x22, 0x0F, 0x22, 0xD5, 0x0B, 0x01, 0x21, 0x84, 0x3F, 0x05, 0x01 ]; +pub const OPL_INSTRUMENT_ICERAIN: OplInstrument = [ 0x00, 0xE3, 0x1F, 0xF9, 0x24, 0x01, 0x00, 0x31, 0x01, 0xD1, 0xF6, 0x00 ]; +pub const OPL_INSTRUMENT_SOUNDTRK: OplInstrument = [ 0x00, 0x63, 0x00, 0x41, 0x55, 0x06, 0x01, 0xA2, 0x00, 0x41, 0x05, 0x01 ]; +pub const OPL_INSTRUMENT_CRYSTAL: OplInstrument = [ 0x00, 0xC7, 0x25, 0xA7, 0x65, 0x01, 0x01, 0xC1, 0x05, 0xF3, 0xE4, 0x00 ]; +pub const OPL_INSTRUMENT_ATMOSPH: OplInstrument = [ 0x00, 0xE3, 0x19, 0xF7, 0xB7, 0x01, 0x01, 0x61, 0x00, 0x92, 0xF5, 0x01 ]; +pub const OPL_INSTRUMENT_BRIGHT: OplInstrument = [ 0x00, 0x66, 0x9B, 0xA8, 0x44, 0x0F, 0x00, 0x41, 0x04, 0xF2, 0xE4, 0x01 ]; +pub const OPL_INSTRUMENT_GOBLIN: OplInstrument = [ 0x00, 0x61, 0x20, 0x22, 0x75, 0x0D, 0x00, 0x61, 0x00, 0x45, 0x25, 0x00 ]; +pub const OPL_INSTRUMENT_ECHODROP: OplInstrument = [ 0x00, 0xE1, 0x21, 0xF6, 0x84, 0x0F, 0x00, 0xE1, 0x01, 0xA3, 0x36, 0x00 ]; +pub const OPL_INSTRUMENT_STARTHEM: OplInstrument = [ 0x00, 0xE2, 0x14, 0x73, 0x64, 0x0B, 0x01, 0xE1, 0x01, 0x98, 0x05, 0x01 ]; +pub const OPL_INSTRUMENT_SITAR: OplInstrument = [ 0x00, 0x21, 0x0B, 0x72, 0x34, 0x09, 0x00, 0x24, 0x02, 0xA3, 0xF6, 0x01 ]; +pub const OPL_INSTRUMENT_BANJO: OplInstrument = [ 0x00, 0x21, 0x16, 0xF4, 0x53, 0x0D, 0x00, 0x04, 0x00, 0xF6, 0xF8, 0x00 ]; +pub const OPL_INSTRUMENT_SHAMISEN: OplInstrument = [ 0x00, 0x21, 0x18, 0xDA, 0x02, 0x0D, 0x00, 0x35, 0x00, 0xF3, 0xF5, 0x00 ]; +pub const OPL_INSTRUMENT_KOTO: OplInstrument = [ 0x00, 0x25, 0x0F, 0xFA, 0x63, 0x09, 0x00, 0x02, 0x00, 0x94, 0xE5, 0x01 ]; +pub const OPL_INSTRUMENT_KALIMBA: OplInstrument = [ 0x00, 0x32, 0x07, 0xF9, 0x96, 0x01, 0x00, 0x11, 0x00, 0x84, 0x44, 0x00 ]; +pub const OPL_INSTRUMENT_BAGPIPE: OplInstrument = [ 0x00, 0x20, 0x0E, 0x97, 0x18, 0x09, 0x02, 0x25, 0x03, 0x83, 0x18, 0x01 ]; +pub const OPL_INSTRUMENT_FIDDLE: OplInstrument = [ 0x00, 0x61, 0x18, 0xF6, 0x29, 0x01, 0x00, 0x62, 0x01, 0x78, 0x08, 0x01 ]; +pub const OPL_INSTRUMENT_SHANNAI: OplInstrument = [ 0x00, 0xE6, 0x21, 0x76, 0x19, 0x0B, 0x00, 0x61, 0x03, 0x8E, 0x08, 0x01 ]; +pub const OPL_INSTRUMENT_TINKLBEL: OplInstrument = [ 0x00, 0x27, 0x23, 0xF0, 0xD4, 0x01, 0x00, 0x05, 0x09, 0xF2, 0x46, 0x00 ]; +pub const OPL_INSTRUMENT_AGOGO: OplInstrument = [ 0x00, 0x1C, 0x0C, 0xF9, 0x31, 0x0F, 0x01, 0x15, 0x00, 0x96, 0xE8, 0x01 ]; +pub const OPL_INSTRUMENT_STEELDRM: OplInstrument = [ 0x00, 0x02, 0x00, 0x75, 0x16, 0x06, 0x02, 0x01, 0x00, 0xF6, 0xF6, 0x01 ]; +pub const OPL_INSTRUMENT_WOODBLOK: OplInstrument = [ 0x00, 0x25, 0x1B, 0xFA, 0xF2, 0x01, 0x00, 0x12, 0x00, 0xF6, 0x9A, 0x00 ]; +pub const OPL_INSTRUMENT_TAIKO: OplInstrument = [ 0x00, 0x02, 0x1D, 0xF5, 0x93, 0x01, 0x00, 0x00, 0x00, 0xC6, 0x45, 0x00 ]; +pub const OPL_INSTRUMENT_MELOTOM: OplInstrument = [ 0x00, 0x11, 0x15, 0xF5, 0x32, 0x05, 0x00, 0x10, 0x00, 0xF4, 0xB4, 0x00 ]; +pub const OPL_INSTRUMENT_SYNDRUM: OplInstrument = [ 0x00, 0x22, 0x06, 0xFA, 0x99, 0x09, 0x00, 0x01, 0x00, 0xD5, 0x25, 0x00 ]; +pub const OPL_INSTRUMENT_REVRSCYM: OplInstrument = [ 0x00, 0x2E, 0x00, 0xFF, 0x00, 0x0F, 0x02, 0x0E, 0x0E, 0x21, 0x2D, 0x00 ]; +pub const OPL_INSTRUMENT_FRETNOIS: OplInstrument = [ 0x00, 0x30, 0x0B, 0x56, 0xE4, 0x01, 0x01, 0x17, 0x00, 0x55, 0x87, 0x02 ]; +pub const OPL_INSTRUMENT_BRTHNOIS: OplInstrument = [ 0x00, 0x24, 0x00, 0xFF, 0x03, 0x0D, 0x00, 0x05, 0x08, 0x98, 0x87, 0x01 ]; +pub const OPL_INSTRUMENT_SEASHORE: OplInstrument = [ 0x00, 0x0E, 0x00, 0xF0, 0x00, 0x0F, 0x02, 0x0A, 0x04, 0x17, 0x04, 0x03 ]; +pub const OPL_INSTRUMENT_BIRDS: OplInstrument = [ 0x00, 0x20, 0x08, 0xF6, 0xF7, 0x01, 0x00, 0x0E, 0x05, 0x77, 0xF9, 0x02 ]; +pub const OPL_INSTRUMENT_TELEPHON: OplInstrument = [ 0x00, 0x20, 0x14, 0xF1, 0x08, 0x01, 0x00, 0x2E, 0x02, 0xF4, 0x08, 0x00 ]; +pub const OPL_INSTRUMENT_HELICOPT: OplInstrument = [ 0x00, 0x20, 0x04, 0xF2, 0x00, 0x03, 0x01, 0x23, 0x00, 0x36, 0x05, 0x01 ]; +pub const OPL_INSTRUMENT_APPLAUSE: OplInstrument = [ 0x00, 0x2E, 0x00, 0xFF, 0x02, 0x0F, 0x00, 0x2A, 0x05, 0x32, 0x55, 0x03 ]; \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 939343b..4f17a17 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,35 +7,158 @@ #![doc = include_str!("./docs.md")] /* - * Nuked OPL3 is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 2.1 - * of the License, or (at your option) any later version. - * - * Nuked OPL3 is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Nuked OPL3. If not, see . +* Nuked OPL3 is free software: you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License as +* published by the Free Software Foundation, either version 2.1 +* of the License, or (at your option) any later version. +* +* Nuked OPL3 is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with Nuked OPL3. If not, see . - * Nuked OPL3 emulator. - * Thanks: - * MAME Development Team(Jarek Burczynski, Tatsuyuki Satoh): - * Feedback and Rhythm part calculation information. - * forums.submarine.org.uk(carbon14, opl3): - * Tremolo and phase generator calculation information. - * OPLx decapsulated(Matthew Gambrell, Olli Niemitalo): - * OPL2 ROMs. - * siliconpr0n.org(John McMaster, digshadow): - * YMF262 and VRC VII decaps and die shots. - * - * version: 1.8 - */ +* Nuked OPL3 emulator. +* Thanks: +* MAME Development Team(Jarek Burczynski, Tatsuyuki Satoh): +* Feedback and Rhythm part calculation information. +* forums.submarine.org.uk(carbon14, opl3): +* Tremolo and phase generator calculation information. +* OPLx decapsulated(Matthew Gambrell, Olli Niemitalo): +* OPL2 ROMs. +* siliconpr0n.org(John McMaster, digshadow): +* YMF262 and VRC VII decaps and die shots. +* +* version: 1.8 +*/ + +use std::sync::{Arc, Mutex}; + +unsafe impl Send for Opl3Chip {} mod bindings; +/// The `Opl3DeviceStats` struct contains statistics about the OPL3 device. +/// It can be retrieved via the `get_stats` function on `Opl3Device`. +#[derive(Default)] +pub struct Opl3DeviceStats { + /// The number of writes to the OPL3 data register since reset. + pub data_writes: usize, + /// The number of writes to the OPL3 address register since reset. + pub addr_writes: usize, + /// The number of reads from the OPL3 status register since reset. + pub status_reads: usize, + /// The number of samples generated since reset. + pub samples_generated: usize, +} + +/// The `Opl3Device` struct provides convenience functions for fully implementing an OPL3 device on +/// top of Nuked-OPL3. +/// By keeping a copy of all registers written, we can implement a read_register function. +pub struct Opl3Device { + addr_reg: u8, + status_reg: u8, + sample_rate: u32, + registers: [u8; 256], + stats: Opl3DeviceStats, + inner_chip: Arc>, +} + +impl Opl3Device { + /// Create a new OPL3 device instance. + /// `Opl3Device` is a convenience wrapper around the Nuked-OPL3's direct wrapper, `Opl3Chip`. + /// It provides the rest of an OPL3 implementation on top of the chip, including register + /// tracking and a read_register function. + pub fn new(sample_rate: u32) -> Self { + Opl3Device { + addr_reg: 0, + status_reg: 0, + sample_rate, + registers: [0; 256], + stats: Opl3DeviceStats::default(), + inner_chip: Arc::new(Mutex::new(Opl3Chip::new(sample_rate))), + } + } + + /// Write a byte to the OPL3 device's Address register. + /// This function, along with write_data, is likely the primary interface for an emulator + /// implementing an OPL device. + /// + /// # Arguments + /// + /// * `addr` - The register address to write to the OPL3 device, in the range 0..=255. + pub fn write_address(&mut self, addr: u8) { + if (addr as u16) < 256 { + self.status_reg = addr; + } + } + + /// Write a byte to the OPL3 device's Data register. + /// This function, along with write_address, is likely the primary interface function for an + /// emulator implementing an OPL device. + /// + /// The actual internal register to be written should be set by writing to the OPL3 address + /// register via `write_address` before calling `write_data`. + /// + /// # Arguments + /// + /// * `data` - The byte of data to write to the OPL3 device. + pub fn write_data(&mut self, data: u8) { + self.write_register(self.addr_reg as u16, data); + } + + /// Return the value of the given chip register from internal state. + /// The OPL3 registers are not natively readable. `Opl3Device` keeps a copy of all registers + /// written so that they can be queried. This internal state will become desynchronized if + /// registers are written directly to the OPL3 chip. + pub fn read_register(&self, reg: u16) -> u8 { + if reg < 256 { + self.registers[reg as usize] + } else { + 0 + } + } + + /// Write to the specified register directly. This will update the internal state of the + /// Opl3Device so that the register value can later be read. + pub fn write_register(&mut self, reg: u16, value: u8) { + if reg < 256 { + self.stats.data_writes = self.stats.data_writes.saturating_add(1); + + //println!("{:03X}:{:02X} ({})", reg, value, self.stats.data_writes); + + self.registers[reg as usize] = value; + self.inner_chip + .lock() + .unwrap() + .write_register_buffered(reg, value); + } + } + + /// # Arguments + /// + /// * `sample_rate` - An option that either contains the new sample rate to reinitialize with + /// or None to keep the current sample rate. + pub fn reset(&mut self, sample_rate: Option) { + let new_sample_rate = sample_rate.unwrap_or(self.sample_rate); + self.inner_chip.lock().unwrap().reset(new_sample_rate); + for reg in 0..256 { + self.write_register(reg, 0); + } + self.stats = Opl3DeviceStats::default(); + } + + pub fn generate(&mut self, buffer: &mut [i16]) { + self.inner_chip.lock().unwrap().generate(buffer); + } + + pub fn generate_samples(&mut self, buffer: &mut [i16]) { + self.inner_chip.lock().unwrap().generate_stream(buffer); + } +} + /// The `Opl3Chip` struct provides a safe interface for interacting with the Nuked-OPL3 library. pub struct Opl3Chip { chip: bindings::Opl3Chip, @@ -63,6 +186,26 @@ impl Opl3Chip { } } + /// Reinitialize the OPL3 chip instance. + /// + /// # Arguments + /// + /// * `sample_rate` - The sample rate to initialize the OPL3 chip with. + /// + /// # Example + /// + /// ``` + /// use opl3_rs::Opl3Chip; + /// + /// let mut chip = Opl3Chip::new(44100); + /// chip.reset(44100); + /// ``` + pub fn reset(&mut self, sample_rate: u32) { + unsafe { + bindings::Opl3Reset(&mut self.chip, sample_rate); + } + } + /// Generate audio samples. /// /// Internally, this calls Opl3Generate4Ch and returns samples for the first 2 channels.. @@ -161,6 +304,8 @@ impl Opl3Chip { /// Generates a stream of resampled audio samples. /// + /// The number of samples generated is determined by the size of the buffer. + /// /// # Arguments /// /// * `buffer` - A mutable reference to a buffer that will be filled with resampled audio samples. @@ -176,7 +321,11 @@ impl Opl3Chip { /// ``` pub fn generate_stream(&mut self, buffer: &mut [i16]) { unsafe { - bindings::Opl3GenerateStream(&mut self.chip, buffer.as_mut_ptr(), buffer.len() as u32); + bindings::Opl3GenerateStream( + &mut self.chip, + buffer.as_mut_ptr(), + buffer.len() as u32 / 2, + ); } } @@ -230,32 +379,40 @@ impl Opl3Chip { /// Generates a stream of 4 channel resampled audio samples. /// - /// # Arguments + /// The number of samples is determined by the size of the input buffers. /// - /// * `buffer` - A mutable reference to a buffer that will be filled with resampled audio samples. + /// # Arguments /// + /// * `buffer1` - A mutable reference to a slice that will be filled with resampled audio samples. + /// * `buffer2` - A mutable reference to a slice that will be filled with resampled audio samples. + /// The length of buffer1 should equal the length of buffer2. /// # Example /// /// ``` /// use opl3_rs::Opl3Chip; /// /// let mut chip = Opl3Chip::new(44100); - /// let mut buffer1 = [0i16; 4]; - /// let mut buffer2 = [0i16; 4]; + /// let mut buffer1 = [0i16; 1024]; + /// let mut buffer2 = [0i16; 1024]; /// chip.generate_4ch_stream(&mut buffer1, &mut buffer2); /// ``` pub fn generate_4ch_stream(&mut self, buffer1: &mut [i16], buffer2: &mut [i16]) { + if buffer1.len() != buffer2.len() { + panic!("Buffers must be the same length."); + } if buffer1.len() < 4 || buffer2.len() < 4 { panic!("Buffers must be at least 4 samples long."); } unsafe { - bindings::Opl3Generate4ChStream(&mut self.chip, buffer1.as_mut_ptr(), buffer2.as_mut_ptr(), buffer1.len() as u32); + bindings::Opl3Generate4ChStream( + &mut self.chip, + buffer1.as_mut_ptr(), + buffer2.as_mut_ptr(), + buffer1.len() as u32 / 2, + ); } } - } #[cfg(test)] -mod tests { - use super::*; -} +mod tests {} diff --git a/src/nuked-opl3/opl3.c b/src/nuked-opl3/opl3.c index 5efcca7..6c33807 100644 --- a/src/nuked-opl3/opl3.c +++ b/src/nuked-opl3/opl3.c @@ -1361,6 +1361,7 @@ void OPL3_Reset(opl3_chip *chip, uint32_t samplerate) void OPL3_WriteReg(opl3_chip *chip, uint16_t reg, uint8_t v) { + //printf(">>> In OPL3_WriteReg: reg=%04x, v=%02x\n", reg, v); uint8_t high = (reg >> 8) & 0x01; uint8_t regm = reg & 0xff; switch (regm & 0xf0) @@ -1471,6 +1472,7 @@ void OPL3_WriteReg(opl3_chip *chip, uint16_t reg, uint8_t v) void OPL3_WriteRegBuffered(opl3_chip *chip, uint16_t reg, uint8_t v) { + //printf(">>> In WriteRegBuffered: reg=%04x, v=%02x\n", reg, v); uint64_t time1, time2; opl3_writebuf *writebuf; uint32_t writebuf_last; @@ -1520,11 +1522,23 @@ void OPL3_Generate4ChStream(opl3_chip *chip, int16_t *sndptr1, int16_t *sndptr2, void OPL3_GenerateStream(opl3_chip *chip, int16_t *sndptr, uint32_t numsamples) { + uint_fast32_t i; + int16_t min = INT16_MAX; + int16_t max = 0; for(i = 0; i < numsamples; i++) { OPL3_GenerateResampled(chip, sndptr); + + if (sndptr[0] < min) { + min = sndptr[0]; + } + if (sndptr[0] > max) { + max = sndptr[0]; + } sndptr += 2; } + + //printf(">>> In OPL3_GenerateStream. Min: %d Max: %d\n", min, max); } diff --git a/test.raw b/test.raw new file mode 100644 index 0000000000000000000000000000000000000000..31a70c383f6d0278b3d1d973da4e080a87c10aab GIT binary patch literal 192000 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 mB}{9+A!Kwp}w2qQuG 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 tF&F3g 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