koffi 0.9.6 → 0.9.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (997) hide show
  1. package/LICENSE.txt +661 -0
  2. package/README.md +195 -162
  3. package/package.json +36 -19
  4. package/src/call.hh +28 -27
  5. package/src/call_arm32.cc +498 -514
  6. package/src/call_arm32_fwd.S +108 -108
  7. package/src/call_arm64.cc +482 -497
  8. package/src/call_arm64_fwd.S +110 -110
  9. package/src/call_x64_sysv.cc +463 -477
  10. package/src/call_x64_sysv_fwd.S +131 -131
  11. package/src/call_x64_win.cc +240 -243
  12. package/src/call_x64_win_fwd.asm +105 -105
  13. package/src/call_x86.cc +246 -259
  14. package/src/call_x86_fwd.S +48 -48
  15. package/src/call_x86_fwd.asm +50 -50
  16. package/src/ffi.cc +506 -504
  17. package/src/ffi.hh +142 -136
  18. package/src/util.cc +330 -297
  19. package/src/util.hh +164 -80
  20. package/test/qemu/.gitkeep +0 -0
  21. package/test/registry/machines.json +112 -0
  22. package/test/registry/sha256sum.txt +21 -0
  23. package/test/test.js +493 -0
  24. package/vendor/dragonbox/include/dragonbox/dragonbox.h +2674 -2674
  25. package/vendor/dragonbox/subproject/test/results/binary32.csv +255 -255
  26. package/vendor/dragonbox/subproject/test/results/binary64.csv +2047 -2047
  27. package/vendor/libcc/libcc.cc +7669 -7651
  28. package/vendor/libcc/libcc.hh +4334 -4312
  29. package/vendor/node-addon-api/CHANGELOG.md +859 -859
  30. package/vendor/node-addon-api/CODE_OF_CONDUCT.md +4 -4
  31. package/vendor/node-addon-api/CONTRIBUTING.md +93 -93
  32. package/vendor/node-addon-api/LICENSE.md +12 -12
  33. package/vendor/node-addon-api/README.md +293 -293
  34. package/vendor/node-addon-api/appveyor.yml +37 -37
  35. package/vendor/node-addon-api/benchmark/README.md +47 -47
  36. package/vendor/node-addon-api/benchmark/binding.gyp +25 -25
  37. package/vendor/node-addon-api/benchmark/function_args.cc +217 -217
  38. package/vendor/node-addon-api/benchmark/function_args.js +60 -60
  39. package/vendor/node-addon-api/benchmark/index.js +34 -34
  40. package/vendor/node-addon-api/benchmark/property_descriptor.cc +91 -91
  41. package/vendor/node-addon-api/benchmark/property_descriptor.js +37 -37
  42. package/vendor/node-addon-api/common.gypi +21 -21
  43. package/vendor/node-addon-api/doc/addon.md +163 -163
  44. package/vendor/node-addon-api/doc/array.md +81 -81
  45. package/vendor/node-addon-api/doc/array_buffer.md +155 -155
  46. package/vendor/node-addon-api/doc/async_context.md +86 -86
  47. package/vendor/node-addon-api/doc/async_operations.md +31 -31
  48. package/vendor/node-addon-api/doc/async_worker.md +427 -427
  49. package/vendor/node-addon-api/doc/async_worker_variants.md +557 -557
  50. package/vendor/node-addon-api/doc/bigint.md +97 -97
  51. package/vendor/node-addon-api/doc/boolean.md +68 -68
  52. package/vendor/node-addon-api/doc/buffer.md +150 -150
  53. package/vendor/node-addon-api/doc/callback_scope.md +54 -54
  54. package/vendor/node-addon-api/doc/callbackinfo.md +97 -97
  55. package/vendor/node-addon-api/doc/checker-tool.md +32 -32
  56. package/vendor/node-addon-api/doc/class_property_descriptor.md +115 -115
  57. package/vendor/node-addon-api/doc/cmake-js.md +68 -68
  58. package/vendor/node-addon-api/doc/conversion-tool.md +27 -27
  59. package/vendor/node-addon-api/doc/creating_a_release.md +62 -62
  60. package/vendor/node-addon-api/doc/dataview.md +248 -248
  61. package/vendor/node-addon-api/doc/date.md +68 -68
  62. package/vendor/node-addon-api/doc/env.md +196 -196
  63. package/vendor/node-addon-api/doc/error.md +120 -120
  64. package/vendor/node-addon-api/doc/error_handling.md +254 -254
  65. package/vendor/node-addon-api/doc/escapable_handle_scope.md +80 -80
  66. package/vendor/node-addon-api/doc/external.md +63 -63
  67. package/vendor/node-addon-api/doc/function.md +402 -402
  68. package/vendor/node-addon-api/doc/function_reference.md +238 -238
  69. package/vendor/node-addon-api/doc/generator.md +13 -13
  70. package/vendor/node-addon-api/doc/handle_scope.md +63 -63
  71. package/vendor/node-addon-api/doc/hierarchy.md +91 -91
  72. package/vendor/node-addon-api/doc/instance_wrap.md +408 -408
  73. package/vendor/node-addon-api/doc/maybe.md +76 -76
  74. package/vendor/node-addon-api/doc/memory_management.md +27 -27
  75. package/vendor/node-addon-api/doc/name.md +29 -29
  76. package/vendor/node-addon-api/doc/node-gyp.md +82 -82
  77. package/vendor/node-addon-api/doc/number.md +163 -163
  78. package/vendor/node-addon-api/doc/object.md +432 -432
  79. package/vendor/node-addon-api/doc/object_lifetime_management.md +83 -83
  80. package/vendor/node-addon-api/doc/object_reference.md +117 -117
  81. package/vendor/node-addon-api/doc/object_wrap.md +561 -561
  82. package/vendor/node-addon-api/doc/prebuild_tools.md +16 -16
  83. package/vendor/node-addon-api/doc/promises.md +79 -79
  84. package/vendor/node-addon-api/doc/property_descriptor.md +286 -286
  85. package/vendor/node-addon-api/doc/propertylvalue.md +50 -50
  86. package/vendor/node-addon-api/doc/range_error.md +59 -59
  87. package/vendor/node-addon-api/doc/reference.md +113 -113
  88. package/vendor/node-addon-api/doc/setup.md +110 -110
  89. package/vendor/node-addon-api/doc/string.md +93 -93
  90. package/vendor/node-addon-api/doc/symbol.md +60 -60
  91. package/vendor/node-addon-api/doc/threadsafe.md +121 -121
  92. package/vendor/node-addon-api/doc/threadsafe_function.md +290 -290
  93. package/vendor/node-addon-api/doc/type_error.md +59 -59
  94. package/vendor/node-addon-api/doc/typed_array.md +78 -78
  95. package/vendor/node-addon-api/doc/typed_array_of.md +137 -137
  96. package/vendor/node-addon-api/doc/typed_threadsafe_function.md +306 -306
  97. package/vendor/node-addon-api/doc/value.md +340 -340
  98. package/vendor/node-addon-api/doc/version_management.md +43 -43
  99. package/vendor/node-addon-api/except.gypi +25 -25
  100. package/vendor/node-addon-api/index.js +11 -11
  101. package/vendor/node-addon-api/napi-inl.deprecated.h +192 -192
  102. package/vendor/node-addon-api/napi-inl.h +6209 -6209
  103. package/vendor/node-addon-api/napi.h +2983 -2983
  104. package/vendor/node-addon-api/node_api.gyp +9 -9
  105. package/vendor/node-addon-api/noexcept.gypi +26 -26
  106. package/vendor/node-addon-api/package-support.json +21 -21
  107. package/vendor/node-addon-api/package.json +399 -399
  108. package/vendor/node-addon-api/test/README.md +91 -91
  109. package/vendor/node-addon-api/test/addon.cc +36 -36
  110. package/vendor/node-addon-api/test/addon.js +11 -11
  111. package/vendor/node-addon-api/test/addon_build/index.js +49 -49
  112. package/vendor/node-addon-api/test/addon_build/tpl/addon.cc +17 -17
  113. package/vendor/node-addon-api/test/addon_build/tpl/binding.gyp +62 -62
  114. package/vendor/node-addon-api/test/addon_build/tpl/index.js +9 -9
  115. package/vendor/node-addon-api/test/addon_build/tpl/package.json +11 -11
  116. package/vendor/node-addon-api/test/addon_data.cc +99 -99
  117. package/vendor/node-addon-api/test/addon_data.js +46 -46
  118. package/vendor/node-addon-api/test/array_buffer.cc +243 -243
  119. package/vendor/node-addon-api/test/array_buffer.js +69 -69
  120. package/vendor/node-addon-api/test/async_context.cc +21 -21
  121. package/vendor/node-addon-api/test/async_context.js +86 -86
  122. package/vendor/node-addon-api/test/async_progress_queue_worker.cc +83 -83
  123. package/vendor/node-addon-api/test/async_progress_queue_worker.js +46 -46
  124. package/vendor/node-addon-api/test/async_progress_worker.cc +134 -134
  125. package/vendor/node-addon-api/test/async_progress_worker.js +61 -61
  126. package/vendor/node-addon-api/test/async_worker.cc +106 -106
  127. package/vendor/node-addon-api/test/async_worker.js +179 -179
  128. package/vendor/node-addon-api/test/async_worker_nocallback.js +13 -13
  129. package/vendor/node-addon-api/test/async_worker_persistent.cc +63 -63
  130. package/vendor/node-addon-api/test/async_worker_persistent.js +24 -24
  131. package/vendor/node-addon-api/test/basic_types/array.cc +40 -40
  132. package/vendor/node-addon-api/test/basic_types/array.js +35 -35
  133. package/vendor/node-addon-api/test/basic_types/boolean.cc +38 -38
  134. package/vendor/node-addon-api/test/basic_types/boolean.js +35 -35
  135. package/vendor/node-addon-api/test/basic_types/number.cc +99 -99
  136. package/vendor/node-addon-api/test/basic_types/number.js +114 -114
  137. package/vendor/node-addon-api/test/basic_types/value.cc +120 -120
  138. package/vendor/node-addon-api/test/basic_types/value.js +133 -133
  139. package/vendor/node-addon-api/test/bigint.cc +91 -91
  140. package/vendor/node-addon-api/test/bigint.js +53 -53
  141. package/vendor/node-addon-api/test/binding-swallowexcept.cc +12 -12
  142. package/vendor/node-addon-api/test/binding.cc +171 -171
  143. package/vendor/node-addon-api/test/binding.gyp +117 -117
  144. package/vendor/node-addon-api/test/buffer.cc +183 -183
  145. package/vendor/node-addon-api/test/buffer.js +69 -69
  146. package/vendor/node-addon-api/test/callbackscope.cc +22 -22
  147. package/vendor/node-addon-api/test/callbackscope.js +49 -49
  148. package/vendor/node-addon-api/test/common/index.js +113 -113
  149. package/vendor/node-addon-api/test/common/test_helper.h +61 -61
  150. package/vendor/node-addon-api/test/dataview/dataview.cc +48 -48
  151. package/vendor/node-addon-api/test/dataview/dataview.js +35 -35
  152. package/vendor/node-addon-api/test/dataview/dataview_read_write.cc +115 -115
  153. package/vendor/node-addon-api/test/dataview/dataview_read_write.js +90 -90
  154. package/vendor/node-addon-api/test/date.cc +44 -44
  155. package/vendor/node-addon-api/test/date.js +18 -18
  156. package/vendor/node-addon-api/test/env_cleanup.cc +88 -88
  157. package/vendor/node-addon-api/test/env_cleanup.js +56 -56
  158. package/vendor/node-addon-api/test/error.cc +287 -287
  159. package/vendor/node-addon-api/test/error.js +81 -81
  160. package/vendor/node-addon-api/test/error_handling_for_primitives.cc +13 -13
  161. package/vendor/node-addon-api/test/error_handling_for_primitives.js +29 -29
  162. package/vendor/node-addon-api/test/error_terminating_environment.js +94 -94
  163. package/vendor/node-addon-api/test/external.cc +81 -81
  164. package/vendor/node-addon-api/test/external.js +88 -88
  165. package/vendor/node-addon-api/test/function.cc +295 -295
  166. package/vendor/node-addon-api/test/function.js +121 -121
  167. package/vendor/node-addon-api/test/function_reference.cc +202 -202
  168. package/vendor/node-addon-api/test/function_reference.js +157 -157
  169. package/vendor/node-addon-api/test/globalObject/global_object.cc +61 -61
  170. package/vendor/node-addon-api/test/globalObject/global_object_delete_property.cc +31 -31
  171. package/vendor/node-addon-api/test/globalObject/global_object_delete_property.js +61 -61
  172. package/vendor/node-addon-api/test/globalObject/global_object_get_property.cc +40 -40
  173. package/vendor/node-addon-api/test/globalObject/global_object_get_property.js +57 -57
  174. package/vendor/node-addon-api/test/globalObject/global_object_has_own_property.cc +28 -28
  175. package/vendor/node-addon-api/test/globalObject/global_object_has_own_property.js +48 -48
  176. package/vendor/node-addon-api/test/globalObject/global_object_set_property.cc +30 -30
  177. package/vendor/node-addon-api/test/globalObject/global_object_set_property.js +58 -58
  178. package/vendor/node-addon-api/test/handlescope.cc +60 -60
  179. package/vendor/node-addon-api/test/handlescope.js +14 -14
  180. package/vendor/node-addon-api/test/index.js +136 -136
  181. package/vendor/node-addon-api/test/maybe/check.cc +23 -23
  182. package/vendor/node-addon-api/test/maybe/index.js +38 -38
  183. package/vendor/node-addon-api/test/memory_management.cc +17 -17
  184. package/vendor/node-addon-api/test/memory_management.js +9 -9
  185. package/vendor/node-addon-api/test/movable_callbacks.cc +23 -23
  186. package/vendor/node-addon-api/test/movable_callbacks.js +21 -21
  187. package/vendor/node-addon-api/test/name.cc +108 -108
  188. package/vendor/node-addon-api/test/name.js +59 -59
  189. package/vendor/node-addon-api/test/napi_child.js +14 -14
  190. package/vendor/node-addon-api/test/object/delete_property.cc +38 -38
  191. package/vendor/node-addon-api/test/object/delete_property.js +41 -41
  192. package/vendor/node-addon-api/test/object/finalizer.cc +29 -29
  193. package/vendor/node-addon-api/test/object/finalizer.js +28 -28
  194. package/vendor/node-addon-api/test/object/get_property.cc +34 -34
  195. package/vendor/node-addon-api/test/object/get_property.js +40 -40
  196. package/vendor/node-addon-api/test/object/has_own_property.cc +34 -34
  197. package/vendor/node-addon-api/test/object/has_own_property.js +34 -34
  198. package/vendor/node-addon-api/test/object/has_property.cc +38 -38
  199. package/vendor/node-addon-api/test/object/has_property.js +37 -37
  200. package/vendor/node-addon-api/test/object/object.cc +348 -348
  201. package/vendor/node-addon-api/test/object/object.js +217 -217
  202. package/vendor/node-addon-api/test/object/object_deprecated.cc +66 -66
  203. package/vendor/node-addon-api/test/object/object_deprecated.js +47 -47
  204. package/vendor/node-addon-api/test/object/object_freeze_seal.cc +25 -25
  205. package/vendor/node-addon-api/test/object/object_freeze_seal.js +61 -61
  206. package/vendor/node-addon-api/test/object/set_property.cc +37 -37
  207. package/vendor/node-addon-api/test/object/set_property.js +29 -29
  208. package/vendor/node-addon-api/test/object/subscript_operator.cc +42 -42
  209. package/vendor/node-addon-api/test/object/subscript_operator.js +17 -17
  210. package/vendor/node-addon-api/test/object_reference.cc +219 -219
  211. package/vendor/node-addon-api/test/object_reference.js +259 -259
  212. package/vendor/node-addon-api/test/objectwrap.cc +268 -268
  213. package/vendor/node-addon-api/test/objectwrap.js +284 -284
  214. package/vendor/node-addon-api/test/objectwrap_constructor_exception.cc +26 -26
  215. package/vendor/node-addon-api/test/objectwrap_constructor_exception.js +18 -18
  216. package/vendor/node-addon-api/test/objectwrap_multiple_inheritance.cc +30 -30
  217. package/vendor/node-addon-api/test/objectwrap_multiple_inheritance.js +13 -13
  218. package/vendor/node-addon-api/test/objectwrap_removewrap.cc +45 -45
  219. package/vendor/node-addon-api/test/objectwrap_removewrap.js +40 -40
  220. package/vendor/node-addon-api/test/objectwrap_worker_thread.js +19 -19
  221. package/vendor/node-addon-api/test/promise.cc +29 -29
  222. package/vendor/node-addon-api/test/promise.js +18 -18
  223. package/vendor/node-addon-api/test/reference.cc +24 -24
  224. package/vendor/node-addon-api/test/reference.js +14 -14
  225. package/vendor/node-addon-api/test/run_script.cc +56 -56
  226. package/vendor/node-addon-api/test/run_script.js +45 -45
  227. package/vendor/node-addon-api/test/symbol.cc +79 -79
  228. package/vendor/node-addon-api/test/symbol.js +73 -73
  229. package/vendor/node-addon-api/test/testUtil.js +54 -54
  230. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function.cc +195 -195
  231. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function.js +188 -188
  232. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ctx.cc +63 -63
  233. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ctx.js +12 -12
  234. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_existing_tsfn.cc +115 -115
  235. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_existing_tsfn.js +14 -14
  236. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ptr.cc +26 -26
  237. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ptr.js +7 -7
  238. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_sum.cc +225 -225
  239. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_sum.js +59 -59
  240. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_unref.cc +42 -42
  241. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_unref.js +53 -53
  242. package/vendor/node-addon-api/test/thunking_manual.cc +140 -140
  243. package/vendor/node-addon-api/test/thunking_manual.js +17 -17
  244. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function.cc +215 -215
  245. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function.js +188 -188
  246. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ctx.cc +68 -68
  247. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ctx.js +12 -12
  248. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_existing_tsfn.cc +127 -127
  249. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_existing_tsfn.js +14 -14
  250. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ptr.cc +28 -28
  251. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ptr.js +7 -7
  252. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_sum.cc +237 -237
  253. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_sum.js +59 -59
  254. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_unref.cc +53 -53
  255. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_unref.js +53 -53
  256. package/vendor/node-addon-api/test/typedarray-bigint.js +58 -58
  257. package/vendor/node-addon-api/test/typedarray.cc +216 -216
  258. package/vendor/node-addon-api/test/typedarray.js +69 -69
  259. package/vendor/node-addon-api/test/version_management.cc +27 -27
  260. package/vendor/node-addon-api/test/version_management.js +31 -31
  261. package/vendor/node-addon-api/tools/README.md +73 -73
  262. package/vendor/node-addon-api/tools/check-napi.js +100 -100
  263. package/vendor/node-addon-api/tools/clang-format.js +68 -68
  264. package/vendor/node-addon-api/tools/conversion.js +309 -309
  265. package/vendor/node-addon-api/tools/eslint-format.js +71 -71
  266. package/vendor/raylib/BINDINGS.md +123 -0
  267. package/vendor/raylib/CHANGELOG +1495 -0
  268. package/vendor/raylib/CMakeLists.txt +33 -0
  269. package/vendor/raylib/CMakeOptions.txt +87 -0
  270. package/vendor/raylib/CONTRIBUTING.md +76 -0
  271. package/vendor/raylib/CONTRIBUTORS.md +63 -0
  272. package/vendor/raylib/CONVENTIONS.md +95 -0
  273. package/vendor/raylib/HISTORY.md +364 -0
  274. package/vendor/raylib/LICENSE +16 -0
  275. package/vendor/raylib/README.md +141 -0
  276. package/vendor/raylib/ROADMAP.md +76 -0
  277. package/vendor/raylib/SPONSORS.md +68 -0
  278. package/vendor/raylib/cmake/AddIfFlagCompiles.cmake +12 -0
  279. package/vendor/raylib/cmake/BuildOptions.cmake +18 -0
  280. package/vendor/raylib/cmake/CompileDefinitions.cmake +110 -0
  281. package/vendor/raylib/cmake/CompilerFlags.cmake +79 -0
  282. package/vendor/raylib/cmake/EnumOption.cmake +9 -0
  283. package/vendor/raylib/cmake/GlfwImport.cmake +34 -0
  284. package/vendor/raylib/cmake/InstallConfigurations.cmake +29 -0
  285. package/vendor/raylib/cmake/JoinPaths.cmake +26 -0
  286. package/vendor/raylib/cmake/LibraryConfigurations.cmake +108 -0
  287. package/vendor/raylib/cmake/LibraryPathToLinkerFlags.cmake +24 -0
  288. package/vendor/raylib/cmake/PackConfigurations.cmake +13 -0
  289. package/vendor/raylib/cmake/PopulateConfigVariablesLocally.cmake +11 -0
  290. package/vendor/raylib/cmake/raylib-config-version.cmake +21 -0
  291. package/vendor/raylib/cmake/raylib-config.cmake +76 -0
  292. package/vendor/raylib/examples/CMakeLists.txt +139 -0
  293. package/vendor/raylib/examples/Makefile +565 -0
  294. package/vendor/raylib/examples/Makefile.Android +405 -0
  295. package/vendor/raylib/examples/Makefile.Web +1053 -0
  296. package/vendor/raylib/examples/README.md +203 -0
  297. package/vendor/raylib/examples/audio/audio_module_playing.c +146 -0
  298. package/vendor/raylib/examples/audio/audio_module_playing.png +0 -0
  299. package/vendor/raylib/examples/audio/audio_multichannel_sound.c +73 -0
  300. package/vendor/raylib/examples/audio/audio_multichannel_sound.png +0 -0
  301. package/vendor/raylib/examples/audio/audio_music_stream.c +93 -0
  302. package/vendor/raylib/examples/audio/audio_music_stream.png +0 -0
  303. package/vendor/raylib/examples/audio/audio_raw_stream.c +167 -0
  304. package/vendor/raylib/examples/audio/audio_raw_stream.png +0 -0
  305. package/vendor/raylib/examples/audio/audio_sound_loading.c +64 -0
  306. package/vendor/raylib/examples/audio/audio_sound_loading.png +0 -0
  307. package/vendor/raylib/examples/audio/resources/LICENSE.md +10 -0
  308. package/vendor/raylib/examples/audio/resources/coin.wav +0 -0
  309. package/vendor/raylib/examples/audio/resources/country.mp3 +0 -0
  310. package/vendor/raylib/examples/audio/resources/mini1111.xm +0 -0
  311. package/vendor/raylib/examples/audio/resources/sound.wav +0 -0
  312. package/vendor/raylib/examples/audio/resources/spring.wav +0 -0
  313. package/vendor/raylib/examples/audio/resources/target.flac +0 -0
  314. package/vendor/raylib/examples/audio/resources/target.ogg +0 -0
  315. package/vendor/raylib/examples/audio/resources/weird.wav +0 -0
  316. package/vendor/raylib/examples/build.zig +86 -0
  317. package/vendor/raylib/examples/core/core_2d_camera.c +132 -0
  318. package/vendor/raylib/examples/core/core_2d_camera.png +0 -0
  319. package/vendor/raylib/examples/core/core_2d_camera_platformer.c +293 -0
  320. package/vendor/raylib/examples/core/core_2d_camera_platformer.png +0 -0
  321. package/vendor/raylib/examples/core/core_2d_camera_smooth_pixelperfect.png +0 -0
  322. package/vendor/raylib/examples/core/core_3d_camera_first_person.c +97 -0
  323. package/vendor/raylib/examples/core/core_3d_camera_first_person.png +0 -0
  324. package/vendor/raylib/examples/core/core_3d_camera_free.c +83 -0
  325. package/vendor/raylib/examples/core/core_3d_camera_free.png +0 -0
  326. package/vendor/raylib/examples/core/core_3d_camera_mode.c +73 -0
  327. package/vendor/raylib/examples/core/core_3d_camera_mode.png +0 -0
  328. package/vendor/raylib/examples/core/core_3d_picking.c +107 -0
  329. package/vendor/raylib/examples/core/core_3d_picking.png +0 -0
  330. package/vendor/raylib/examples/core/core_basic_screen_manager.c +150 -0
  331. package/vendor/raylib/examples/core/core_basic_screen_manager.png +0 -0
  332. package/vendor/raylib/examples/core/core_basic_window.c +62 -0
  333. package/vendor/raylib/examples/core/core_basic_window.png +0 -0
  334. package/vendor/raylib/examples/core/core_basic_window_web.c +85 -0
  335. package/vendor/raylib/examples/core/core_custom_frame_control.c +125 -0
  336. package/vendor/raylib/examples/core/core_custom_frame_control.png +0 -0
  337. package/vendor/raylib/examples/core/core_custom_logging.c +84 -0
  338. package/vendor/raylib/examples/core/core_custom_logging.png +0 -0
  339. package/vendor/raylib/examples/core/core_drop_files.c +76 -0
  340. package/vendor/raylib/examples/core/core_drop_files.png +0 -0
  341. package/vendor/raylib/examples/core/core_input_gamepad.c +195 -0
  342. package/vendor/raylib/examples/core/core_input_gamepad.png +0 -0
  343. package/vendor/raylib/examples/core/core_input_gestures.c +115 -0
  344. package/vendor/raylib/examples/core/core_input_gestures.png +0 -0
  345. package/vendor/raylib/examples/core/core_input_keys.c +59 -0
  346. package/vendor/raylib/examples/core/core_input_keys.png +0 -0
  347. package/vendor/raylib/examples/core/core_input_mouse.c +65 -0
  348. package/vendor/raylib/examples/core/core_input_mouse.png +0 -0
  349. package/vendor/raylib/examples/core/core_input_mouse_wheel.c +58 -0
  350. package/vendor/raylib/examples/core/core_input_mouse_wheel.png +0 -0
  351. package/vendor/raylib/examples/core/core_input_multitouch.c +70 -0
  352. package/vendor/raylib/examples/core/core_input_multitouch.png +0 -0
  353. package/vendor/raylib/examples/core/core_loading_thread.c +147 -0
  354. package/vendor/raylib/examples/core/core_loading_thread.png +0 -0
  355. package/vendor/raylib/examples/core/core_quat_conversion.c +132 -0
  356. package/vendor/raylib/examples/core/core_quat_conversion.png +0 -0
  357. package/vendor/raylib/examples/core/core_random_values.c +67 -0
  358. package/vendor/raylib/examples/core/core_random_values.png +0 -0
  359. package/vendor/raylib/examples/core/core_scissor_test.c +71 -0
  360. package/vendor/raylib/examples/core/core_scissor_test.png +0 -0
  361. package/vendor/raylib/examples/core/core_smooth_pixelperfect.c +117 -0
  362. package/vendor/raylib/examples/core/core_smooth_pixelperfect.png +0 -0
  363. package/vendor/raylib/examples/core/core_split_screen.c +155 -0
  364. package/vendor/raylib/examples/core/core_split_screen.png +0 -0
  365. package/vendor/raylib/examples/core/core_storage_values.c +87 -0
  366. package/vendor/raylib/examples/core/core_storage_values.png +0 -0
  367. package/vendor/raylib/examples/core/core_vr_simulator.c +143 -0
  368. package/vendor/raylib/examples/core/core_vr_simulator.png +0 -0
  369. package/vendor/raylib/examples/core/core_window_flags.c +191 -0
  370. package/vendor/raylib/examples/core/core_window_flags.png +0 -0
  371. package/vendor/raylib/examples/core/core_window_letterbox.c +112 -0
  372. package/vendor/raylib/examples/core/core_window_letterbox.png +0 -0
  373. package/vendor/raylib/examples/core/core_world_screen.c +78 -0
  374. package/vendor/raylib/examples/core/core_world_screen.png +0 -0
  375. package/vendor/raylib/examples/core/resources/LICENSE.md +4 -0
  376. package/vendor/raylib/examples/core/resources/distortion100.fs +52 -0
  377. package/vendor/raylib/examples/core/resources/distortion330.fs +53 -0
  378. package/vendor/raylib/examples/core/resources/ps3.png +0 -0
  379. package/vendor/raylib/examples/core/resources/xbox.png +0 -0
  380. package/vendor/raylib/examples/examples_template.c +100 -0
  381. package/vendor/raylib/examples/models/models_animation.c +114 -0
  382. package/vendor/raylib/examples/models/models_animation.png +0 -0
  383. package/vendor/raylib/examples/models/models_billboard.c +75 -0
  384. package/vendor/raylib/examples/models/models_billboard.png +0 -0
  385. package/vendor/raylib/examples/models/models_box_collisions.c +121 -0
  386. package/vendor/raylib/examples/models/models_box_collisions.png +0 -0
  387. package/vendor/raylib/examples/models/models_cubicmap.c +87 -0
  388. package/vendor/raylib/examples/models/models_cubicmap.png +0 -0
  389. package/vendor/raylib/examples/models/models_first_person_maze.c +122 -0
  390. package/vendor/raylib/examples/models/models_first_person_maze.png +0 -0
  391. package/vendor/raylib/examples/models/models_geometric_shapes.c +80 -0
  392. package/vendor/raylib/examples/models/models_geometric_shapes.png +0 -0
  393. package/vendor/raylib/examples/models/models_heightmap.c +82 -0
  394. package/vendor/raylib/examples/models/models_heightmap.png +0 -0
  395. package/vendor/raylib/examples/models/models_loading.c +146 -0
  396. package/vendor/raylib/examples/models/models_loading.png +0 -0
  397. package/vendor/raylib/examples/models/models_loading_gltf.c +105 -0
  398. package/vendor/raylib/examples/models/models_loading_gltf.png +0 -0
  399. package/vendor/raylib/examples/models/models_loading_vox.c +130 -0
  400. package/vendor/raylib/examples/models/models_loading_vox.png +0 -0
  401. package/vendor/raylib/examples/models/models_mesh_generation.c +179 -0
  402. package/vendor/raylib/examples/models/models_mesh_generation.png +0 -0
  403. package/vendor/raylib/examples/models/models_mesh_picking.c +223 -0
  404. package/vendor/raylib/examples/models/models_mesh_picking.png +0 -0
  405. package/vendor/raylib/examples/models/models_orthographic_projection.c +99 -0
  406. package/vendor/raylib/examples/models/models_orthographic_projection.png +0 -0
  407. package/vendor/raylib/examples/models/models_rlgl_solar_system.c +172 -0
  408. package/vendor/raylib/examples/models/models_rlgl_solar_system.png +0 -0
  409. package/vendor/raylib/examples/models/models_skybox.c +262 -0
  410. package/vendor/raylib/examples/models/models_skybox.png +0 -0
  411. package/vendor/raylib/examples/models/models_waving_cubes.c +112 -0
  412. package/vendor/raylib/examples/models/models_waving_cubes.png +0 -0
  413. package/vendor/raylib/examples/models/models_yaw_pitch_roll.c +117 -0
  414. package/vendor/raylib/examples/models/models_yaw_pitch_roll.png +0 -0
  415. package/vendor/raylib/examples/models/resources/LICENSE.md +23 -0
  416. package/vendor/raylib/examples/models/resources/billboard.png +0 -0
  417. package/vendor/raylib/examples/models/resources/cubicmap.png +0 -0
  418. package/vendor/raylib/examples/models/resources/cubicmap_atlas.png +0 -0
  419. package/vendor/raylib/examples/models/resources/dresden_square_1k.hdr +0 -0
  420. package/vendor/raylib/examples/models/resources/dresden_square_2k.hdr +0 -0
  421. package/vendor/raylib/examples/models/resources/heightmap.png +0 -0
  422. package/vendor/raylib/examples/models/resources/models/gltf/AnimatedMorphCube.glb +0 -0
  423. package/vendor/raylib/examples/models/resources/models/gltf/AnimatedTriangle.gltf +118 -0
  424. package/vendor/raylib/examples/models/resources/models/gltf/BoxAnimated.glb +0 -0
  425. package/vendor/raylib/examples/models/resources/models/gltf/LICENSE +23 -0
  426. package/vendor/raylib/examples/models/resources/models/gltf/girl.glb +0 -0
  427. package/vendor/raylib/examples/models/resources/models/gltf/raylib_32x32.glb +0 -0
  428. package/vendor/raylib/examples/models/resources/models/gltf/rigged_figure.glb +0 -0
  429. package/vendor/raylib/examples/models/resources/models/gltf/vertex_colored_object.glb +0 -0
  430. package/vendor/raylib/examples/models/resources/models/iqm/guy.blend +0 -0
  431. package/vendor/raylib/examples/models/resources/models/iqm/guy.iqm +0 -0
  432. package/vendor/raylib/examples/models/resources/models/iqm/guyanim.iqm +0 -0
  433. package/vendor/raylib/examples/models/resources/models/iqm/guytex.png +0 -0
  434. package/vendor/raylib/examples/models/resources/models/iqm/vertex_colored_object.iqm +0 -0
  435. package/vendor/raylib/examples/models/resources/models/obj/bridge.obj +1725 -0
  436. package/vendor/raylib/examples/models/resources/models/obj/bridge_diffuse.png +0 -0
  437. package/vendor/raylib/examples/models/resources/models/obj/castle.obj +12919 -0
  438. package/vendor/raylib/examples/models/resources/models/obj/castle_diffuse.png +0 -0
  439. package/vendor/raylib/examples/models/resources/models/obj/cube.obj +68 -0
  440. package/vendor/raylib/examples/models/resources/models/obj/cube_diffuse.png +0 -0
  441. package/vendor/raylib/examples/models/resources/models/obj/house.obj +4564 -0
  442. package/vendor/raylib/examples/models/resources/models/obj/house_diffuse.png +0 -0
  443. package/vendor/raylib/examples/models/resources/models/obj/market.obj +7301 -0
  444. package/vendor/raylib/examples/models/resources/models/obj/market_diffuse.png +0 -0
  445. package/vendor/raylib/examples/models/resources/models/obj/plane.obj +10858 -0
  446. package/vendor/raylib/examples/models/resources/models/obj/plane_diffuse.png +0 -0
  447. package/vendor/raylib/examples/models/resources/models/obj/turret.obj +1888 -0
  448. package/vendor/raylib/examples/models/resources/models/obj/turret_diffuse.png +0 -0
  449. package/vendor/raylib/examples/models/resources/models/obj/well.obj +1030 -0
  450. package/vendor/raylib/examples/models/resources/models/obj/well_diffuse.png +0 -0
  451. package/vendor/raylib/examples/models/resources/models/vox/LICENSE +9 -0
  452. package/vendor/raylib/examples/models/resources/models/vox/chr_knight.vox +0 -0
  453. package/vendor/raylib/examples/models/resources/models/vox/chr_sword.vox +0 -0
  454. package/vendor/raylib/examples/models/resources/models/vox/monu9.vox +0 -0
  455. package/vendor/raylib/examples/models/resources/shaders/glsl100/cubemap.fs +29 -0
  456. package/vendor/raylib/examples/models/resources/shaders/glsl100/cubemap.vs +20 -0
  457. package/vendor/raylib/examples/models/resources/shaders/glsl100/skybox.fs +31 -0
  458. package/vendor/raylib/examples/models/resources/shaders/glsl100/skybox.vs +24 -0
  459. package/vendor/raylib/examples/models/resources/shaders/glsl330/cubemap.fs +30 -0
  460. package/vendor/raylib/examples/models/resources/shaders/glsl330/cubemap.vs +20 -0
  461. package/vendor/raylib/examples/models/resources/shaders/glsl330/skybox.fs +30 -0
  462. package/vendor/raylib/examples/models/resources/shaders/glsl330/skybox.vs +24 -0
  463. package/vendor/raylib/examples/models/resources/skybox.png +0 -0
  464. package/vendor/raylib/examples/models/rlights.h +183 -0
  465. package/vendor/raylib/examples/others/easings.h +263 -0
  466. package/vendor/raylib/examples/others/easings_testbed.c +227 -0
  467. package/vendor/raylib/examples/others/embedded_files_loading.c +103 -0
  468. package/vendor/raylib/examples/others/external/include/GLFW/glfw3.h +5538 -0
  469. package/vendor/raylib/examples/others/external/include/GLFW/glfw3native.h +572 -0
  470. package/vendor/raylib/examples/others/external/include/glad.h +5466 -0
  471. package/vendor/raylib/examples/others/external/lib/libglfw3.a +0 -0
  472. package/vendor/raylib/examples/others/raudio_standalone.c +152 -0
  473. package/vendor/raylib/examples/others/raylib_opengl_interop.c +152 -0
  474. package/vendor/raylib/examples/others/raylib_opengl_interop.png +0 -0
  475. package/vendor/raylib/examples/others/resources/audio/country.mp3 +0 -0
  476. package/vendor/raylib/examples/others/resources/audio/target.ogg +0 -0
  477. package/vendor/raylib/examples/others/resources/audio/weird.wav +0 -0
  478. package/vendor/raylib/examples/others/resources/audio_data.h +4893 -0
  479. package/vendor/raylib/examples/others/resources/image_data.h +9848 -0
  480. package/vendor/raylib/examples/others/resources/shaders/glsl100/point_particle.fs +16 -0
  481. package/vendor/raylib/examples/others/resources/shaders/glsl100/point_particle.vs +24 -0
  482. package/vendor/raylib/examples/others/resources/shaders/glsl330/point_particle.fs +17 -0
  483. package/vendor/raylib/examples/others/resources/shaders/glsl330/point_particle.vs +24 -0
  484. package/vendor/raylib/examples/others/resources/shaders/glsl430/gol.glsl +41 -0
  485. package/vendor/raylib/examples/others/resources/shaders/glsl430/gol_render.glsl +29 -0
  486. package/vendor/raylib/examples/others/resources/shaders/glsl430/gol_transfert.glsl +51 -0
  487. package/vendor/raylib/examples/others/rlgl_compute_shader.c +173 -0
  488. package/vendor/raylib/examples/others/rlgl_standalone.c +469 -0
  489. package/vendor/raylib/examples/physics/physics_demo.c +128 -0
  490. package/vendor/raylib/examples/physics/physics_demo.png +0 -0
  491. package/vendor/raylib/examples/physics/physics_friction.c +142 -0
  492. package/vendor/raylib/examples/physics/physics_friction.png +0 -0
  493. package/vendor/raylib/examples/physics/physics_movement.c +128 -0
  494. package/vendor/raylib/examples/physics/physics_movement.png +0 -0
  495. package/vendor/raylib/examples/physics/physics_restitution.c +129 -0
  496. package/vendor/raylib/examples/physics/physics_restitution.png +0 -0
  497. package/vendor/raylib/examples/physics/physics_shatter.c +111 -0
  498. package/vendor/raylib/examples/physics/physics_shatter.png +0 -0
  499. package/vendor/raylib/examples/raylib_compile_execute.bat +32 -0
  500. package/vendor/raylib/examples/raylib_makefile_example.bat +27 -0
  501. package/vendor/raylib/examples/shaders/resources/LICENSE.md +11 -0
  502. package/vendor/raylib/examples/shaders/resources/fudesumi.png +0 -0
  503. package/vendor/raylib/examples/shaders/resources/mask.png +0 -0
  504. package/vendor/raylib/examples/shaders/resources/models/barracks.obj +22251 -0
  505. package/vendor/raylib/examples/shaders/resources/models/barracks_diffuse.png +0 -0
  506. package/vendor/raylib/examples/shaders/resources/models/church.obj +5116 -0
  507. package/vendor/raylib/examples/shaders/resources/models/church_diffuse.png +0 -0
  508. package/vendor/raylib/examples/shaders/resources/models/watermill.obj +5316 -0
  509. package/vendor/raylib/examples/shaders/resources/models/watermill_diffuse.png +0 -0
  510. package/vendor/raylib/examples/shaders/resources/plasma.png +0 -0
  511. package/vendor/raylib/examples/shaders/resources/raysan.png +0 -0
  512. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/base.fs +23 -0
  513. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/base.vs +26 -0
  514. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/base_lighting.vs +59 -0
  515. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/base_lighting_instanced.vs +36 -0
  516. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/bloom.fs +39 -0
  517. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/blur.fs +34 -0
  518. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/color_mix.fs +26 -0
  519. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/cross_hatching.fs +47 -0
  520. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/cross_stitching.fs +57 -0
  521. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/cubes_panning.fs +60 -0
  522. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/depth.fs +26 -0
  523. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/distortion.fs +54 -0
  524. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/dream_vision.fs +37 -0
  525. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/eratosthenes.fs +60 -0
  526. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/fisheye.fs +43 -0
  527. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/fog.fs +94 -0
  528. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/grayscale.fs +25 -0
  529. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/julia_set.fs +83 -0
  530. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/lighting.fs +81 -0
  531. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/mask.fs +24 -0
  532. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/outline.fs +34 -0
  533. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/palette_switch.fs +41 -0
  534. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/pixelizer.fs +32 -0
  535. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/posterization.fs +29 -0
  536. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/predator.fs +31 -0
  537. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/raymarching.fs +431 -0
  538. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/reload.fs +39 -0
  539. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/scanlines.fs +44 -0
  540. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/sobel.fs +40 -0
  541. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/spotlight.fs +77 -0
  542. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/swirl.fs +46 -0
  543. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/wave.fs +36 -0
  544. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/base.fs +22 -0
  545. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/base.vs +26 -0
  546. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/base_lighting.vs +59 -0
  547. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/bloom.fs +37 -0
  548. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/blur.fs +32 -0
  549. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/cross_hatching.fs +45 -0
  550. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/cross_stitching.fs +55 -0
  551. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/distortion.fs +52 -0
  552. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/dream_vision.fs +35 -0
  553. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/fisheye.fs +41 -0
  554. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/fog.fs +92 -0
  555. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/grayscale.fs +23 -0
  556. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/palette_switch.fs +27 -0
  557. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/pixelizer.fs +30 -0
  558. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/posterization.fs +27 -0
  559. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/predator.fs +29 -0
  560. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/scanlines.fs +42 -0
  561. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/sobel.fs +38 -0
  562. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/swirl.fs +44 -0
  563. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/base.fs +25 -0
  564. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/base.vs +26 -0
  565. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/base_lighting.vs +32 -0
  566. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/base_lighting_instanced.vs +36 -0
  567. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/bloom.fs +40 -0
  568. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/blur.fs +35 -0
  569. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/color_mix.fs +27 -0
  570. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/cross_hatching.fs +48 -0
  571. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/cross_stitching.fs +59 -0
  572. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/cubes_panning.fs +61 -0
  573. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/depth.fs +27 -0
  574. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/distortion.fs +56 -0
  575. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/dream_vision.fs +34 -0
  576. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/eratosthenes.fs +59 -0
  577. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/fisheye.fs +40 -0
  578. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/fog.fs +95 -0
  579. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/grayscale.fs +26 -0
  580. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/julia_set.fs +81 -0
  581. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/lighting.fs +82 -0
  582. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/mask.fs +22 -0
  583. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/outline.fs +35 -0
  584. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/overdraw.fs +26 -0
  585. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/palette_switch.fs +30 -0
  586. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/pixelizer.fs +33 -0
  587. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/posterization.fs +31 -0
  588. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/predator.fs +32 -0
  589. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/raymarching.fs +430 -0
  590. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/reload.fs +40 -0
  591. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/scanlines.fs +49 -0
  592. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/sobel.fs +41 -0
  593. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/spotlight.fs +65 -0
  594. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/swirl.fs +47 -0
  595. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/wave.fs +37 -0
  596. package/vendor/raylib/examples/shaders/resources/space.png +0 -0
  597. package/vendor/raylib/examples/shaders/resources/texel_checker.png +0 -0
  598. package/vendor/raylib/examples/shaders/rlights.h +183 -0
  599. package/vendor/raylib/examples/shaders/shaders_basic_lighting.c +152 -0
  600. package/vendor/raylib/examples/shaders/shaders_basic_lighting.png +0 -0
  601. package/vendor/raylib/examples/shaders/shaders_custom_uniform.c +127 -0
  602. package/vendor/raylib/examples/shaders/shaders_custom_uniform.png +0 -0
  603. package/vendor/raylib/examples/shaders/shaders_eratosthenes.c +92 -0
  604. package/vendor/raylib/examples/shaders/shaders_eratosthenes.png +0 -0
  605. package/vendor/raylib/examples/shaders/shaders_fog.c +160 -0
  606. package/vendor/raylib/examples/shaders/shaders_fog.png +0 -0
  607. package/vendor/raylib/examples/shaders/shaders_hot_reloading.c +130 -0
  608. package/vendor/raylib/examples/shaders/shaders_hot_reloading.png +0 -0
  609. package/vendor/raylib/examples/shaders/shaders_julia_set.c +191 -0
  610. package/vendor/raylib/examples/shaders/shaders_julia_set.png +0 -0
  611. package/vendor/raylib/examples/shaders/shaders_mesh_instancing.c +224 -0
  612. package/vendor/raylib/examples/shaders/shaders_mesh_instancing.png +0 -0
  613. package/vendor/raylib/examples/shaders/shaders_model_shader.c +103 -0
  614. package/vendor/raylib/examples/shaders/shaders_model_shader.png +0 -0
  615. package/vendor/raylib/examples/shaders/shaders_multi_sample2d.c +105 -0
  616. package/vendor/raylib/examples/shaders/shaders_multi_sample2d.png +0 -0
  617. package/vendor/raylib/examples/shaders/shaders_palette_switch.c +147 -0
  618. package/vendor/raylib/examples/shaders/shaders_palette_switch.png +0 -0
  619. package/vendor/raylib/examples/shaders/shaders_postprocessing.c +170 -0
  620. package/vendor/raylib/examples/shaders/shaders_postprocessing.png +0 -0
  621. package/vendor/raylib/examples/shaders/shaders_raymarching.c +113 -0
  622. package/vendor/raylib/examples/shaders/shaders_raymarching.png +0 -0
  623. package/vendor/raylib/examples/shaders/shaders_shapes_textures.c +116 -0
  624. package/vendor/raylib/examples/shaders/shaders_shapes_textures.png +0 -0
  625. package/vendor/raylib/examples/shaders/shaders_simple_mask.c +144 -0
  626. package/vendor/raylib/examples/shaders/shaders_simple_mask.png +0 -0
  627. package/vendor/raylib/examples/shaders/shaders_spotlight.c +254 -0
  628. package/vendor/raylib/examples/shaders/shaders_spotlight.png +0 -0
  629. package/vendor/raylib/examples/shaders/shaders_texture_drawing.c +80 -0
  630. package/vendor/raylib/examples/shaders/shaders_texture_drawing.png +0 -0
  631. package/vendor/raylib/examples/shaders/shaders_texture_outline.c +97 -0
  632. package/vendor/raylib/examples/shaders/shaders_texture_outline.png +0 -0
  633. package/vendor/raylib/examples/shaders/shaders_texture_waves.c +110 -0
  634. package/vendor/raylib/examples/shaders/shaders_texture_waves.png +0 -0
  635. package/vendor/raylib/examples/shapes/shapes_basic_shapes.c +78 -0
  636. package/vendor/raylib/examples/shapes/shapes_basic_shapes.png +0 -0
  637. package/vendor/raylib/examples/shapes/shapes_bouncing_ball.c +76 -0
  638. package/vendor/raylib/examples/shapes/shapes_bouncing_ball.png +0 -0
  639. package/vendor/raylib/examples/shapes/shapes_collision_area.c +108 -0
  640. package/vendor/raylib/examples/shapes/shapes_collision_area.png +0 -0
  641. package/vendor/raylib/examples/shapes/shapes_colors_palette.c +99 -0
  642. package/vendor/raylib/examples/shapes/shapes_colors_palette.png +0 -0
  643. package/vendor/raylib/examples/shapes/shapes_draw_circle_sector.c +83 -0
  644. package/vendor/raylib/examples/shapes/shapes_draw_circle_sector.png +0 -0
  645. package/vendor/raylib/examples/shapes/shapes_draw_rectangle_rounded.c +89 -0
  646. package/vendor/raylib/examples/shapes/shapes_draw_rectangle_rounded.png +0 -0
  647. package/vendor/raylib/examples/shapes/shapes_draw_ring.c +96 -0
  648. package/vendor/raylib/examples/shapes/shapes_draw_ring.png +0 -0
  649. package/vendor/raylib/examples/shapes/shapes_easings_ball_anim.c +110 -0
  650. package/vendor/raylib/examples/shapes/shapes_easings_ball_anim.png +0 -0
  651. package/vendor/raylib/examples/shapes/shapes_easings_box_anim.c +136 -0
  652. package/vendor/raylib/examples/shapes/shapes_easings_box_anim.png +0 -0
  653. package/vendor/raylib/examples/shapes/shapes_easings_rectangle_array.c +118 -0
  654. package/vendor/raylib/examples/shapes/shapes_easings_rectangle_array.png +0 -0
  655. package/vendor/raylib/examples/shapes/shapes_following_eyes.c +104 -0
  656. package/vendor/raylib/examples/shapes/shapes_following_eyes.png +0 -0
  657. package/vendor/raylib/examples/shapes/shapes_lines_bezier.c +59 -0
  658. package/vendor/raylib/examples/shapes/shapes_lines_bezier.png +0 -0
  659. package/vendor/raylib/examples/shapes/shapes_logo_raylib.c +56 -0
  660. package/vendor/raylib/examples/shapes/shapes_logo_raylib.png +0 -0
  661. package/vendor/raylib/examples/shapes/shapes_logo_raylib_anim.c +160 -0
  662. package/vendor/raylib/examples/shapes/shapes_logo_raylib_anim.png +0 -0
  663. package/vendor/raylib/examples/shapes/shapes_rectangle_scaling.c +94 -0
  664. package/vendor/raylib/examples/shapes/shapes_rectangle_scaling.png +0 -0
  665. package/vendor/raylib/examples/text/resources/KAISG.ttf +0 -0
  666. package/vendor/raylib/examples/text/resources/LICENSE.md +20 -0
  667. package/vendor/raylib/examples/text/resources/anonymous_pro_bold.ttf +0 -0
  668. package/vendor/raylib/examples/text/resources/custom_alagard.png +0 -0
  669. package/vendor/raylib/examples/text/resources/custom_jupiter_crash.png +0 -0
  670. package/vendor/raylib/examples/text/resources/custom_mecha.png +0 -0
  671. package/vendor/raylib/examples/text/resources/dejavu.fnt +1115 -0
  672. package/vendor/raylib/examples/text/resources/dejavu.png +0 -0
  673. package/vendor/raylib/examples/text/resources/fonts/alagard.png +0 -0
  674. package/vendor/raylib/examples/text/resources/fonts/alpha_beta.png +0 -0
  675. package/vendor/raylib/examples/text/resources/fonts/jupiter_crash.png +0 -0
  676. package/vendor/raylib/examples/text/resources/fonts/mecha.png +0 -0
  677. package/vendor/raylib/examples/text/resources/fonts/pixantiqua.png +0 -0
  678. package/vendor/raylib/examples/text/resources/fonts/pixelplay.png +0 -0
  679. package/vendor/raylib/examples/text/resources/fonts/romulus.png +0 -0
  680. package/vendor/raylib/examples/text/resources/fonts/setback.png +0 -0
  681. package/vendor/raylib/examples/text/resources/noto_cjk.fnt +580 -0
  682. package/vendor/raylib/examples/text/resources/noto_cjk.png +0 -0
  683. package/vendor/raylib/examples/text/resources/pixantiqua.fnt +188 -0
  684. package/vendor/raylib/examples/text/resources/pixantiqua.png +0 -0
  685. package/vendor/raylib/examples/text/resources/pixantiqua.ttf +0 -0
  686. package/vendor/raylib/examples/text/resources/shaders/glsl100/alpha_discard.fs +20 -0
  687. package/vendor/raylib/examples/text/resources/shaders/glsl100/sdf.fs +25 -0
  688. package/vendor/raylib/examples/text/resources/shaders/glsl330/alpha_discard.fs +19 -0
  689. package/vendor/raylib/examples/text/resources/shaders/glsl330/sdf.fs +26 -0
  690. package/vendor/raylib/examples/text/resources/symbola.fnt +191 -0
  691. package/vendor/raylib/examples/text/resources/symbola.png +0 -0
  692. package/vendor/raylib/examples/text/text_draw_3d.c +739 -0
  693. package/vendor/raylib/examples/text/text_draw_3d.png +0 -0
  694. package/vendor/raylib/examples/text/text_font_filters.c +134 -0
  695. package/vendor/raylib/examples/text/text_font_filters.png +0 -0
  696. package/vendor/raylib/examples/text/text_font_loading.c +91 -0
  697. package/vendor/raylib/examples/text/text_font_loading.png +0 -0
  698. package/vendor/raylib/examples/text/text_font_sdf.c +141 -0
  699. package/vendor/raylib/examples/text/text_font_sdf.png +0 -0
  700. package/vendor/raylib/examples/text/text_font_spritefont.c +85 -0
  701. package/vendor/raylib/examples/text/text_font_spritefont.png +0 -0
  702. package/vendor/raylib/examples/text/text_format_text.c +62 -0
  703. package/vendor/raylib/examples/text/text_format_text.png +0 -0
  704. package/vendor/raylib/examples/text/text_input_box.c +127 -0
  705. package/vendor/raylib/examples/text/text_input_box.png +0 -0
  706. package/vendor/raylib/examples/text/text_raylib_fonts.c +105 -0
  707. package/vendor/raylib/examples/text/text_raylib_fonts.png +0 -0
  708. package/vendor/raylib/examples/text/text_rectangle_bounds.c +264 -0
  709. package/vendor/raylib/examples/text/text_rectangle_bounds.png +0 -0
  710. package/vendor/raylib/examples/text/text_unicode.c +465 -0
  711. package/vendor/raylib/examples/text/text_unicode.png +0 -0
  712. package/vendor/raylib/examples/text/text_writing_anim.c +62 -0
  713. package/vendor/raylib/examples/text/text_writing_anim.png +0 -0
  714. package/vendor/raylib/examples/textures/resources/KAISG.ttf +0 -0
  715. package/vendor/raylib/examples/textures/resources/LICENSE.md +18 -0
  716. package/vendor/raylib/examples/textures/resources/boom.wav +0 -0
  717. package/vendor/raylib/examples/textures/resources/button.png +0 -0
  718. package/vendor/raylib/examples/textures/resources/buttonfx.wav +0 -0
  719. package/vendor/raylib/examples/textures/resources/cat.png +0 -0
  720. package/vendor/raylib/examples/textures/resources/custom_jupiter_crash.png +0 -0
  721. package/vendor/raylib/examples/textures/resources/cyberpunk_street_background.png +0 -0
  722. package/vendor/raylib/examples/textures/resources/cyberpunk_street_foreground.png +0 -0
  723. package/vendor/raylib/examples/textures/resources/cyberpunk_street_midground.png +0 -0
  724. package/vendor/raylib/examples/textures/resources/explosion.png +0 -0
  725. package/vendor/raylib/examples/textures/resources/fudesumi.png +0 -0
  726. package/vendor/raylib/examples/textures/resources/fudesumi.raw +0 -0
  727. package/vendor/raylib/examples/textures/resources/ninepatch_button.png +0 -0
  728. package/vendor/raylib/examples/textures/resources/parrots.png +0 -0
  729. package/vendor/raylib/examples/textures/resources/patterns.png +0 -0
  730. package/vendor/raylib/examples/textures/resources/raylib_logo.png +0 -0
  731. package/vendor/raylib/examples/textures/resources/scarfy.png +0 -0
  732. package/vendor/raylib/examples/textures/resources/spark_flame.png +0 -0
  733. package/vendor/raylib/examples/textures/resources/wabbit_alpha.png +0 -0
  734. package/vendor/raylib/examples/textures/textures_background_scrolling.c +87 -0
  735. package/vendor/raylib/examples/textures/textures_background_scrolling.png +0 -0
  736. package/vendor/raylib/examples/textures/textures_blend_modes.c +93 -0
  737. package/vendor/raylib/examples/textures/textures_blend_modes.png +0 -0
  738. package/vendor/raylib/examples/textures/textures_bunnymark.c +120 -0
  739. package/vendor/raylib/examples/textures/textures_bunnymark.png +0 -0
  740. package/vendor/raylib/examples/textures/textures_draw_tiled.c +165 -0
  741. package/vendor/raylib/examples/textures/textures_draw_tiled.png +0 -0
  742. package/vendor/raylib/examples/textures/textures_image_drawing.c +91 -0
  743. package/vendor/raylib/examples/textures/textures_image_drawing.png +0 -0
  744. package/vendor/raylib/examples/textures/textures_image_generation.c +102 -0
  745. package/vendor/raylib/examples/textures/textures_image_generation.png +0 -0
  746. package/vendor/raylib/examples/textures/textures_image_loading.c +64 -0
  747. package/vendor/raylib/examples/textures/textures_image_loading.png +0 -0
  748. package/vendor/raylib/examples/textures/textures_image_processing.c +169 -0
  749. package/vendor/raylib/examples/textures/textures_image_processing.png +0 -0
  750. package/vendor/raylib/examples/textures/textures_image_text.c +83 -0
  751. package/vendor/raylib/examples/textures/textures_image_text.png +0 -0
  752. package/vendor/raylib/examples/textures/textures_logo_raylib.c +57 -0
  753. package/vendor/raylib/examples/textures/textures_logo_raylib.png +0 -0
  754. package/vendor/raylib/examples/textures/textures_mouse_painting.c +221 -0
  755. package/vendor/raylib/examples/textures/textures_mouse_painting.png +0 -0
  756. package/vendor/raylib/examples/textures/textures_npatch_drawing.c +109 -0
  757. package/vendor/raylib/examples/textures/textures_npatch_drawing.png +0 -0
  758. package/vendor/raylib/examples/textures/textures_particles_blending.c +135 -0
  759. package/vendor/raylib/examples/textures/textures_particles_blending.png +0 -0
  760. package/vendor/raylib/examples/textures/textures_polygon.c +100 -0
  761. package/vendor/raylib/examples/textures/textures_polygon.png +0 -0
  762. package/vendor/raylib/examples/textures/textures_raw_data.c +99 -0
  763. package/vendor/raylib/examples/textures/textures_raw_data.png +0 -0
  764. package/vendor/raylib/examples/textures/textures_rectangle.c +99 -0
  765. package/vendor/raylib/examples/textures/textures_rectangle.png +0 -0
  766. package/vendor/raylib/examples/textures/textures_sprite_button.c +97 -0
  767. package/vendor/raylib/examples/textures/textures_sprite_button.png +0 -0
  768. package/vendor/raylib/examples/textures/textures_sprite_explosion.c +120 -0
  769. package/vendor/raylib/examples/textures/textures_sprite_explosion.png +0 -0
  770. package/vendor/raylib/examples/textures/textures_srcrec_dstrec.c +82 -0
  771. package/vendor/raylib/examples/textures/textures_srcrec_dstrec.png +0 -0
  772. package/vendor/raylib/examples/textures/textures_to_image.c +68 -0
  773. package/vendor/raylib/examples/textures/textures_to_image.png +0 -0
  774. package/vendor/raylib/logo/raylib.ico +0 -0
  775. package/vendor/raylib/logo/raylib_128x128.png +0 -0
  776. package/vendor/raylib/logo/raylib_144x144.png +0 -0
  777. package/vendor/raylib/logo/raylib_16x16.png +0 -0
  778. package/vendor/raylib/logo/raylib_180x180.png +0 -0
  779. package/vendor/raylib/logo/raylib_24x24.png +0 -0
  780. package/vendor/raylib/logo/raylib_256x256.png +0 -0
  781. package/vendor/raylib/logo/raylib_32x32.png +0 -0
  782. package/vendor/raylib/logo/raylib_36x36.png +0 -0
  783. package/vendor/raylib/logo/raylib_48x48.png +0 -0
  784. package/vendor/raylib/logo/raylib_512x512.png +0 -0
  785. package/vendor/raylib/logo/raylib_64x64.png +0 -0
  786. package/vendor/raylib/logo/raylib_72x72.png +0 -0
  787. package/vendor/raylib/logo/raylib_96x96.png +0 -0
  788. package/vendor/raylib/logo/raylib_logo_animation.gif +0 -0
  789. package/vendor/raylib/parser/LICENSE +16 -0
  790. package/vendor/raylib/parser/README.md +63 -0
  791. package/vendor/raylib/parser/raylib_api.json +6668 -0
  792. package/vendor/raylib/parser/raylib_api.txt +3568 -0
  793. package/vendor/raylib/parser/raylib_api.xml +2509 -0
  794. package/vendor/raylib/parser/raylib_parser.c +1003 -0
  795. package/vendor/raylib/projects/4coder/Makefile +401 -0
  796. package/vendor/raylib/projects/4coder/Makefile.Android +300 -0
  797. package/vendor/raylib/projects/4coder/main.c +39 -0
  798. package/vendor/raylib/projects/4coder/project.4coder +54 -0
  799. package/vendor/raylib/projects/Builder/README.md +24 -0
  800. package/vendor/raylib/projects/Builder/examples/README.md +1 -0
  801. package/vendor/raylib/projects/Builder/examples/meson.build +25 -0
  802. package/vendor/raylib/projects/Builder/meson.build +25 -0
  803. package/vendor/raylib/projects/CMake/CMakeLists.txt +44 -0
  804. package/vendor/raylib/projects/CMake/core_basic_window.c +62 -0
  805. package/vendor/raylib/projects/CodeBlocks/README.md +22 -0
  806. package/vendor/raylib/projects/CodeBlocks/compiler_settings.png +0 -0
  807. package/vendor/raylib/projects/CodeBlocks/core_basic_window.c +58 -0
  808. package/vendor/raylib/projects/CodeBlocks/core_basic_window.cbp +137 -0
  809. package/vendor/raylib/projects/Geany/core_basic_window.c +52 -0
  810. package/vendor/raylib/projects/Geany/raylib.c.tags +452 -0
  811. package/vendor/raylib/projects/Geany/raylib_compile_execute.bat +21 -0
  812. package/vendor/raylib/projects/Geany/raylib_compile_sources.bat +42 -0
  813. package/vendor/raylib/projects/Geany/raylib_project.geany +41 -0
  814. package/vendor/raylib/projects/Notepad++/README.md +19 -0
  815. package/vendor/raylib/projects/Notepad++/c_raylib.xml +3104 -0
  816. package/vendor/raylib/projects/Notepad++/npes_saved_mingw.txt +0 -0
  817. package/vendor/raylib/projects/Notepad++/npes_saved_tcc.txt +0 -0
  818. package/vendor/raylib/projects/Notepad++/npes_saved_w64devkit.txt +0 -0
  819. package/vendor/raylib/projects/Notepad++/npes_saved_zig.txt +0 -0
  820. package/vendor/raylib/projects/Notepad++/raylib_npp_parser/raylib_npp.xml +3060 -0
  821. package/vendor/raylib/projects/Notepad++/raylib_npp_parser/raylib_npp_parser.c +150 -0
  822. package/vendor/raylib/projects/Notepad++/raylib_npp_parser/raylib_to_parse.h +631 -0
  823. package/vendor/raylib/projects/README.md +18 -0
  824. package/vendor/raylib/projects/SublimeText/README.md +13 -0
  825. package/vendor/raylib/projects/SublimeText/raylib.sublime-build +13 -0
  826. package/vendor/raylib/projects/SublimeText/raylib.sublime-project +8 -0
  827. package/vendor/raylib/projects/VS2019/raylib/raylib.rc +0 -0
  828. package/vendor/raylib/projects/VS2019/raylib/resource.h +14 -0
  829. package/vendor/raylib/projects/VS2019-Android/raylib_android/raylib_android.NativeActivity/android_native_app_glue.c +437 -0
  830. package/vendor/raylib/projects/VS2019-Android/raylib_android/raylib_android.NativeActivity/android_native_app_glue.h +344 -0
  831. package/vendor/raylib/projects/VS2019-Android/raylib_android/raylib_android.NativeActivity/main.c +64 -0
  832. package/vendor/raylib/projects/VS2019-Android/raylib_android/raylib_android.Packaging/AndroidManifest.xml +22 -0
  833. package/vendor/raylib/projects/VS2019-Android/raylib_android/raylib_android.Packaging/build.xml +90 -0
  834. package/vendor/raylib/projects/VS2019-Android/raylib_android/raylib_android.Packaging/project.properties +3 -0
  835. package/vendor/raylib/projects/VS2019-Android/raylib_android/raylib_android.Packaging/raylib_android.Packaging.androidproj +134 -0
  836. package/vendor/raylib/projects/VS2019-Android/raylib_android/raylib_android.Packaging/res/values/strings.xml +4 -0
  837. package/vendor/raylib/projects/VSCode/.vscode/c_cpp_properties.json +63 -0
  838. package/vendor/raylib/projects/VSCode/.vscode/launch.json +60 -0
  839. package/vendor/raylib/projects/VSCode/.vscode/settings.json +11 -0
  840. package/vendor/raylib/projects/VSCode/.vscode/tasks.json +71 -0
  841. package/vendor/raylib/projects/VSCode/Makefile +408 -0
  842. package/vendor/raylib/projects/VSCode/Makefile.Android +300 -0
  843. package/vendor/raylib/projects/VSCode/main.c +83 -0
  844. package/vendor/raylib/projects/VSCode/main.code-workspace +16 -0
  845. package/vendor/raylib/projects/scripts/README.md +68 -0
  846. package/vendor/raylib/projects/scripts/build-linux.sh +169 -0
  847. package/vendor/raylib/projects/scripts/build-osx.sh +171 -0
  848. package/vendor/raylib/projects/scripts/build-rpi.sh +169 -0
  849. package/vendor/raylib/projects/scripts/build-windows.bat +219 -0
  850. package/vendor/raylib/projects/scripts/core_basic_window.c +61 -0
  851. package/vendor/raylib/raylib.pc.in +13 -0
  852. package/vendor/raylib/src/CMakeLists.txt +121 -0
  853. package/vendor/raylib/src/Makefile +696 -0
  854. package/vendor/raylib/src/build.zig +60 -0
  855. package/vendor/raylib/src/config.h +230 -0
  856. package/vendor/raylib/src/external/cgltf.h +6501 -0
  857. package/vendor/raylib/src/external/dirent.h +183 -0
  858. package/vendor/raylib/src/external/dr_flac.h +12269 -0
  859. package/vendor/raylib/src/external/dr_mp3.h +4787 -0
  860. package/vendor/raylib/src/external/dr_wav.h +8019 -0
  861. package/vendor/raylib/src/external/glad.h +8640 -0
  862. package/vendor/raylib/src/external/glfw/.mailmap +10 -0
  863. package/vendor/raylib/src/external/glfw/CMake/GenerateMappings.cmake +33 -0
  864. package/vendor/raylib/src/external/glfw/CMake/Info.plist.in +38 -0
  865. package/vendor/raylib/src/external/glfw/CMake/MacOSXBundleInfo.plist.in +38 -0
  866. package/vendor/raylib/src/external/glfw/CMake/cmake_uninstall.cmake.in +29 -0
  867. package/vendor/raylib/src/external/glfw/CMake/glfw3.pc.in +13 -0
  868. package/vendor/raylib/src/external/glfw/CMake/glfw3Config.cmake.in +3 -0
  869. package/vendor/raylib/src/external/glfw/CMake/i686-w64-mingw32-clang.cmake +13 -0
  870. package/vendor/raylib/src/external/glfw/CMake/i686-w64-mingw32.cmake +13 -0
  871. package/vendor/raylib/src/external/glfw/CMake/modules/FindEpollShim.cmake +17 -0
  872. package/vendor/raylib/src/external/glfw/CMake/modules/FindOSMesa.cmake +18 -0
  873. package/vendor/raylib/src/external/glfw/CMake/modules/FindWaylandProtocols.cmake +26 -0
  874. package/vendor/raylib/src/external/glfw/CMake/modules/FindXKBCommon.cmake +34 -0
  875. package/vendor/raylib/src/external/glfw/CMake/x86_64-w64-mingw32-clang.cmake +13 -0
  876. package/vendor/raylib/src/external/glfw/CMake/x86_64-w64-mingw32.cmake +13 -0
  877. package/vendor/raylib/src/external/glfw/CMakeLists.txt +323 -0
  878. package/vendor/raylib/src/external/glfw/LICENSE.md +23 -0
  879. package/vendor/raylib/src/external/glfw/README.md +477 -0
  880. package/vendor/raylib/src/external/glfw/deps/getopt.c +230 -0
  881. package/vendor/raylib/src/external/glfw/deps/getopt.h +57 -0
  882. package/vendor/raylib/src/external/glfw/deps/glad/gl.h +3840 -0
  883. package/vendor/raylib/src/external/glfw/deps/glad/khrplatform.h +282 -0
  884. package/vendor/raylib/src/external/glfw/deps/glad/vk_platform.h +92 -0
  885. package/vendor/raylib/src/external/glfw/deps/glad/vulkan.h +3480 -0
  886. package/vendor/raylib/src/external/glfw/deps/glad_gl.c +1791 -0
  887. package/vendor/raylib/src/external/glfw/deps/glad_vulkan.c +593 -0
  888. package/vendor/raylib/src/external/glfw/deps/mingw/_mingw_dxhelper.h +117 -0
  889. package/vendor/raylib/src/external/glfw/deps/mingw/dinput.h +2467 -0
  890. package/vendor/raylib/src/external/glfw/deps/mingw/xinput.h +239 -0
  891. package/vendor/raylib/src/external/glfw/deps/vs2008/stdint.h +247 -0
  892. package/vendor/raylib/src/external/glfw/include/GLFW/glfw3.h +6075 -0
  893. package/vendor/raylib/src/external/glfw/include/GLFW/glfw3native.h +530 -0
  894. package/vendor/raylib/src/external/glfw/src/CMakeLists.txt +246 -0
  895. package/vendor/raylib/src/external/glfw/src/cocoa_init.m +620 -0
  896. package/vendor/raylib/src/external/glfw/src/cocoa_joystick.h +46 -0
  897. package/vendor/raylib/src/external/glfw/src/cocoa_joystick.m +483 -0
  898. package/vendor/raylib/src/external/glfw/src/cocoa_monitor.m +631 -0
  899. package/vendor/raylib/src/external/glfw/src/cocoa_platform.h +206 -0
  900. package/vendor/raylib/src/external/glfw/src/cocoa_time.c +62 -0
  901. package/vendor/raylib/src/external/glfw/src/cocoa_window.m +1923 -0
  902. package/vendor/raylib/src/external/glfw/src/context.c +756 -0
  903. package/vendor/raylib/src/external/glfw/src/egl_context.c +846 -0
  904. package/vendor/raylib/src/external/glfw/src/egl_context.h +229 -0
  905. package/vendor/raylib/src/external/glfw/src/glfw.rc.in +30 -0
  906. package/vendor/raylib/src/external/glfw/src/glfw_config.h.in +58 -0
  907. package/vendor/raylib/src/external/glfw/src/glx_context.c +699 -0
  908. package/vendor/raylib/src/external/glfw/src/glx_context.h +181 -0
  909. package/vendor/raylib/src/external/glfw/src/init.c +357 -0
  910. package/vendor/raylib/src/external/glfw/src/input.c +1406 -0
  911. package/vendor/raylib/src/external/glfw/src/internal.h +799 -0
  912. package/vendor/raylib/src/external/glfw/src/linux_joystick.c +428 -0
  913. package/vendor/raylib/src/external/glfw/src/linux_joystick.h +59 -0
  914. package/vendor/raylib/src/external/glfw/src/mappings.h +1550 -0
  915. package/vendor/raylib/src/external/glfw/src/mappings.h.in +73 -0
  916. package/vendor/raylib/src/external/glfw/src/monitor.c +542 -0
  917. package/vendor/raylib/src/external/glfw/src/nsgl_context.h +66 -0
  918. package/vendor/raylib/src/external/glfw/src/nsgl_context.m +369 -0
  919. package/vendor/raylib/src/external/glfw/src/null_init.c +57 -0
  920. package/vendor/raylib/src/external/glfw/src/null_joystick.c +53 -0
  921. package/vendor/raylib/src/external/glfw/src/null_joystick.h +31 -0
  922. package/vendor/raylib/src/external/glfw/src/null_monitor.c +159 -0
  923. package/vendor/raylib/src/external/glfw/src/null_platform.h +89 -0
  924. package/vendor/raylib/src/external/glfw/src/null_window.c +670 -0
  925. package/vendor/raylib/src/external/glfw/src/osmesa_context.c +372 -0
  926. package/vendor/raylib/src/external/glfw/src/osmesa_context.h +90 -0
  927. package/vendor/raylib/src/external/glfw/src/posix_thread.c +105 -0
  928. package/vendor/raylib/src/external/glfw/src/posix_thread.h +51 -0
  929. package/vendor/raylib/src/external/glfw/src/posix_time.c +90 -0
  930. package/vendor/raylib/src/external/glfw/src/posix_time.h +44 -0
  931. package/vendor/raylib/src/external/glfw/src/vulkan.c +332 -0
  932. package/vendor/raylib/src/external/glfw/src/wgl_context.c +798 -0
  933. package/vendor/raylib/src/external/glfw/src/wgl_context.h +160 -0
  934. package/vendor/raylib/src/external/glfw/src/win32_init.c +636 -0
  935. package/vendor/raylib/src/external/glfw/src/win32_joystick.c +753 -0
  936. package/vendor/raylib/src/external/glfw/src/win32_joystick.h +53 -0
  937. package/vendor/raylib/src/external/glfw/src/win32_monitor.c +537 -0
  938. package/vendor/raylib/src/external/glfw/src/win32_platform.h +462 -0
  939. package/vendor/raylib/src/external/glfw/src/win32_thread.c +99 -0
  940. package/vendor/raylib/src/external/glfw/src/win32_time.c +76 -0
  941. package/vendor/raylib/src/external/glfw/src/win32_window.c +2405 -0
  942. package/vendor/raylib/src/external/glfw/src/window.c +1114 -0
  943. package/vendor/raylib/src/external/glfw/src/wl_init.c +1310 -0
  944. package/vendor/raylib/src/external/glfw/src/wl_monitor.c +231 -0
  945. package/vendor/raylib/src/external/glfw/src/wl_platform.h +352 -0
  946. package/vendor/raylib/src/external/glfw/src/wl_window.c +1814 -0
  947. package/vendor/raylib/src/external/glfw/src/x11_init.c +1500 -0
  948. package/vendor/raylib/src/external/glfw/src/x11_monitor.c +614 -0
  949. package/vendor/raylib/src/external/glfw/src/x11_platform.h +798 -0
  950. package/vendor/raylib/src/external/glfw/src/x11_window.c +3310 -0
  951. package/vendor/raylib/src/external/glfw/src/xkb_unicode.c +942 -0
  952. package/vendor/raylib/src/external/glfw/src/xkb_unicode.h +28 -0
  953. package/vendor/raylib/src/external/jar_mod.h +1596 -0
  954. package/vendor/raylib/src/external/jar_xm.h +2470 -0
  955. package/vendor/raylib/src/external/miniaudio.h +70273 -0
  956. package/vendor/raylib/src/external/msf_gif.h +717 -0
  957. package/vendor/raylib/src/external/par_shapes.h +2155 -0
  958. package/vendor/raylib/src/external/sdefl.h +696 -0
  959. package/vendor/raylib/src/external/sinfl.h +584 -0
  960. package/vendor/raylib/src/external/stb_image.h +7897 -0
  961. package/vendor/raylib/src/external/stb_image_resize.h +2634 -0
  962. package/vendor/raylib/src/external/stb_image_write.h +1724 -0
  963. package/vendor/raylib/src/external/stb_rect_pack.h +623 -0
  964. package/vendor/raylib/src/external/stb_truetype.h +5077 -0
  965. package/vendor/raylib/src/external/stb_vorbis.h +5475 -0
  966. package/vendor/raylib/src/external/tinyobj_loader_c.h +1589 -0
  967. package/vendor/raylib/src/external/vox_loader.h +710 -0
  968. package/vendor/raylib/src/extras/easings.h +263 -0
  969. package/vendor/raylib/src/extras/physac.h +1977 -0
  970. package/vendor/raylib/src/extras/raygui.h +4342 -0
  971. package/vendor/raylib/src/extras/rmem.h +751 -0
  972. package/vendor/raylib/src/raudio.c +2380 -0
  973. package/vendor/raylib/src/raudio.h +198 -0
  974. package/vendor/raylib/src/raylib.dll.rc +27 -0
  975. package/vendor/raylib/src/raylib.dll.rc.data +0 -0
  976. package/vendor/raylib/src/raylib.h +1536 -0
  977. package/vendor/raylib/src/raylib.ico +0 -0
  978. package/vendor/raylib/src/raylib.rc +27 -0
  979. package/vendor/raylib/src/raylib.rc.data +0 -0
  980. package/vendor/raylib/src/raymath.h +1853 -0
  981. package/vendor/raylib/src/rcamera.h +567 -0
  982. package/vendor/raylib/src/rcore.c +6772 -0
  983. package/vendor/raylib/src/rgestures.h +566 -0
  984. package/vendor/raylib/src/rglfw.c +126 -0
  985. package/vendor/raylib/src/rlgl.h +4677 -0
  986. package/vendor/raylib/src/rmodels.c +5041 -0
  987. package/vendor/raylib/src/rshapes.c +1759 -0
  988. package/vendor/raylib/src/rtext.c +1790 -0
  989. package/vendor/raylib/src/rtextures.c +4761 -0
  990. package/vendor/raylib/src/shell.html +328 -0
  991. package/vendor/raylib/src/utils.c +433 -0
  992. package/vendor/raylib/src/utils.h +81 -0
  993. package/vendor/sqlite3/shell.c +23487 -0
  994. package/vendor/sqlite3/sqlite3.c +239246 -0
  995. package/vendor/sqlite3/sqlite3.h +12802 -0
  996. package/vendor/sqlite3/sqlite3ext.h +689 -0
  997. package/CMakeLists.txt +0 -63
@@ -0,0 +1,2470 @@
1
+ // jar_xm.h
2
+ //
3
+ // ORIGINAL LICENSE - FOR LIBXM:
4
+ //
5
+ // Author: Romain "Artefact2" Dalmaso <artefact2@gmail.com>
6
+ // Contributor: Dan Spencer <dan@atomicpotato.net>
7
+ // Repackaged into jar_xm.h By: Joshua Adam Reisenauer <kd7tck@gmail.com>
8
+ // This program is free software. It comes without any warranty, to the
9
+ // extent permitted by applicable law. You can redistribute it and/or
10
+ // modify it under the terms of the Do What The Fuck You Want To Public
11
+ // License, Version 2, as published by Sam Hocevar. See
12
+ // http://sam.zoy.org/wtfpl/COPYING for more details.
13
+ //
14
+ // HISTORY:
15
+ // v0.1.0 2016-02-22 jar_xm.h - development by Joshua Reisenauer, MAR 2016
16
+ // v0.2.1 2021-03-07 m4ntr0n1c: Fix clipping noise for "bad" xm's (they will always clip), avoid clip noise and just put a ceiling)
17
+ // v0.2.2 2021-03-09 m4ntr0n1c: Add complete debug solution (raylib.h must be included)
18
+ // v0.2.3 2021-03-11 m4ntr0n1c: Fix tempo, bpm and volume on song stop / start / restart / loop
19
+ // v0.2.4 2021-03-17 m4ntr0n1c: Sanitize code for readability
20
+ // v0.2.5 2021-03-22 m4ntr0n1c: Minor adjustments
21
+ // v0.2.6 2021-04-01 m4ntr0n1c: Minor fixes and optimisation
22
+ // v0.3.0 2021-04-03 m4ntr0n1c: Addition of Stereo sample support, Linear Interpolation and Ramping now addressable options in code
23
+ // v0.3.1 2021-04-04 m4ntr0n1c: Volume effects column adjustments, sample offset handling adjustments
24
+ //
25
+ // USAGE:
26
+ //
27
+ // In ONE source file, put:
28
+ //
29
+ // #define JAR_XM_IMPLEMENTATION
30
+ // #include "jar_xm.h"
31
+ //
32
+ // Other source files should just include jar_xm.h
33
+ //
34
+ // SAMPLE CODE:
35
+ //
36
+ // jar_xm_context_t *musicptr;
37
+ // float musicBuffer[48000 / 60];
38
+ // int intro_load(void)
39
+ // {
40
+ // jar_xm_create_context_from_file(&musicptr, 48000, "Song.XM");
41
+ // return 1;
42
+ // }
43
+ // int intro_unload(void)
44
+ // {
45
+ // jar_xm_free_context(musicptr);
46
+ // return 1;
47
+ // }
48
+ // int intro_tick(long counter)
49
+ // {
50
+ // jar_xm_generate_samples(musicptr, musicBuffer, (48000 / 60) / 2);
51
+ // if(IsKeyDown(KEY_ENTER))
52
+ // return 1;
53
+ // return 0;
54
+ // }
55
+ //
56
+ #ifndef INCLUDE_JAR_XM_H
57
+ #define INCLUDE_JAR_XM_H
58
+
59
+ #include <stdint.h>
60
+
61
+ #define JAR_XM_DEBUG 0
62
+ #define JAR_XM_DEFENSIVE 1
63
+ //#define JAR_XM_RAYLIB 0 // set to 0 to disable the RayLib visualizer extension
64
+
65
+ // Allow custom memory allocators
66
+ #ifndef JARXM_MALLOC
67
+ #define JARXM_MALLOC(sz) malloc(sz)
68
+ #endif
69
+ #ifndef JARXM_FREE
70
+ #define JARXM_FREE(p) free(p)
71
+ #endif
72
+
73
+ //-------------------------------------------------------------------------------
74
+ struct jar_xm_context_s;
75
+ typedef struct jar_xm_context_s jar_xm_context_t;
76
+
77
+ #ifdef __cplusplus
78
+ extern "C" {
79
+ #endif
80
+
81
+ //** Create a XM context.
82
+ // * @param moddata the contents of the module
83
+ // * @param rate play rate in Hz, recommended value of 48000
84
+ // * @returns 0 on success
85
+ // * @returns 1 if module data is not sane
86
+ // * @returns 2 if memory allocation failed
87
+ // * @returns 3 unable to open input file
88
+ // * @returns 4 fseek() failed
89
+ // * @returns 5 fread() failed
90
+ // * @returns 6 unkown error
91
+ // * @deprecated This function is unsafe!
92
+ // * @see jar_xm_create_context_safe()
93
+ int jar_xm_create_context_from_file(jar_xm_context_t** ctx, uint32_t rate, const char* filename);
94
+
95
+ //** Create a XM context.
96
+ // * @param moddata the contents of the module
97
+ // * @param rate play rate in Hz, recommended value of 48000
98
+ // * @returns 0 on success
99
+ // * @returns 1 if module data is not sane
100
+ // * @returns 2 if memory allocation failed
101
+ // * @deprecated This function is unsafe!
102
+ // * @see jar_xm_create_context_safe()
103
+ int jar_xm_create_context(jar_xm_context_t** ctx, const char* moddata, uint32_t rate);
104
+
105
+ //** Create a XM context.
106
+ // * @param moddata the contents of the module
107
+ // * @param moddata_length the length of the contents of the module, in bytes
108
+ // * @param rate play rate in Hz, recommended value of 48000
109
+ // * @returns 0 on success
110
+ // * @returns 1 if module data is not sane
111
+ // * @returns 2 if memory allocation failed
112
+ int jar_xm_create_context_safe(jar_xm_context_t** ctx, const char* moddata, size_t moddata_length, uint32_t rate);
113
+
114
+ //** Free a XM context created by jar_xm_create_context(). */
115
+ void jar_xm_free_context(jar_xm_context_t* ctx);
116
+
117
+ //** Play the module and put the sound samples in an output buffer.
118
+ // * @param output buffer of 2*numsamples elements (A left and right value for each sample)
119
+ // * @param numsamples number of samples to generate
120
+ void jar_xm_generate_samples(jar_xm_context_t* ctx, float* output, size_t numsamples);
121
+
122
+ //** Play the module, resample from float to 16 bit, and put the sound samples in an output buffer.
123
+ // * @param output buffer of 2*numsamples elements (A left and right value for each sample)
124
+ // * @param numsamples number of samples to generate
125
+ void jar_xm_generate_samples_16bit(jar_xm_context_t* ctx, short* output, size_t numsamples) {
126
+ float* musicBuffer = JARXM_MALLOC((2*numsamples)*sizeof(float));
127
+ jar_xm_generate_samples(ctx, musicBuffer, numsamples);
128
+
129
+ if(output){
130
+ for(int x=0;x<2*numsamples;x++) output[x] = (musicBuffer[x] * 32767.0f); // scale sample to signed small int
131
+ }
132
+ JARXM_FREE(musicBuffer);
133
+ }
134
+
135
+ //** Play the module, resample from float to 8 bit, and put the sound samples in an output buffer.
136
+ // * @param output buffer of 2*numsamples elements (A left and right value for each sample)
137
+ // * @param numsamples number of samples to generate
138
+ void jar_xm_generate_samples_8bit(jar_xm_context_t* ctx, char* output, size_t numsamples) {
139
+ float* musicBuffer = JARXM_MALLOC((2*numsamples)*sizeof(float));
140
+ jar_xm_generate_samples(ctx, musicBuffer, numsamples);
141
+
142
+ if(output){
143
+ for(int x=0;x<2*numsamples;x++) output[x] = (musicBuffer[x] * 127.0f); // scale sample to signed 8 bit
144
+ }
145
+ JARXM_FREE(musicBuffer);
146
+ }
147
+
148
+ //** Set the maximum number of times a module can loop. After the specified number of loops, calls to jar_xm_generate_samples will only generate silence. You can control the current number of loops with jar_xm_get_loop_count().
149
+ // * @param loopcnt maximum number of loops. Use 0 to loop indefinitely.
150
+ void jar_xm_set_max_loop_count(jar_xm_context_t* ctx, uint8_t loopcnt);
151
+
152
+ //** Get the loop count of the currently playing module. This value is 0 when the module is still playing, 1 when the module has looped once, etc.
153
+ uint8_t jar_xm_get_loop_count(jar_xm_context_t* ctx);
154
+
155
+ //** Mute or unmute a channel.
156
+ // * @note Channel numbers go from 1 to jar_xm_get_number_of_channels(...).
157
+ // * @return whether the channel was muted.
158
+ bool jar_xm_mute_channel(jar_xm_context_t* ctx, uint16_t, bool);
159
+
160
+ //** Mute or unmute an instrument.
161
+ // * @note Instrument numbers go from 1 to jar_xm_get_number_of_instruments(...).
162
+ // * @return whether the instrument was muted.
163
+ bool jar_xm_mute_instrument(jar_xm_context_t* ctx, uint16_t, bool);
164
+
165
+ //** Get the module name as a NUL-terminated string.
166
+ const char* jar_xm_get_module_name(jar_xm_context_t* ctx);
167
+
168
+ //** Get the tracker name as a NUL-terminated string.
169
+ const char* jar_xm_get_tracker_name(jar_xm_context_t* ctx);
170
+
171
+ //** Get the number of channels.
172
+ uint16_t jar_xm_get_number_of_channels(jar_xm_context_t* ctx);
173
+
174
+ //** Get the module length (in patterns).
175
+ uint16_t jar_xm_get_module_length(jar_xm_context_t*);
176
+
177
+ //** Get the number of patterns.
178
+ uint16_t jar_xm_get_number_of_patterns(jar_xm_context_t* ctx);
179
+
180
+ //** Get the number of rows of a pattern.
181
+ // * @note Pattern numbers go from 0 to jar_xm_get_number_of_patterns(...)-1.
182
+ uint16_t jar_xm_get_number_of_rows(jar_xm_context_t* ctx, uint16_t);
183
+
184
+ //** Get the number of instruments.
185
+ uint16_t jar_xm_get_number_of_instruments(jar_xm_context_t* ctx);
186
+
187
+ //** Get the number of samples of an instrument.
188
+ // * @note Instrument numbers go from 1 to jar_xm_get_number_of_instruments(...).
189
+ uint16_t jar_xm_get_number_of_samples(jar_xm_context_t* ctx, uint16_t);
190
+
191
+ //** Get the current module speed.
192
+ // * @param bpm will receive the current BPM
193
+ // * @param tempo will receive the current tempo (ticks per line)
194
+ void jar_xm_get_playing_speed(jar_xm_context_t* ctx, uint16_t* bpm, uint16_t* tempo);
195
+
196
+ //** Get the current position in the module being played.
197
+ // * @param pattern_index if not NULL, will receive the current pattern index in the POT (pattern order table)
198
+ // * @param pattern if not NULL, will receive the current pattern number
199
+ // * @param row if not NULL, will receive the current row
200
+ // * @param samples if not NULL, will receive the total number of
201
+ // * generated samples (divide by sample rate to get seconds of generated audio)
202
+ void jar_xm_get_position(jar_xm_context_t* ctx, uint8_t* pattern_index, uint8_t* pattern, uint8_t* row, uint64_t* samples);
203
+
204
+ //** Get the latest time (in number of generated samples) when a particular instrument was triggered in any channel.
205
+ // * @note Instrument numbers go from 1 to jar_xm_get_number_of_instruments(...).
206
+ uint64_t jar_xm_get_latest_trigger_of_instrument(jar_xm_context_t* ctx, uint16_t);
207
+
208
+ //** Get the latest time (in number of generated samples) when a particular sample was triggered in any channel.
209
+ // * @note Instrument numbers go from 1 to jar_xm_get_number_of_instruments(...).
210
+ // * @note Sample numbers go from 0 to jar_xm_get_nubmer_of_samples(...,instr)-1.
211
+ uint64_t jar_xm_get_latest_trigger_of_sample(jar_xm_context_t* ctx, uint16_t instr, uint16_t sample);
212
+
213
+ //** Get the latest time (in number of generated samples) when any instrument was triggered in a given channel.
214
+ // * @note Channel numbers go from 1 to jar_xm_get_number_of_channels(...).
215
+ uint64_t jar_xm_get_latest_trigger_of_channel(jar_xm_context_t* ctx, uint16_t);
216
+
217
+ //** Get the number of remaining samples. Divide by 2 to get the number of individual LR data samples.
218
+ // * @note This is the remaining number of samples before the loop starts module again, or halts if on last pass.
219
+ // * @note This function is very slow and should only be run once, if at all.
220
+ uint64_t jar_xm_get_remaining_samples(jar_xm_context_t* ctx);
221
+
222
+ #ifdef __cplusplus
223
+ }
224
+ #endif
225
+ //-------------------------------------------------------------------------------
226
+
227
+ #ifdef JAR_XM_IMPLEMENTATION
228
+
229
+ #include <math.h>
230
+ #include <stdio.h>
231
+ #include <stdlib.h>
232
+ #include <limits.h>
233
+ #include <string.h>
234
+
235
+ #if JAR_XM_DEBUG //JAR_XM_DEBUG defined as 0
236
+ #include <stdio.h>
237
+ #define DEBUG(fmt, ...) do { \
238
+ fprintf(stderr, "%s(): " fmt "\n", __func__, __VA_ARGS__); \
239
+ fflush(stderr); \
240
+ } while(0)
241
+ #else
242
+ #define DEBUG(...)
243
+ #endif
244
+
245
+ #if jar_xm_BIG_ENDIAN
246
+ #error "Big endian platforms are not yet supported, sorry"
247
+ /* Make sure the compiler stops, even if #error is ignored */
248
+ extern int __fail[-1];
249
+ #endif
250
+
251
+ /* ----- XM constants ----- */
252
+ #define SAMPLE_NAME_LENGTH 22
253
+ #define INSTRUMENT_NAME_LENGTH 22
254
+ #define MODULE_NAME_LENGTH 20
255
+ #define TRACKER_NAME_LENGTH 20
256
+ #define PATTERN_ORDER_TABLE_LENGTH 256
257
+ #define NUM_NOTES 96 // from 1 to 96, where 1 = C-0
258
+ #define NUM_ENVELOPE_POINTS 12 // to be verified if 12 is the max
259
+ #define MAX_NUM_ROWS 256
260
+
261
+ #define jar_xm_SAMPLE_RAMPING_POINTS 8
262
+
263
+ /* ----- Data types ----- */
264
+
265
+ enum jar_xm_waveform_type_e {
266
+ jar_xm_SINE_WAVEFORM = 0,
267
+ jar_xm_RAMP_DOWN_WAVEFORM = 1,
268
+ jar_xm_SQUARE_WAVEFORM = 2,
269
+ jar_xm_RANDOM_WAVEFORM = 3,
270
+ jar_xm_RAMP_UP_WAVEFORM = 4,
271
+ };
272
+ typedef enum jar_xm_waveform_type_e jar_xm_waveform_type_t;
273
+
274
+ enum jar_xm_loop_type_e {
275
+ jar_xm_NO_LOOP,
276
+ jar_xm_FORWARD_LOOP,
277
+ jar_xm_PING_PONG_LOOP,
278
+ };
279
+ typedef enum jar_xm_loop_type_e jar_xm_loop_type_t;
280
+
281
+ enum jar_xm_frequency_type_e {
282
+ jar_xm_LINEAR_FREQUENCIES,
283
+ jar_xm_AMIGA_FREQUENCIES,
284
+ };
285
+ typedef enum jar_xm_frequency_type_e jar_xm_frequency_type_t;
286
+
287
+ struct jar_xm_envelope_point_s {
288
+ uint16_t frame;
289
+ uint16_t value;
290
+ };
291
+ typedef struct jar_xm_envelope_point_s jar_xm_envelope_point_t;
292
+
293
+ struct jar_xm_envelope_s {
294
+ jar_xm_envelope_point_t points[NUM_ENVELOPE_POINTS];
295
+ uint8_t num_points;
296
+ uint8_t sustain_point;
297
+ uint8_t loop_start_point;
298
+ uint8_t loop_end_point;
299
+ bool enabled;
300
+ bool sustain_enabled;
301
+ bool loop_enabled;
302
+ };
303
+ typedef struct jar_xm_envelope_s jar_xm_envelope_t;
304
+
305
+ struct jar_xm_sample_s {
306
+ char name[SAMPLE_NAME_LENGTH + 1];
307
+ int8_t bits; /* Either 8 or 16 */
308
+ int8_t stereo;
309
+ uint32_t length;
310
+ uint32_t loop_start;
311
+ uint32_t loop_length;
312
+ uint32_t loop_end;
313
+ float volume;
314
+ int8_t finetune;
315
+ jar_xm_loop_type_t loop_type;
316
+ float panning;
317
+ int8_t relative_note;
318
+ uint64_t latest_trigger;
319
+
320
+ float* data;
321
+ };
322
+ typedef struct jar_xm_sample_s jar_xm_sample_t;
323
+
324
+ struct jar_xm_instrument_s {
325
+ char name[INSTRUMENT_NAME_LENGTH + 1];
326
+ uint16_t num_samples;
327
+ uint8_t sample_of_notes[NUM_NOTES];
328
+ jar_xm_envelope_t volume_envelope;
329
+ jar_xm_envelope_t panning_envelope;
330
+ jar_xm_waveform_type_t vibrato_type;
331
+ uint8_t vibrato_sweep;
332
+ uint8_t vibrato_depth;
333
+ uint8_t vibrato_rate;
334
+ uint16_t volume_fadeout;
335
+ uint64_t latest_trigger;
336
+ bool muted;
337
+
338
+ jar_xm_sample_t* samples;
339
+ };
340
+ typedef struct jar_xm_instrument_s jar_xm_instrument_t;
341
+
342
+ struct jar_xm_pattern_slot_s {
343
+ uint8_t note; /* 1-96, 97 = Key Off note */
344
+ uint8_t instrument; /* 1-128 */
345
+ uint8_t volume_column;
346
+ uint8_t effect_type;
347
+ uint8_t effect_param;
348
+ };
349
+ typedef struct jar_xm_pattern_slot_s jar_xm_pattern_slot_t;
350
+
351
+ struct jar_xm_pattern_s {
352
+ uint16_t num_rows;
353
+ jar_xm_pattern_slot_t* slots; /* Array of size num_rows * num_channels */
354
+ };
355
+ typedef struct jar_xm_pattern_s jar_xm_pattern_t;
356
+
357
+ struct jar_xm_module_s {
358
+ char name[MODULE_NAME_LENGTH + 1];
359
+ char trackername[TRACKER_NAME_LENGTH + 1];
360
+ uint16_t length;
361
+ uint16_t restart_position;
362
+ uint16_t num_channels;
363
+ uint16_t num_patterns;
364
+ uint16_t num_instruments;
365
+ uint16_t linear_interpolation;
366
+ uint16_t ramping;
367
+ jar_xm_frequency_type_t frequency_type;
368
+ uint8_t pattern_table[PATTERN_ORDER_TABLE_LENGTH];
369
+
370
+ jar_xm_pattern_t* patterns;
371
+ jar_xm_instrument_t* instruments; /* Instrument 1 has index 0, instrument 2 has index 1, etc. */
372
+ };
373
+ typedef struct jar_xm_module_s jar_xm_module_t;
374
+
375
+ struct jar_xm_channel_context_s {
376
+ float note;
377
+ float orig_note; /* The original note before effect modifications, as read in the pattern. */
378
+ jar_xm_instrument_t* instrument; /* Could be NULL */
379
+ jar_xm_sample_t* sample; /* Could be NULL */
380
+ jar_xm_pattern_slot_t* current;
381
+
382
+ float sample_position;
383
+ float period;
384
+ float frequency;
385
+ float step;
386
+ bool ping; /* For ping-pong samples: true is -->, false is <-- */
387
+
388
+ float volume; /* Ideally between 0 (muted) and 1 (loudest) */
389
+ float panning; /* Between 0 (left) and 1 (right); 0.5 is centered */
390
+
391
+ uint16_t autovibrato_ticks;
392
+
393
+ bool sustained;
394
+ float fadeout_volume;
395
+ float volume_envelope_volume;
396
+ float panning_envelope_panning;
397
+ uint16_t volume_envelope_frame_count;
398
+ uint16_t panning_envelope_frame_count;
399
+
400
+ float autovibrato_note_offset;
401
+
402
+ bool arp_in_progress;
403
+ uint8_t arp_note_offset;
404
+ uint8_t volume_slide_param;
405
+ uint8_t fine_volume_slide_param;
406
+ uint8_t global_volume_slide_param;
407
+ uint8_t panning_slide_param;
408
+ uint8_t portamento_up_param;
409
+ uint8_t portamento_down_param;
410
+ uint8_t fine_portamento_up_param;
411
+ uint8_t fine_portamento_down_param;
412
+ uint8_t extra_fine_portamento_up_param;
413
+ uint8_t extra_fine_portamento_down_param;
414
+ uint8_t tone_portamento_param;
415
+ float tone_portamento_target_period;
416
+ uint8_t multi_retrig_param;
417
+ uint8_t note_delay_param;
418
+ uint8_t pattern_loop_origin; /* Where to restart a E6y loop */
419
+ uint8_t pattern_loop_count; /* How many loop passes have been done */
420
+ bool vibrato_in_progress;
421
+ jar_xm_waveform_type_t vibrato_waveform;
422
+ bool vibrato_waveform_retrigger; /* True if a new note retriggers the waveform */
423
+ uint8_t vibrato_param;
424
+ uint16_t vibrato_ticks; /* Position in the waveform */
425
+ float vibrato_note_offset;
426
+ jar_xm_waveform_type_t tremolo_waveform;
427
+ bool tremolo_waveform_retrigger;
428
+ uint8_t tremolo_param;
429
+ uint8_t tremolo_ticks;
430
+ float tremolo_volume;
431
+ uint8_t tremor_param;
432
+ bool tremor_on;
433
+
434
+ uint64_t latest_trigger;
435
+ bool muted;
436
+
437
+ //* These values are updated at the end of each tick, to save a couple of float operations on every generated sample.
438
+ float target_panning;
439
+ float target_volume;
440
+
441
+ unsigned long frame_count;
442
+ float end_of_previous_sample_left[jar_xm_SAMPLE_RAMPING_POINTS];
443
+ float end_of_previous_sample_right[jar_xm_SAMPLE_RAMPING_POINTS];
444
+ float curr_left;
445
+ float curr_right;
446
+
447
+ float actual_panning;
448
+ float actual_volume;
449
+ };
450
+ typedef struct jar_xm_channel_context_s jar_xm_channel_context_t;
451
+
452
+ struct jar_xm_context_s {
453
+ void* allocated_memory;
454
+ jar_xm_module_t module;
455
+ uint32_t rate;
456
+
457
+ uint16_t default_tempo; // Number of ticks per row
458
+ uint16_t default_bpm;
459
+ float default_global_volume;
460
+
461
+ uint16_t tempo; // Number of ticks per row
462
+ uint16_t bpm;
463
+ float global_volume;
464
+
465
+ float volume_ramp; /* How much is a channel final volume allowed to change per sample; this is used to avoid abrubt volume changes which manifest as "clicks" in the generated sound. */
466
+ float panning_ramp; /* Same for panning. */
467
+
468
+ uint8_t current_table_index;
469
+ uint8_t current_row;
470
+ uint16_t current_tick; /* Can go below 255, with high tempo and a pattern delay */
471
+ float remaining_samples_in_tick;
472
+ uint64_t generated_samples;
473
+
474
+ bool position_jump;
475
+ bool pattern_break;
476
+ uint8_t jump_dest;
477
+ uint8_t jump_row;
478
+
479
+ uint16_t extra_ticks; /* Extra ticks to be played before going to the next row - Used for EEy effect */
480
+
481
+ uint8_t* row_loop_count; /* Array of size MAX_NUM_ROWS * module_length */
482
+ uint8_t loop_count;
483
+ uint8_t max_loop_count;
484
+
485
+ jar_xm_channel_context_t* channels;
486
+ };
487
+
488
+ #if JAR_XM_DEFENSIVE
489
+
490
+ //** Check the module data for errors/inconsistencies.
491
+ // * @returns 0 if everything looks OK. Module should be safe to load.
492
+ int jar_xm_check_sanity_preload(const char*, size_t);
493
+
494
+ //** Check a loaded module for errors/inconsistencies.
495
+ // * @returns 0 if everything looks OK.
496
+ int jar_xm_check_sanity_postload(jar_xm_context_t*);
497
+
498
+ #endif
499
+
500
+ //** Get the number of bytes needed to store the module data in a dynamically allocated blank context.
501
+ // * Things that are dynamically allocated:
502
+ // * - sample data
503
+ // * - sample structures in instruments
504
+ // * - pattern data
505
+ // * - row loop count arrays
506
+ // * - pattern structures in module
507
+ // * - instrument structures in module
508
+ // * - channel contexts
509
+ // * - context structure itself
510
+ // * @returns 0 if everything looks OK.
511
+ size_t jar_xm_get_memory_needed_for_context(const char*, size_t);
512
+
513
+ //** Populate the context from module data.
514
+ // * @returns pointer to the memory pool
515
+ char* jar_xm_load_module(jar_xm_context_t*, const char*, size_t, char*);
516
+
517
+ int jar_xm_create_context(jar_xm_context_t** ctxp, const char* moddata, uint32_t rate) {
518
+ return jar_xm_create_context_safe(ctxp, moddata, SIZE_MAX, rate);
519
+ }
520
+
521
+ #define ALIGN(x, b) (((x) + ((b) - 1)) & ~((b) - 1))
522
+ #define ALIGN_PTR(x, b) (void*)(((uintptr_t)(x) + ((b) - 1)) & ~((b) - 1))
523
+ int jar_xm_create_context_safe(jar_xm_context_t** ctxp, const char* moddata, size_t moddata_length, uint32_t rate) {
524
+ #if JAR_XM_DEFENSIVE
525
+ int ret;
526
+ #endif
527
+ size_t bytes_needed;
528
+ char* mempool;
529
+ jar_xm_context_t* ctx;
530
+
531
+ #if JAR_XM_DEFENSIVE
532
+ if((ret = jar_xm_check_sanity_preload(moddata, moddata_length))) {
533
+ DEBUG("jar_xm_check_sanity_preload() returned %i, module is not safe to load", ret);
534
+ return 1;
535
+ }
536
+ #endif
537
+
538
+ bytes_needed = jar_xm_get_memory_needed_for_context(moddata, moddata_length);
539
+ mempool = JARXM_MALLOC(bytes_needed);
540
+ if(mempool == NULL && bytes_needed > 0) { /* JARXM_MALLOC() failed, trouble ahead */
541
+ DEBUG("call to JARXM_MALLOC() failed, returned %p", (void*)mempool);
542
+ return 2;
543
+ }
544
+
545
+ /* Initialize most of the fields to 0, 0.f, NULL or false depending on type */
546
+ memset(mempool, 0, bytes_needed);
547
+
548
+ ctx = (*ctxp = (jar_xm_context_t *)mempool);
549
+ ctx->allocated_memory = mempool; /* Keep original pointer for JARXM_FREE() */
550
+ mempool += sizeof(jar_xm_context_t);
551
+
552
+ ctx->rate = rate;
553
+ mempool = jar_xm_load_module(ctx, moddata, moddata_length, mempool);
554
+ mempool = ALIGN_PTR(mempool, 16);
555
+
556
+ ctx->channels = (jar_xm_channel_context_t*)mempool;
557
+ mempool += ctx->module.num_channels * sizeof(jar_xm_channel_context_t);
558
+ mempool = ALIGN_PTR(mempool, 16);
559
+
560
+ ctx->default_global_volume = 1.f;
561
+ ctx->global_volume = ctx->default_global_volume;
562
+
563
+ ctx->volume_ramp = (1.f / 128.f);
564
+ ctx->panning_ramp = (1.f / 128.f);
565
+
566
+ for(uint8_t i = 0; i < ctx->module.num_channels; ++i) {
567
+ jar_xm_channel_context_t *ch = ctx->channels + i;
568
+ ch->ping = true;
569
+ ch->vibrato_waveform = jar_xm_SINE_WAVEFORM;
570
+ ch->vibrato_waveform_retrigger = true;
571
+ ch->tremolo_waveform = jar_xm_SINE_WAVEFORM;
572
+ ch->tremolo_waveform_retrigger = true;
573
+ ch->volume = ch->volume_envelope_volume = ch->fadeout_volume = 1.0f;
574
+ ch->panning = ch->panning_envelope_panning = .5f;
575
+ ch->actual_volume = .0f;
576
+ ch->actual_panning = .5f;
577
+ }
578
+
579
+ mempool = ALIGN_PTR(mempool, 16);
580
+ ctx->row_loop_count = (uint8_t *)mempool;
581
+ mempool += MAX_NUM_ROWS * sizeof(uint8_t);
582
+
583
+ #if JAR_XM_DEFENSIVE
584
+ if((ret = jar_xm_check_sanity_postload(ctx))) { DEBUG("jar_xm_check_sanity_postload() returned %i, module is not safe to play", ret);
585
+ jar_xm_free_context(ctx);
586
+ return 1;
587
+ }
588
+ #endif
589
+
590
+ return 0;
591
+ }
592
+
593
+ void jar_xm_free_context(jar_xm_context_t *ctx) {
594
+ if (ctx != NULL) { JARXM_FREE(ctx->allocated_memory); }
595
+ }
596
+
597
+ void jar_xm_set_max_loop_count(jar_xm_context_t *ctx, uint8_t loopcnt) {
598
+ ctx->max_loop_count = loopcnt;
599
+ }
600
+
601
+ uint8_t jar_xm_get_loop_count(jar_xm_context_t *ctx) {
602
+ return ctx->loop_count;
603
+ }
604
+
605
+ bool jar_xm_mute_channel(jar_xm_context_t *ctx, uint16_t channel, bool mute) {
606
+ bool old = ctx->channels[channel - 1].muted;
607
+ ctx->channels[channel - 1].muted = mute;
608
+ return old;
609
+ }
610
+
611
+ bool jar_xm_mute_instrument(jar_xm_context_t *ctx, uint16_t instr, bool mute) {
612
+ bool old = ctx->module.instruments[instr - 1].muted;
613
+ ctx->module.instruments[instr - 1].muted = mute;
614
+ return old;
615
+ }
616
+
617
+ const char* jar_xm_get_module_name(jar_xm_context_t *ctx) {
618
+ return ctx->module.name;
619
+ }
620
+
621
+ const char* jar_xm_get_tracker_name(jar_xm_context_t *ctx) {
622
+ return ctx->module.trackername;
623
+ }
624
+
625
+ uint16_t jar_xm_get_number_of_channels(jar_xm_context_t *ctx) {
626
+ return ctx->module.num_channels;
627
+ }
628
+
629
+ uint16_t jar_xm_get_module_length(jar_xm_context_t *ctx) {
630
+ return ctx->module.length;
631
+ }
632
+
633
+ uint16_t jar_xm_get_number_of_patterns(jar_xm_context_t *ctx) {
634
+ return ctx->module.num_patterns;
635
+ }
636
+
637
+ uint16_t jar_xm_get_number_of_rows(jar_xm_context_t *ctx, uint16_t pattern) {
638
+ return ctx->module.patterns[pattern].num_rows;
639
+ }
640
+
641
+ uint16_t jar_xm_get_number_of_instruments(jar_xm_context_t *ctx) {
642
+ return ctx->module.num_instruments;
643
+ }
644
+
645
+ uint16_t jar_xm_get_number_of_samples(jar_xm_context_t *ctx, uint16_t instrument) {
646
+ return ctx->module.instruments[instrument - 1].num_samples;
647
+ }
648
+
649
+ void jar_xm_get_playing_speed(jar_xm_context_t *ctx, uint16_t *bpm, uint16_t *tempo) {
650
+ if(bpm) *bpm = ctx->bpm;
651
+ if(tempo) *tempo = ctx->tempo;
652
+ }
653
+
654
+ void jar_xm_get_position(jar_xm_context_t *ctx, uint8_t *pattern_index, uint8_t *pattern, uint8_t *row, uint64_t *samples) {
655
+ if(pattern_index) *pattern_index = ctx->current_table_index;
656
+ if(pattern) *pattern = ctx->module.pattern_table[ctx->current_table_index];
657
+ if(row) *row = ctx->current_row;
658
+ if(samples) *samples = ctx->generated_samples;
659
+ }
660
+
661
+ uint64_t jar_xm_get_latest_trigger_of_instrument(jar_xm_context_t *ctx, uint16_t instr) {
662
+ return ctx->module.instruments[instr - 1].latest_trigger;
663
+ }
664
+
665
+ uint64_t jar_xm_get_latest_trigger_of_sample(jar_xm_context_t *ctx, uint16_t instr, uint16_t sample) {
666
+ return ctx->module.instruments[instr - 1].samples[sample].latest_trigger;
667
+ }
668
+
669
+ uint64_t jar_xm_get_latest_trigger_of_channel(jar_xm_context_t *ctx, uint16_t chn) {
670
+ return ctx->channels[chn - 1].latest_trigger;
671
+ }
672
+
673
+ //* .xm files are little-endian. (XXX: Are they really?)
674
+
675
+ //* Bound reader macros.
676
+ //* If we attempt to read the buffer out-of-bounds, pretend that the buffer is infinitely padded with zeroes.
677
+ #define READ_U8(offset) (((offset) < moddata_length) ? (*(uint8_t*)(moddata + (offset))) : 0)
678
+ #define READ_U16(offset) ((uint16_t)READ_U8(offset) | ((uint16_t)READ_U8((offset) + 1) << 8))
679
+ #define READ_U32(offset) ((uint32_t)READ_U16(offset) | ((uint32_t)READ_U16((offset) + 2) << 16))
680
+ #define READ_MEMCPY(ptr, offset, length) memcpy_pad(ptr, length, moddata, moddata_length, offset)
681
+
682
+ static void memcpy_pad(void *dst, size_t dst_len, const void *src, size_t src_len, size_t offset) {
683
+ uint8_t *dst_c = dst;
684
+ const uint8_t *src_c = src;
685
+
686
+ /* how many bytes can be copied without overrunning `src` */
687
+ size_t copy_bytes = (src_len >= offset) ? (src_len - offset) : 0;
688
+ copy_bytes = copy_bytes > dst_len ? dst_len : copy_bytes;
689
+
690
+ memcpy(dst_c, src_c + offset, copy_bytes);
691
+ /* padded bytes */
692
+ memset(dst_c + copy_bytes, 0, dst_len - copy_bytes);
693
+ }
694
+
695
+ #if JAR_XM_DEFENSIVE
696
+
697
+ int jar_xm_check_sanity_preload(const char* module, size_t module_length) {
698
+ if(module_length < 60) { return 4; }
699
+ if(memcmp("Extended Module: ", module, 17) != 0) { return 1; }
700
+ if(module[37] != 0x1A) { return 2; }
701
+ if(module[59] != 0x01 || module[58] != 0x04) { return 3; } /* Not XM 1.04 */
702
+ return 0;
703
+ }
704
+
705
+ int jar_xm_check_sanity_postload(jar_xm_context_t* ctx) {
706
+ /* Check the POT */
707
+ for(uint8_t i = 0; i < ctx->module.length; ++i) {
708
+ if(ctx->module.pattern_table[i] >= ctx->module.num_patterns) {
709
+ if(i+1 == ctx->module.length && ctx->module.length > 1) {
710
+ DEBUG("trimming invalid POT at pos %X", i);
711
+ --ctx->module.length;
712
+ } else {
713
+ DEBUG("module has invalid POT, pos %X references nonexistent pattern %X", i, ctx->module.pattern_table[i]);
714
+ return 1;
715
+ }
716
+ }
717
+ }
718
+
719
+ return 0;
720
+ }
721
+
722
+ #endif
723
+
724
+ size_t jar_xm_get_memory_needed_for_context(const char* moddata, size_t moddata_length) {
725
+ size_t memory_needed = 0;
726
+ size_t offset = 60; /* 60 = Skip the first header */
727
+ uint16_t num_channels;
728
+ uint16_t num_patterns;
729
+ uint16_t num_instruments;
730
+
731
+ /* Read the module header */
732
+ num_channels = READ_U16(offset + 8);
733
+ num_patterns = READ_U16(offset + 10);
734
+ memory_needed += num_patterns * sizeof(jar_xm_pattern_t);
735
+ memory_needed = ALIGN(memory_needed, 16);
736
+ num_instruments = READ_U16(offset + 12);
737
+ memory_needed += num_instruments * sizeof(jar_xm_instrument_t);
738
+ memory_needed = ALIGN(memory_needed, 16);
739
+ memory_needed += MAX_NUM_ROWS * READ_U16(offset + 4) * sizeof(uint8_t); /* Module length */
740
+
741
+ offset += READ_U32(offset); /* Header size */
742
+
743
+ /* Read pattern headers */
744
+ for(uint16_t i = 0; i < num_patterns; ++i) {
745
+ uint16_t num_rows;
746
+ num_rows = READ_U16(offset + 5);
747
+ memory_needed += num_rows * num_channels * sizeof(jar_xm_pattern_slot_t);
748
+ offset += READ_U32(offset) + READ_U16(offset + 7); /* Pattern header length + packed pattern data size */
749
+ }
750
+ memory_needed = ALIGN(memory_needed, 16);
751
+
752
+ /* Read instrument headers */
753
+ for(uint16_t i = 0; i < num_instruments; ++i) {
754
+ uint16_t num_samples;
755
+ uint32_t sample_header_size = 0;
756
+ uint32_t sample_size_aggregate = 0;
757
+ num_samples = READ_U16(offset + 27);
758
+ memory_needed += num_samples * sizeof(jar_xm_sample_t);
759
+ if(num_samples > 0) { sample_header_size = READ_U32(offset + 29); }
760
+
761
+ offset += READ_U32(offset); /* Instrument header size */
762
+ for(uint16_t j = 0; j < num_samples; ++j) {
763
+ uint32_t sample_size;
764
+ uint8_t flags;
765
+ sample_size = READ_U32(offset);
766
+ flags = READ_U8(offset + 14);
767
+ sample_size_aggregate += sample_size;
768
+
769
+ if(flags & (1 << 4)) { /* 16 bit sample */
770
+ memory_needed += sample_size * (sizeof(float) >> 1);
771
+ } else { /* 8 bit sample */
772
+ memory_needed += sample_size * sizeof(float);
773
+ }
774
+ offset += sample_header_size;
775
+ }
776
+ offset += sample_size_aggregate;
777
+ }
778
+
779
+ memory_needed += num_channels * sizeof(jar_xm_channel_context_t);
780
+ memory_needed += sizeof(jar_xm_context_t);
781
+ return memory_needed;
782
+ }
783
+
784
+ char* jar_xm_load_module(jar_xm_context_t* ctx, const char* moddata, size_t moddata_length, char* mempool) {
785
+ size_t offset = 0;
786
+ jar_xm_module_t* mod = &(ctx->module);
787
+
788
+ /* Read XM header */
789
+ READ_MEMCPY(mod->name, offset + 17, MODULE_NAME_LENGTH);
790
+ READ_MEMCPY(mod->trackername, offset + 38, TRACKER_NAME_LENGTH);
791
+ offset += 60;
792
+
793
+ /* Read module header */
794
+ uint32_t header_size = READ_U32(offset);
795
+ mod->length = READ_U16(offset + 4);
796
+ mod->restart_position = READ_U16(offset + 6);
797
+ mod->num_channels = READ_U16(offset + 8);
798
+ mod->num_patterns = READ_U16(offset + 10);
799
+ mod->num_instruments = READ_U16(offset + 12);
800
+ mod->patterns = (jar_xm_pattern_t*)mempool;
801
+ mod->linear_interpolation = 0; // Linear interpolation can be set after loading
802
+ mod->ramping = 1; // ramping can be set after loading
803
+ mempool += mod->num_patterns * sizeof(jar_xm_pattern_t);
804
+ mempool = ALIGN_PTR(mempool, 16);
805
+ mod->instruments = (jar_xm_instrument_t*)mempool;
806
+ mempool += mod->num_instruments * sizeof(jar_xm_instrument_t);
807
+ mempool = ALIGN_PTR(mempool, 16);
808
+ uint16_t flags = READ_U32(offset + 14);
809
+ mod->frequency_type = (flags & (1 << 0)) ? jar_xm_LINEAR_FREQUENCIES : jar_xm_AMIGA_FREQUENCIES;
810
+ ctx->default_tempo = READ_U16(offset + 16);
811
+ ctx->default_bpm = READ_U16(offset + 18);
812
+ ctx->tempo =ctx->default_tempo;
813
+ ctx->bpm = ctx->default_bpm;
814
+
815
+ READ_MEMCPY(mod->pattern_table, offset + 20, PATTERN_ORDER_TABLE_LENGTH);
816
+ offset += header_size;
817
+
818
+ /* Read patterns */
819
+ for(uint16_t i = 0; i < mod->num_patterns; ++i) {
820
+ uint16_t packed_patterndata_size = READ_U16(offset + 7);
821
+ jar_xm_pattern_t* pat = mod->patterns + i;
822
+ pat->num_rows = READ_U16(offset + 5);
823
+ pat->slots = (jar_xm_pattern_slot_t*)mempool;
824
+ mempool += mod->num_channels * pat->num_rows * sizeof(jar_xm_pattern_slot_t);
825
+ offset += READ_U32(offset); /* Pattern header length */
826
+
827
+ if(packed_patterndata_size == 0) { /* No pattern data is present */
828
+ memset(pat->slots, 0, sizeof(jar_xm_pattern_slot_t) * pat->num_rows * mod->num_channels);
829
+ } else {
830
+ /* This isn't your typical for loop */
831
+ for(uint16_t j = 0, k = 0; j < packed_patterndata_size; ++k) {
832
+ uint8_t note = READ_U8(offset + j);
833
+ jar_xm_pattern_slot_t* slot = pat->slots + k;
834
+ if(note & (1 << 7)) {
835
+ /* MSB is set, this is a compressed packet */
836
+ ++j;
837
+ if(note & (1 << 0)) { /* Note follows */
838
+ slot->note = READ_U8(offset + j);
839
+ ++j;
840
+ } else {
841
+ slot->note = 0;
842
+ }
843
+ if(note & (1 << 1)) { /* Instrument follows */
844
+ slot->instrument = READ_U8(offset + j);
845
+ ++j;
846
+ } else {
847
+ slot->instrument = 0;
848
+ }
849
+ if(note & (1 << 2)) { /* Volume column follows */
850
+ slot->volume_column = READ_U8(offset + j);
851
+ ++j;
852
+ } else {
853
+ slot->volume_column = 0;
854
+ }
855
+ if(note & (1 << 3)) { /* Effect follows */
856
+ slot->effect_type = READ_U8(offset + j);
857
+ ++j;
858
+ } else {
859
+ slot->effect_type = 0;
860
+ }
861
+ if(note & (1 << 4)) { /* Effect parameter follows */
862
+ slot->effect_param = READ_U8(offset + j);
863
+ ++j;
864
+ } else {
865
+ slot->effect_param = 0;
866
+ }
867
+ } else { /* Uncompressed packet */
868
+ slot->note = note;
869
+ slot->instrument = READ_U8(offset + j + 1);
870
+ slot->volume_column = READ_U8(offset + j + 2);
871
+ slot->effect_type = READ_U8(offset + j + 3);
872
+ slot->effect_param = READ_U8(offset + j + 4);
873
+ j += 5;
874
+ }
875
+ }
876
+ }
877
+
878
+ offset += packed_patterndata_size;
879
+ }
880
+ mempool = ALIGN_PTR(mempool, 16);
881
+
882
+ /* Read instruments */
883
+ for(uint16_t i = 0; i < ctx->module.num_instruments; ++i) {
884
+ uint32_t sample_header_size = 0;
885
+ jar_xm_instrument_t* instr = mod->instruments + i;
886
+
887
+ READ_MEMCPY(instr->name, offset + 4, INSTRUMENT_NAME_LENGTH);
888
+ instr->num_samples = READ_U16(offset + 27);
889
+
890
+ if(instr->num_samples > 0) {
891
+ /* Read extra header properties */
892
+ sample_header_size = READ_U32(offset + 29);
893
+ READ_MEMCPY(instr->sample_of_notes, offset + 33, NUM_NOTES);
894
+
895
+ instr->volume_envelope.num_points = READ_U8(offset + 225);
896
+ instr->panning_envelope.num_points = READ_U8(offset + 226);
897
+
898
+ for(uint8_t j = 0; j < instr->volume_envelope.num_points; ++j) {
899
+ instr->volume_envelope.points[j].frame = READ_U16(offset + 129 + 4 * j);
900
+ instr->volume_envelope.points[j].value = READ_U16(offset + 129 + 4 * j + 2);
901
+ }
902
+
903
+ for(uint8_t j = 0; j < instr->panning_envelope.num_points; ++j) {
904
+ instr->panning_envelope.points[j].frame = READ_U16(offset + 177 + 4 * j);
905
+ instr->panning_envelope.points[j].value = READ_U16(offset + 177 + 4 * j + 2);
906
+ }
907
+
908
+ instr->volume_envelope.sustain_point = READ_U8(offset + 227);
909
+ instr->volume_envelope.loop_start_point = READ_U8(offset + 228);
910
+ instr->volume_envelope.loop_end_point = READ_U8(offset + 229);
911
+ instr->panning_envelope.sustain_point = READ_U8(offset + 230);
912
+ instr->panning_envelope.loop_start_point = READ_U8(offset + 231);
913
+ instr->panning_envelope.loop_end_point = READ_U8(offset + 232);
914
+
915
+ uint8_t flags = READ_U8(offset + 233);
916
+ instr->volume_envelope.enabled = flags & (1 << 0);
917
+ instr->volume_envelope.sustain_enabled = flags & (1 << 1);
918
+ instr->volume_envelope.loop_enabled = flags & (1 << 2);
919
+
920
+ flags = READ_U8(offset + 234);
921
+ instr->panning_envelope.enabled = flags & (1 << 0);
922
+ instr->panning_envelope.sustain_enabled = flags & (1 << 1);
923
+ instr->panning_envelope.loop_enabled = flags & (1 << 2);
924
+ instr->vibrato_type = READ_U8(offset + 235);
925
+ if(instr->vibrato_type == 2) {
926
+ instr->vibrato_type = 1;
927
+ } else if(instr->vibrato_type == 1) {
928
+ instr->vibrato_type = 2;
929
+ }
930
+ instr->vibrato_sweep = READ_U8(offset + 236);
931
+ instr->vibrato_depth = READ_U8(offset + 237);
932
+ instr->vibrato_rate = READ_U8(offset + 238);
933
+ instr->volume_fadeout = READ_U16(offset + 239);
934
+ instr->samples = (jar_xm_sample_t*)mempool;
935
+ mempool += instr->num_samples * sizeof(jar_xm_sample_t);
936
+ } else {
937
+ instr->samples = NULL;
938
+ }
939
+
940
+ /* Instrument header size */
941
+ offset += READ_U32(offset);
942
+
943
+ for(int j = 0; j < instr->num_samples; ++j) {
944
+ /* Read sample header */
945
+ jar_xm_sample_t* sample = instr->samples + j;
946
+
947
+ sample->length = READ_U32(offset);
948
+ sample->loop_start = READ_U32(offset + 4);
949
+ sample->loop_length = READ_U32(offset + 8);
950
+ sample->loop_end = sample->loop_start + sample->loop_length;
951
+ sample->volume = (float)(READ_U8(offset + 12) << 2) / 256.f;
952
+ if (sample->volume > 1.0f) {sample->volume = 1.f;};
953
+ sample->finetune = (int8_t)READ_U8(offset + 13);
954
+
955
+ uint8_t flags = READ_U8(offset + 14);
956
+ switch (flags & 3) {
957
+ case 2:
958
+ case 3:
959
+ sample->loop_type = jar_xm_PING_PONG_LOOP;
960
+ case 1:
961
+ sample->loop_type = jar_xm_FORWARD_LOOP;
962
+ break;
963
+ default:
964
+ sample->loop_type = jar_xm_NO_LOOP;
965
+ break;
966
+ };
967
+ sample->bits = (flags & 0x10) ? 16 : 8;
968
+ sample->stereo = (flags & 0x20) ? 1 : 0;
969
+ sample->panning = (float)READ_U8(offset + 15) / 255.f;
970
+ sample->relative_note = (int8_t)READ_U8(offset + 16);
971
+ READ_MEMCPY(sample->name, 18, SAMPLE_NAME_LENGTH);
972
+ sample->data = (float*)mempool;
973
+ if(sample->bits == 16) {
974
+ /* 16 bit sample */
975
+ mempool += sample->length * (sizeof(float) >> 1);
976
+ sample->loop_start >>= 1;
977
+ sample->loop_length >>= 1;
978
+ sample->loop_end >>= 1;
979
+ sample->length >>= 1;
980
+ } else {
981
+ /* 8 bit sample */
982
+ mempool += sample->length * sizeof(float);
983
+ }
984
+ // Adjust loop points to reflect half of the reported length (stereo)
985
+ if (sample->stereo && sample->loop_type != jar_xm_NO_LOOP) {
986
+ div_t lstart = div(READ_U32(offset + 4), 2);
987
+ sample->loop_start = lstart.quot;
988
+ div_t llength = div(READ_U32(offset + 8), 2);
989
+ sample->loop_length = llength.quot;
990
+ sample->loop_end = sample->loop_start + sample->loop_length;
991
+ };
992
+
993
+ offset += sample_header_size;
994
+ }
995
+
996
+ // Read all samples and convert them to float values
997
+ for(int j = 0; j < instr->num_samples; ++j) {
998
+ /* Read sample data */
999
+ jar_xm_sample_t* sample = instr->samples + j;
1000
+ int length = sample->length;
1001
+ if (sample->stereo) {
1002
+ // Since it is stereo, we cut the sample in half (treated as single channel)
1003
+ div_t result = div(sample->length, 2);
1004
+ if(sample->bits == 16) {
1005
+ int16_t v = 0;
1006
+ for(int k = 0; k < length; ++k) {
1007
+ if (k == result.quot) { v = 0;};
1008
+ v = v + (int16_t)READ_U16(offset + (k << 1));
1009
+ sample->data[k] = (float) v / 32768.f ;//* sign;
1010
+ if(sample->data[k] < -1.0) {sample->data[k] = -1.0;} else if(sample->data[k] > 1.0) {sample->data[k] = 1.0;};
1011
+ }
1012
+ offset += sample->length << 1;
1013
+ } else {
1014
+ int8_t v = 0;
1015
+ for(int k = 0; k < length; ++k) {
1016
+ if (k == result.quot) { v = 0;};
1017
+ v = v + (int8_t)READ_U8(offset + k);
1018
+ sample->data[k] = (float)v / 128.f ;//* sign;
1019
+ if(sample->data[k] < -1.0) {sample->data[k] = -1.0;} else if(sample->data[k] > 1.0) {sample->data[k] = 1.0;};
1020
+ }
1021
+ offset += sample->length;
1022
+ };
1023
+ sample->length = result.quot;
1024
+ } else {
1025
+ if(sample->bits == 16) {
1026
+ int16_t v = 0;
1027
+ for(int k = 0; k < length; ++k) {
1028
+ v = v + (int16_t)READ_U16(offset + (k << 1));
1029
+ sample->data[k] = (float) v / 32768.f ;//* sign;
1030
+ if(sample->data[k] < -1.0) {sample->data[k] = -1.0;} else if(sample->data[k] > 1.0) {sample->data[k] = 1.0;};
1031
+ }
1032
+ offset += sample->length << 1;
1033
+ } else {
1034
+ int8_t v = 0;
1035
+ for(int k = 0; k < length; ++k) {
1036
+ v = v + (int8_t)READ_U8(offset + k);
1037
+ sample->data[k] = (float)v / 128.f ;//* sign;
1038
+ if(sample->data[k] < -1.0) {sample->data[k] = -1.0;} else if(sample->data[k] > 1.0) {sample->data[k] = 1.0;};
1039
+ }
1040
+ offset += sample->length;
1041
+ }
1042
+ }
1043
+ };
1044
+ };
1045
+ return mempool;
1046
+ };
1047
+
1048
+ //-------------------------------------------------------------------------------
1049
+ //THE FOLLOWING IS FOR PLAYING
1050
+ static float jar_xm_waveform(jar_xm_waveform_type_t, uint8_t);
1051
+ static void jar_xm_autovibrato(jar_xm_context_t*, jar_xm_channel_context_t*);
1052
+ static void jar_xm_vibrato(jar_xm_context_t*, jar_xm_channel_context_t*, uint8_t, uint16_t);
1053
+ static void jar_xm_tremolo(jar_xm_context_t*, jar_xm_channel_context_t*, uint8_t, uint16_t);
1054
+ static void jar_xm_arpeggio(jar_xm_context_t*, jar_xm_channel_context_t*, uint8_t, uint16_t);
1055
+ static void jar_xm_tone_portamento(jar_xm_context_t*, jar_xm_channel_context_t*);
1056
+ static void jar_xm_pitch_slide(jar_xm_context_t*, jar_xm_channel_context_t*, float);
1057
+ static void jar_xm_panning_slide(jar_xm_channel_context_t*, uint8_t);
1058
+ static void jar_xm_volume_slide(jar_xm_channel_context_t*, uint8_t);
1059
+
1060
+ static float jar_xm_envelope_lerp(jar_xm_envelope_point_t*, jar_xm_envelope_point_t*, uint16_t);
1061
+ static void jar_xm_envelope_tick(jar_xm_channel_context_t*, jar_xm_envelope_t*, uint16_t*, float*);
1062
+ static void jar_xm_envelopes(jar_xm_channel_context_t*);
1063
+
1064
+ static float jar_xm_linear_period(float);
1065
+ static float jar_xm_linear_frequency(float);
1066
+ static float jar_xm_amiga_period(float);
1067
+ static float jar_xm_amiga_frequency(float);
1068
+ static float jar_xm_period(jar_xm_context_t*, float);
1069
+ static float jar_xm_frequency(jar_xm_context_t*, float, float);
1070
+ static void jar_xm_update_frequency(jar_xm_context_t*, jar_xm_channel_context_t*);
1071
+
1072
+ static void jar_xm_handle_note_and_instrument(jar_xm_context_t*, jar_xm_channel_context_t*, jar_xm_pattern_slot_t*);
1073
+ static void jar_xm_trigger_note(jar_xm_context_t*, jar_xm_channel_context_t*, unsigned int flags);
1074
+ static void jar_xm_cut_note(jar_xm_channel_context_t*);
1075
+ static void jar_xm_key_off(jar_xm_channel_context_t*);
1076
+
1077
+ static void jar_xm_post_pattern_change(jar_xm_context_t*);
1078
+ static void jar_xm_row(jar_xm_context_t*);
1079
+ static void jar_xm_tick(jar_xm_context_t*);
1080
+
1081
+ static void jar_xm_next_of_sample(jar_xm_context_t*, jar_xm_channel_context_t*, int);
1082
+ static void jar_xm_mixdown(jar_xm_context_t*, float*, float*);
1083
+
1084
+ #define jar_xm_TRIGGER_KEEP_VOLUME (1 << 0)
1085
+ #define jar_xm_TRIGGER_KEEP_PERIOD (1 << 1)
1086
+ #define jar_xm_TRIGGER_KEEP_SAMPLE_POSITION (1 << 2)
1087
+
1088
+ // C-2, C#2, D-2, D#2, E-2, F-2, F#2, G-2, G#2, A-2, A#2, B-2, C-3
1089
+ static const uint16_t amiga_frequencies[] = { 1712, 1616, 1525, 1440, 1357, 1281, 1209, 1141, 1077, 1017, 961, 907, 856 };
1090
+
1091
+ // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f
1092
+ static const float multi_retrig_add[] = { 0.f, -1.f, -2.f, -4.f, -8.f, -16.f, 0.f, 0.f, 0.f, 1.f, 2.f, 4.f, 8.f, 16.f, 0.f, 0.f };
1093
+
1094
+ // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f
1095
+ static const float multi_retrig_multiply[] = { 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, .6666667f, .5f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.5f, 2.f };
1096
+
1097
+ #define jar_xm_CLAMP_UP1F(vol, limit) do { \
1098
+ if((vol) > (limit)) (vol) = (limit); \
1099
+ } while(0)
1100
+ #define jar_xm_CLAMP_UP(vol) jar_xm_CLAMP_UP1F((vol), 1.f)
1101
+
1102
+ #define jar_xm_CLAMP_DOWN1F(vol, limit) do { \
1103
+ if((vol) < (limit)) (vol) = (limit); \
1104
+ } while(0)
1105
+ #define jar_xm_CLAMP_DOWN(vol) jar_xm_CLAMP_DOWN1F((vol), .0f)
1106
+
1107
+ #define jar_xm_CLAMP2F(vol, up, down) do { \
1108
+ if((vol) > (up)) (vol) = (up); \
1109
+ else if((vol) < (down)) (vol) = (down); \
1110
+ } while(0)
1111
+ #define jar_xm_CLAMP(vol) jar_xm_CLAMP2F((vol), 1.f, .0f)
1112
+
1113
+ #define jar_xm_SLIDE_TOWARDS(val, goal, incr) do { \
1114
+ if((val) > (goal)) { \
1115
+ (val) -= (incr); \
1116
+ jar_xm_CLAMP_DOWN1F((val), (goal)); \
1117
+ } else if((val) < (goal)) { \
1118
+ (val) += (incr); \
1119
+ jar_xm_CLAMP_UP1F((val), (goal)); \
1120
+ } \
1121
+ } while(0)
1122
+
1123
+ #define jar_xm_LERP(u, v, t) ((u) + (t) * ((v) - (u)))
1124
+ #define jar_xm_INVERSE_LERP(u, v, lerp) (((lerp) - (u)) / ((v) - (u)))
1125
+
1126
+ #define HAS_TONE_PORTAMENTO(s) ((s)->effect_type == 3 \
1127
+ || (s)->effect_type == 5 \
1128
+ || ((s)->volume_column >> 4) == 0xF)
1129
+ #define HAS_ARPEGGIO(s) ((s)->effect_type == 0 \
1130
+ && (s)->effect_param != 0)
1131
+ #define HAS_VIBRATO(s) ((s)->effect_type == 4 \
1132
+ || (s)->effect_param == 6 \
1133
+ || ((s)->volume_column >> 4) == 0xB)
1134
+ #define NOTE_IS_VALID(n) ((n) > 0 && (n) < 97)
1135
+ #define NOTE_OFF 97
1136
+
1137
+ static float jar_xm_waveform(jar_xm_waveform_type_t waveform, uint8_t step) {
1138
+ static unsigned int next_rand = 24492;
1139
+ step %= 0x40;
1140
+ switch(waveform) {
1141
+ case jar_xm_SINE_WAVEFORM: /* No SIN() table used, direct calculation. */
1142
+ return -sinf(2.f * 3.141592f * (float)step / (float)0x40);
1143
+ case jar_xm_RAMP_DOWN_WAVEFORM: /* Ramp down: 1.0f when step = 0; -1.0f when step = 0x40 */
1144
+ return (float)(0x20 - step) / 0x20;
1145
+ case jar_xm_SQUARE_WAVEFORM: /* Square with a 50% duty */
1146
+ return (step >= 0x20) ? 1.f : -1.f;
1147
+ case jar_xm_RANDOM_WAVEFORM: /* Use the POSIX.1-2001 example, just to be deterministic across different machines */
1148
+ next_rand = next_rand * 1103515245 + 12345;
1149
+ return (float)((next_rand >> 16) & 0x7FFF) / (float)0x4000 - 1.f;
1150
+ case jar_xm_RAMP_UP_WAVEFORM: /* Ramp up: -1.f when step = 0; 1.f when step = 0x40 */
1151
+ return (float)(step - 0x20) / 0x20;
1152
+ default:
1153
+ break;
1154
+ }
1155
+ return .0f;
1156
+ }
1157
+
1158
+ static void jar_xm_autovibrato(jar_xm_context_t* ctx, jar_xm_channel_context_t* ch) {
1159
+ if(ch->instrument == NULL || ch->instrument->vibrato_depth == 0) return;
1160
+ jar_xm_instrument_t* instr = ch->instrument;
1161
+ float sweep = 1.f;
1162
+ if(ch->autovibrato_ticks < instr->vibrato_sweep) { sweep = jar_xm_LERP(0.f, 1.f, (float)ch->autovibrato_ticks / (float)instr->vibrato_sweep); }
1163
+ unsigned int step = ((ch->autovibrato_ticks++) * instr->vibrato_rate) >> 2;
1164
+ ch->autovibrato_note_offset = .25f * jar_xm_waveform(instr->vibrato_type, step) * (float)instr->vibrato_depth / (float)0xF * sweep;
1165
+ jar_xm_update_frequency(ctx, ch);
1166
+ }
1167
+
1168
+ static void jar_xm_vibrato(jar_xm_context_t* ctx, jar_xm_channel_context_t* ch, uint8_t param, uint16_t pos) {
1169
+ unsigned int step = pos * (param >> 4);
1170
+ ch->vibrato_note_offset = 2.f * jar_xm_waveform(ch->vibrato_waveform, step) * (float)(param & 0x0F) / (float)0xF;
1171
+ jar_xm_update_frequency(ctx, ch);
1172
+ }
1173
+
1174
+ static void jar_xm_tremolo(jar_xm_context_t* ctx, jar_xm_channel_context_t* ch, uint8_t param, uint16_t pos) {
1175
+ unsigned int step = pos * (param >> 4);
1176
+ ch->tremolo_volume = -1.f * jar_xm_waveform(ch->tremolo_waveform, step) * (float)(param & 0x0F) / (float)0xF;
1177
+ }
1178
+
1179
+ static void jar_xm_arpeggio(jar_xm_context_t* ctx, jar_xm_channel_context_t* ch, uint8_t param, uint16_t tick) {
1180
+ switch(tick % 3) {
1181
+ case 0:
1182
+ ch->arp_in_progress = false;
1183
+ ch->arp_note_offset = 0;
1184
+ break;
1185
+ case 2:
1186
+ ch->arp_in_progress = true;
1187
+ ch->arp_note_offset = param >> 4;
1188
+ break;
1189
+ case 1:
1190
+ ch->arp_in_progress = true;
1191
+ ch->arp_note_offset = param & 0x0F;
1192
+ break;
1193
+ }
1194
+ jar_xm_update_frequency(ctx, ch);
1195
+ }
1196
+
1197
+ static void jar_xm_tone_portamento(jar_xm_context_t* ctx, jar_xm_channel_context_t* ch) {
1198
+ /* 3xx called without a note, wait until we get an actual target note. */
1199
+ if(ch->tone_portamento_target_period == 0.f) return; /* no value, exit */
1200
+ if(ch->period != ch->tone_portamento_target_period) {
1201
+ jar_xm_SLIDE_TOWARDS(ch->period, ch->tone_portamento_target_period, (ctx->module.frequency_type == jar_xm_LINEAR_FREQUENCIES ? 4.f : 1.f) * ch->tone_portamento_param);
1202
+ jar_xm_update_frequency(ctx, ch);
1203
+ }
1204
+ }
1205
+
1206
+ static void jar_xm_pitch_slide(jar_xm_context_t* ctx, jar_xm_channel_context_t* ch, float period_offset) {
1207
+ /* Don't ask about the 4.f coefficient. I found mention of it nowhere. Found by ear™. */
1208
+ if(ctx->module.frequency_type == jar_xm_LINEAR_FREQUENCIES) {period_offset *= 4.f; }
1209
+ ch->period += period_offset;
1210
+ jar_xm_CLAMP_DOWN(ch->period);
1211
+ /* XXX: upper bound of period ? */
1212
+ jar_xm_update_frequency(ctx, ch);
1213
+ }
1214
+
1215
+ static void jar_xm_panning_slide(jar_xm_channel_context_t* ch, uint8_t rawval) {
1216
+ if (rawval & 0xF0) {ch->panning += (float)((rawval & 0xF0 )>> 4) / (float)0xFF;};
1217
+ if (rawval & 0x0F) {ch->panning -= (float)(rawval & 0x0F) / (float)0xFF;};
1218
+ };
1219
+
1220
+ static void jar_xm_volume_slide(jar_xm_channel_context_t* ch, uint8_t rawval) {
1221
+ if (rawval & 0xF0) {ch->volume += (float)((rawval & 0xF0) >> 4) / (float)0x40;};
1222
+ if (rawval & 0x0F) {ch->volume -= (float)(rawval & 0x0F) / (float)0x40;};
1223
+ };
1224
+
1225
+ static float jar_xm_envelope_lerp(jar_xm_envelope_point_t* a, jar_xm_envelope_point_t* b, uint16_t pos) {
1226
+ /* Linear interpolation between two envelope points */
1227
+ if(pos <= a->frame) return a->value;
1228
+ else if(pos >= b->frame) return b->value;
1229
+ else {
1230
+ float p = (float)(pos - a->frame) / (float)(b->frame - a->frame);
1231
+ return a->value * (1 - p) + b->value * p;
1232
+ }
1233
+ }
1234
+
1235
+ static void jar_xm_post_pattern_change(jar_xm_context_t* ctx) {
1236
+ /* Loop if necessary */
1237
+ if(ctx->current_table_index >= ctx->module.length) {
1238
+ ctx->current_table_index = ctx->module.restart_position;
1239
+ ctx->tempo =ctx->default_tempo; // reset to file default value
1240
+ ctx->bpm = ctx->default_bpm; // reset to file default value
1241
+ ctx->global_volume = ctx->default_global_volume; // reset to file default value
1242
+ }
1243
+ }
1244
+
1245
+ static float jar_xm_linear_period(float note) {
1246
+ return 7680.f - note * 64.f;
1247
+ }
1248
+
1249
+ static float jar_xm_linear_frequency(float period) {
1250
+ return 8363.f * powf(2.f, (4608.f - period) / 768.f);
1251
+ }
1252
+
1253
+ static float jar_xm_amiga_period(float note) {
1254
+ unsigned int intnote = note;
1255
+ uint8_t a = intnote % 12;
1256
+ int8_t octave = note / 12.f - 2;
1257
+ uint16_t p1 = amiga_frequencies[a], p2 = amiga_frequencies[a + 1];
1258
+ if(octave > 0) {
1259
+ p1 >>= octave;
1260
+ p2 >>= octave;
1261
+ } else if(octave < 0) {
1262
+ p1 <<= -octave;
1263
+ p2 <<= -octave;
1264
+ }
1265
+ return jar_xm_LERP(p1, p2, note - intnote);
1266
+ }
1267
+
1268
+ static float jar_xm_amiga_frequency(float period) {
1269
+ if(period == .0f) return .0f;
1270
+ return 7093789.2f / (period * 2.f); /* This is the PAL value. (we could use the NTSC value also) */
1271
+ }
1272
+
1273
+ static float jar_xm_period(jar_xm_context_t* ctx, float note) {
1274
+ switch(ctx->module.frequency_type) {
1275
+ case jar_xm_LINEAR_FREQUENCIES:
1276
+ return jar_xm_linear_period(note);
1277
+ case jar_xm_AMIGA_FREQUENCIES:
1278
+ return jar_xm_amiga_period(note);
1279
+ }
1280
+ return .0f;
1281
+ }
1282
+
1283
+ static float jar_xm_frequency(jar_xm_context_t* ctx, float period, float note_offset) {
1284
+ switch(ctx->module.frequency_type) {
1285
+ case jar_xm_LINEAR_FREQUENCIES:
1286
+ return jar_xm_linear_frequency(period - 64.f * note_offset);
1287
+ case jar_xm_AMIGA_FREQUENCIES:
1288
+ if(note_offset == 0) { return jar_xm_amiga_frequency(period); };
1289
+ int8_t octave;
1290
+ float note;
1291
+ uint16_t p1, p2;
1292
+ uint8_t a = octave = 0;
1293
+
1294
+ /* Find the octave of the current period */
1295
+ if(period > amiga_frequencies[0]) {
1296
+ --octave;
1297
+ while(period > (amiga_frequencies[0] << -octave)) --octave;
1298
+ } else if(period < amiga_frequencies[12]) {
1299
+ ++octave;
1300
+ while(period < (amiga_frequencies[12] >> octave)) ++octave;
1301
+ }
1302
+
1303
+ /* Find the smallest note closest to the current period */
1304
+ for(uint8_t i = 0; i < 12; ++i) {
1305
+ p1 = amiga_frequencies[i], p2 = amiga_frequencies[i + 1];
1306
+ if(octave > 0) {
1307
+ p1 >>= octave;
1308
+ p2 >>= octave;
1309
+ } else if(octave < 0) {
1310
+ p1 <<= (-octave);
1311
+ p2 <<= (-octave);
1312
+ }
1313
+ if(p2 <= period && period <= p1) {
1314
+ a = i;
1315
+ break;
1316
+ }
1317
+ }
1318
+ if(JAR_XM_DEBUG && (p1 < period || p2 > period)) { DEBUG("%i <= %f <= %i should hold but doesn't, this is a bug", p2, period, p1); }
1319
+ note = 12.f * (octave + 2) + a + jar_xm_INVERSE_LERP(p1, p2, period);
1320
+ return jar_xm_amiga_frequency(jar_xm_amiga_period(note + note_offset));
1321
+ }
1322
+
1323
+ return .0f;
1324
+ }
1325
+
1326
+ static void jar_xm_update_frequency(jar_xm_context_t* ctx, jar_xm_channel_context_t* ch) {
1327
+ ch->frequency = jar_xm_frequency( ctx, ch->period, (ch->arp_note_offset > 0 ? ch->arp_note_offset : ( ch->vibrato_note_offset + ch->autovibrato_note_offset )) );
1328
+ ch->step = ch->frequency / ctx->rate;
1329
+ }
1330
+
1331
+ static void jar_xm_handle_note_and_instrument(jar_xm_context_t* ctx, jar_xm_channel_context_t* ch, jar_xm_pattern_slot_t* s) {
1332
+ jar_xm_module_t* mod = &(ctx->module);
1333
+ if(s->instrument > 0) {
1334
+ if(HAS_TONE_PORTAMENTO(ch->current) && ch->instrument != NULL && ch->sample != NULL) { /* Tone portamento in effect */
1335
+ jar_xm_trigger_note(ctx, ch, jar_xm_TRIGGER_KEEP_PERIOD | jar_xm_TRIGGER_KEEP_SAMPLE_POSITION);
1336
+ } else if(s->instrument > ctx->module.num_instruments) { /* Invalid instrument, Cut current note */
1337
+ jar_xm_cut_note(ch);
1338
+ ch->instrument = NULL;
1339
+ ch->sample = NULL;
1340
+ } else {
1341
+ ch->instrument = ctx->module.instruments + (s->instrument - 1);
1342
+ if(s->note == 0 && ch->sample != NULL) { /* Ghost instrument, trigger note */
1343
+ /* Sample position is kept, but envelopes are reset */
1344
+ jar_xm_trigger_note(ctx, ch, jar_xm_TRIGGER_KEEP_SAMPLE_POSITION);
1345
+ }
1346
+ }
1347
+ }
1348
+
1349
+ if(NOTE_IS_VALID(s->note)) {
1350
+ // note value is s->note -1
1351
+ jar_xm_instrument_t* instr = ch->instrument;
1352
+ if(HAS_TONE_PORTAMENTO(ch->current) && instr != NULL && ch->sample != NULL) {
1353
+ /* Tone portamento in effect */
1354
+ ch->note = s->note + ch->sample->relative_note + ch->sample->finetune / 128.f - 1.f;
1355
+ ch->tone_portamento_target_period = jar_xm_period(ctx, ch->note);
1356
+ } else if(instr == NULL || ch->instrument->num_samples == 0) { /* Issue on instrument */
1357
+ jar_xm_cut_note(ch);
1358
+ } else {
1359
+ if(instr->sample_of_notes[s->note - 1] < instr->num_samples) {
1360
+ if (mod->ramping) {
1361
+ for(int i = 0; i < jar_xm_SAMPLE_RAMPING_POINTS; ++i) {
1362
+ jar_xm_next_of_sample(ctx, ch, i);
1363
+ }
1364
+ ch->frame_count = 0;
1365
+ };
1366
+ ch->sample = instr->samples + instr->sample_of_notes[s->note - 1];
1367
+ ch->orig_note = ch->note = s->note + ch->sample->relative_note + ch->sample->finetune / 128.f - 1.f;
1368
+ if(s->instrument > 0) {
1369
+ jar_xm_trigger_note(ctx, ch, 0);
1370
+ } else { /* Ghost note: keep old volume */
1371
+ jar_xm_trigger_note(ctx, ch, jar_xm_TRIGGER_KEEP_VOLUME);
1372
+ }
1373
+ } else {
1374
+ jar_xm_cut_note(ch);
1375
+ }
1376
+ }
1377
+ } else if(s->note == NOTE_OFF) {
1378
+ jar_xm_key_off(ch);
1379
+ }
1380
+
1381
+ // Interpret Effect column
1382
+ switch(s->effect_type) {
1383
+ case 1: /* 1xx: Portamento up */
1384
+ if(s->effect_param > 0) { ch->portamento_up_param = s->effect_param; }
1385
+ break;
1386
+ case 2: /* 2xx: Portamento down */
1387
+ if(s->effect_param > 0) { ch->portamento_down_param = s->effect_param; }
1388
+ break;
1389
+ case 3: /* 3xx: Tone portamento */
1390
+ if(s->effect_param > 0) { ch->tone_portamento_param = s->effect_param; }
1391
+ break;
1392
+ case 4: /* 4xy: Vibrato */
1393
+ if(s->effect_param & 0x0F) { ch->vibrato_param = (ch->vibrato_param & 0xF0) | (s->effect_param & 0x0F); } /* Set vibrato depth */
1394
+ if(s->effect_param >> 4) { ch->vibrato_param = (s->effect_param & 0xF0) | (ch->vibrato_param & 0x0F); } /* Set vibrato speed */
1395
+ break;
1396
+ case 5: /* 5xy: Tone portamento + Volume slide */
1397
+ if(s->effect_param > 0) { ch->volume_slide_param = s->effect_param; }
1398
+ break;
1399
+ case 6: /* 6xy: Vibrato + Volume slide */
1400
+ if(s->effect_param > 0) { ch->volume_slide_param = s->effect_param; }
1401
+ break;
1402
+ case 7: /* 7xy: Tremolo */
1403
+ if(s->effect_param & 0x0F) { ch->tremolo_param = (ch->tremolo_param & 0xF0) | (s->effect_param & 0x0F); } /* Set tremolo depth */
1404
+ if(s->effect_param >> 4) { ch->tremolo_param = (s->effect_param & 0xF0) | (ch->tremolo_param & 0x0F); } /* Set tremolo speed */
1405
+ break;
1406
+ case 8: /* 8xx: Set panning */
1407
+ ch->panning = (float)s->effect_param / 255.f;
1408
+ break;
1409
+ case 9: /* 9xx: Sample offset */
1410
+ if(ch->sample != 0) { //&& NOTE_IS_VALID(s->note)) {
1411
+ uint32_t final_offset = s->effect_param << (ch->sample->bits == 16 ? 7 : 8);
1412
+ switch (ch->sample->loop_type) {
1413
+ case jar_xm_NO_LOOP:
1414
+ if(final_offset >= ch->sample->length) { /* Pretend the sample dosen't loop and is done playing */
1415
+ ch->sample_position = -1;
1416
+ } else {
1417
+ ch->sample_position = final_offset;
1418
+ }
1419
+ break;
1420
+ case jar_xm_FORWARD_LOOP:
1421
+ if (final_offset >= ch->sample->loop_end) {
1422
+ ch->sample_position -= ch->sample->loop_length;
1423
+ } else if(final_offset >= ch->sample->length) {
1424
+ ch->sample_position = ch->sample->loop_start;
1425
+ } else {
1426
+ ch->sample_position = final_offset;
1427
+ }
1428
+ break;
1429
+ case jar_xm_PING_PONG_LOOP:
1430
+ if(final_offset >= ch->sample->loop_end) {
1431
+ ch->ping = false;
1432
+ ch->sample_position = (ch->sample->loop_end << 1) - ch->sample_position;
1433
+ } else if(final_offset >= ch->sample->length) {
1434
+ ch->ping = false;
1435
+ ch->sample_position -= ch->sample->length - 1;
1436
+ } else {
1437
+ ch->sample_position = final_offset;
1438
+ };
1439
+ break;
1440
+ }
1441
+ }
1442
+ break;
1443
+ case 0xA: /* Axy: Volume slide */
1444
+ if(s->effect_param > 0) { ch->volume_slide_param = s->effect_param; }
1445
+ break;
1446
+ case 0xB: /* Bxx: Position jump */
1447
+ if(s->effect_param < ctx->module.length) {
1448
+ ctx->position_jump = true;
1449
+ ctx->jump_dest = s->effect_param;
1450
+ }
1451
+ break;
1452
+ case 0xC: /* Cxx: Set volume */
1453
+ ch->volume = (float)((s->effect_param > 0x40) ? 0x40 : s->effect_param) / (float)0x40;
1454
+ break;
1455
+ case 0xD: /* Dxx: Pattern break */
1456
+ /* Jump after playing this line */
1457
+ ctx->pattern_break = true;
1458
+ ctx->jump_row = (s->effect_param >> 4) * 10 + (s->effect_param & 0x0F);
1459
+ break;
1460
+ case 0xE: /* EXy: Extended command */
1461
+ switch(s->effect_param >> 4) {
1462
+ case 1: /* E1y: Fine portamento up */
1463
+ if(s->effect_param & 0x0F) { ch->fine_portamento_up_param = s->effect_param & 0x0F; }
1464
+ jar_xm_pitch_slide(ctx, ch, -ch->fine_portamento_up_param);
1465
+ break;
1466
+ case 2: /* E2y: Fine portamento down */
1467
+ if(s->effect_param & 0x0F) { ch->fine_portamento_down_param = s->effect_param & 0x0F; }
1468
+ jar_xm_pitch_slide(ctx, ch, ch->fine_portamento_down_param);
1469
+ break;
1470
+ case 4: /* E4y: Set vibrato control */
1471
+ ch->vibrato_waveform = s->effect_param & 3;
1472
+ ch->vibrato_waveform_retrigger = !((s->effect_param >> 2) & 1);
1473
+ break;
1474
+ case 5: /* E5y: Set finetune */
1475
+ if(NOTE_IS_VALID(ch->current->note) && ch->sample != NULL) {
1476
+ ch->note = ch->current->note + ch->sample->relative_note + (float)(((s->effect_param & 0x0F) - 8) << 4) / 128.f - 1.f;
1477
+ ch->period = jar_xm_period(ctx, ch->note);
1478
+ jar_xm_update_frequency(ctx, ch);
1479
+ }
1480
+ break;
1481
+ case 6: /* E6y: Pattern loop */
1482
+ if(s->effect_param & 0x0F) {
1483
+ if((s->effect_param & 0x0F) == ch->pattern_loop_count) { /* Loop is over */
1484
+ ch->pattern_loop_count = 0;
1485
+ ctx->position_jump = false;
1486
+ } else { /* Jump to the beginning of the loop */
1487
+ ch->pattern_loop_count++;
1488
+ ctx->position_jump = true;
1489
+ ctx->jump_row = ch->pattern_loop_origin;
1490
+ ctx->jump_dest = ctx->current_table_index;
1491
+ }
1492
+ } else {
1493
+ ch->pattern_loop_origin = ctx->current_row; /* Set loop start point */
1494
+ ctx->jump_row = ch->pattern_loop_origin; /* Replicate FT2 E60 bug */
1495
+ }
1496
+ break;
1497
+ case 7: /* E7y: Set tremolo control */
1498
+ ch->tremolo_waveform = s->effect_param & 3;
1499
+ ch->tremolo_waveform_retrigger = !((s->effect_param >> 2) & 1);
1500
+ break;
1501
+ case 0xA: /* EAy: Fine volume slide up */
1502
+ if(s->effect_param & 0x0F) { ch->fine_volume_slide_param = s->effect_param & 0x0F; }
1503
+ jar_xm_volume_slide(ch, ch->fine_volume_slide_param << 4);
1504
+ break;
1505
+ case 0xB: /* EBy: Fine volume slide down */
1506
+ if(s->effect_param & 0x0F) { ch->fine_volume_slide_param = s->effect_param & 0x0F; }
1507
+ jar_xm_volume_slide(ch, ch->fine_volume_slide_param);
1508
+ break;
1509
+ case 0xD: /* EDy: Note delay */
1510
+ /* XXX: figure this out better. EDx triggers the note even when there no note and no instrument. But ED0 acts like like a ghost note, EDx (x ≠ 0) does not. */
1511
+ if(s->note == 0 && s->instrument == 0) {
1512
+ unsigned int flags = jar_xm_TRIGGER_KEEP_VOLUME;
1513
+ if(ch->current->effect_param & 0x0F) {
1514
+ ch->note = ch->orig_note;
1515
+ jar_xm_trigger_note(ctx, ch, flags);
1516
+ } else {
1517
+ jar_xm_trigger_note(ctx, ch, flags | jar_xm_TRIGGER_KEEP_PERIOD | jar_xm_TRIGGER_KEEP_SAMPLE_POSITION );
1518
+ }
1519
+ }
1520
+ break;
1521
+
1522
+ case 0xE: /* EEy: Pattern delay */
1523
+ ctx->extra_ticks = (ch->current->effect_param & 0x0F) * ctx->tempo;
1524
+ break;
1525
+ default:
1526
+ break;
1527
+ }
1528
+ break;
1529
+
1530
+ case 0xF: /* Fxx: Set tempo/BPM */
1531
+ if(s->effect_param > 0) {
1532
+ if(s->effect_param <= 0x1F) { // First 32 possible values adjust the ticks (goes into tempo)
1533
+ ctx->tempo = s->effect_param;
1534
+ } else { //32 and greater values adjust the BPM
1535
+ ctx->bpm = s->effect_param;
1536
+ }
1537
+ }
1538
+ break;
1539
+
1540
+ case 16: /* Gxx: Set global volume */
1541
+ ctx->global_volume = (float)((s->effect_param > 0x40) ? 0x40 : s->effect_param) / (float)0x40;
1542
+ break;
1543
+ case 17: /* Hxy: Global volume slide */
1544
+ if(s->effect_param > 0) { ch->global_volume_slide_param = s->effect_param; }
1545
+ break;
1546
+ case 21: /* Lxx: Set envelope position */
1547
+ ch->volume_envelope_frame_count = s->effect_param;
1548
+ ch->panning_envelope_frame_count = s->effect_param;
1549
+ break;
1550
+ case 25: /* Pxy: Panning slide */
1551
+ if(s->effect_param > 0) { ch->panning_slide_param = s->effect_param; }
1552
+ break;
1553
+ case 27: /* Rxy: Multi retrig note */
1554
+ if(s->effect_param > 0) {
1555
+ if((s->effect_param >> 4) == 0) { /* Keep previous x value */
1556
+ ch->multi_retrig_param = (ch->multi_retrig_param & 0xF0) | (s->effect_param & 0x0F);
1557
+ } else {
1558
+ ch->multi_retrig_param = s->effect_param;
1559
+ }
1560
+ }
1561
+ break;
1562
+ case 29: /* Txy: Tremor */
1563
+ if(s->effect_param > 0) { ch->tremor_param = s->effect_param; } /* Tremor x and y params are not separately kept in memory, unlike Rxy */
1564
+ break;
1565
+ case 33: /* Xxy: Extra stuff */
1566
+ switch(s->effect_param >> 4) {
1567
+ case 1: /* X1y: Extra fine portamento up */
1568
+ if(s->effect_param & 0x0F) { ch->extra_fine_portamento_up_param = s->effect_param & 0x0F; }
1569
+ jar_xm_pitch_slide(ctx, ch, -1.0f * ch->extra_fine_portamento_up_param);
1570
+ break;
1571
+ case 2: /* X2y: Extra fine portamento down */
1572
+ if(s->effect_param & 0x0F) { ch->extra_fine_portamento_down_param = s->effect_param & 0x0F; }
1573
+ jar_xm_pitch_slide(ctx, ch, ch->extra_fine_portamento_down_param);
1574
+ break;
1575
+ default:
1576
+ break;
1577
+ }
1578
+ break;
1579
+ default:
1580
+ break;
1581
+ }
1582
+ }
1583
+
1584
+ static void jar_xm_trigger_note(jar_xm_context_t* ctx, jar_xm_channel_context_t* ch, unsigned int flags) {
1585
+ if (!(flags & jar_xm_TRIGGER_KEEP_SAMPLE_POSITION)) {
1586
+ ch->sample_position = 0.f;
1587
+ ch->ping = true;
1588
+ };
1589
+
1590
+ if (!(flags & jar_xm_TRIGGER_KEEP_VOLUME)) {
1591
+ if(ch->sample != NULL) {
1592
+ ch->volume = ch->sample->volume;
1593
+ };
1594
+ };
1595
+ ch->panning = ch->sample->panning;
1596
+ ch->sustained = true;
1597
+ ch->fadeout_volume = ch->volume_envelope_volume = 1.0f;
1598
+ ch->panning_envelope_panning = .5f;
1599
+ ch->volume_envelope_frame_count = ch->panning_envelope_frame_count = 0;
1600
+ ch->vibrato_note_offset = 0.f;
1601
+ ch->tremolo_volume = 0.f;
1602
+ ch->tremor_on = false;
1603
+ ch->autovibrato_ticks = 0;
1604
+
1605
+ if(ch->vibrato_waveform_retrigger) { ch->vibrato_ticks = 0; } /* XXX: should the waveform itself also be reset to sine? */
1606
+ if(ch->tremolo_waveform_retrigger) { ch->tremolo_ticks = 0; }
1607
+ if(!(flags & jar_xm_TRIGGER_KEEP_PERIOD)) {
1608
+ ch->period = jar_xm_period(ctx, ch->note);
1609
+ jar_xm_update_frequency(ctx, ch);
1610
+ }
1611
+ ch->latest_trigger = ctx->generated_samples;
1612
+ if(ch->instrument != NULL) { ch->instrument->latest_trigger = ctx->generated_samples; }
1613
+ if(ch->sample != NULL) { ch->sample->latest_trigger = ctx->generated_samples; }
1614
+ }
1615
+
1616
+ static void jar_xm_cut_note(jar_xm_channel_context_t* ch) {
1617
+ ch->volume = .0f; /* NB: this is not the same as Key Off */
1618
+ // ch->curr_left = .0f;
1619
+ // ch->curr_right = .0f;
1620
+ }
1621
+
1622
+ static void jar_xm_key_off(jar_xm_channel_context_t* ch) {
1623
+ ch->sustained = false; /* Key Off */
1624
+ if(ch->instrument == NULL || !ch->instrument->volume_envelope.enabled) { jar_xm_cut_note(ch); } /* If no volume envelope is used, also cut the note */
1625
+ }
1626
+
1627
+ static void jar_xm_row(jar_xm_context_t* ctx) {
1628
+ if(ctx->position_jump) {
1629
+ ctx->current_table_index = ctx->jump_dest;
1630
+ ctx->current_row = ctx->jump_row;
1631
+ ctx->position_jump = false;
1632
+ ctx->pattern_break = false;
1633
+ ctx->jump_row = 0;
1634
+ jar_xm_post_pattern_change(ctx);
1635
+ } else if(ctx->pattern_break) {
1636
+ ctx->current_table_index++;
1637
+ ctx->current_row = ctx->jump_row;
1638
+ ctx->pattern_break = false;
1639
+ ctx->jump_row = 0;
1640
+ jar_xm_post_pattern_change(ctx);
1641
+ }
1642
+ jar_xm_pattern_t* cur = ctx->module.patterns + ctx->module.pattern_table[ctx->current_table_index];
1643
+ bool in_a_loop = false;
1644
+
1645
+ /* Read notes information for all channels into temporary pattern slot */
1646
+ for(uint8_t i = 0; i < ctx->module.num_channels; ++i) {
1647
+ jar_xm_pattern_slot_t* s = cur->slots + ctx->current_row * ctx->module.num_channels + i;
1648
+ jar_xm_channel_context_t* ch = ctx->channels + i;
1649
+ ch->current = s;
1650
+ // If there is no note delay effect (0xED) then...
1651
+ if(s->effect_type != 0xE || s->effect_param >> 4 != 0xD) {
1652
+ //********** Process the channel slot information **********
1653
+ jar_xm_handle_note_and_instrument(ctx, ch, s);
1654
+ } else {
1655
+ // read the note delay information
1656
+ ch->note_delay_param = s->effect_param & 0x0F;
1657
+ }
1658
+ if(!in_a_loop && ch->pattern_loop_count > 0) {
1659
+ // clarify if in a loop or not
1660
+ in_a_loop = true;
1661
+ }
1662
+ }
1663
+
1664
+ if(!in_a_loop) {
1665
+ /* No E6y loop is in effect (or we are in the first pass) */
1666
+ ctx->loop_count = (ctx->row_loop_count[MAX_NUM_ROWS * ctx->current_table_index + ctx->current_row]++);
1667
+ }
1668
+
1669
+ /// Move to next row
1670
+ ctx->current_row++; /* uint8 warning: can increment from 255 to 0, in which case it is still necessary to go the next pattern. */
1671
+ if (!ctx->position_jump && !ctx->pattern_break && (ctx->current_row >= cur->num_rows || ctx->current_row == 0)) {
1672
+ ctx->current_table_index++;
1673
+ ctx->current_row = ctx->jump_row; /* This will be 0 most of the time, except when E60 is used */
1674
+ ctx->jump_row = 0;
1675
+ jar_xm_post_pattern_change(ctx);
1676
+ }
1677
+ }
1678
+
1679
+ static void jar_xm_envelope_tick(jar_xm_channel_context_t *ch, jar_xm_envelope_t *env, uint16_t *counter, float *outval) {
1680
+ if(env->num_points < 2) {
1681
+ if(env->num_points == 1) {
1682
+ *outval = (float)env->points[0].value / (float)0x40;
1683
+ if(*outval > 1) { *outval = 1; };
1684
+ } else {;
1685
+ return;
1686
+ };
1687
+ } else {
1688
+ if(env->loop_enabled) {
1689
+ uint16_t loop_start = env->points[env->loop_start_point].frame;
1690
+ uint16_t loop_end = env->points[env->loop_end_point].frame;
1691
+ uint16_t loop_length = loop_end - loop_start;
1692
+ if(*counter >= loop_end) { *counter -= loop_length; };
1693
+ };
1694
+ for(uint8_t j = 0; j < (env->num_points - 1); ++j) {
1695
+ if(env->points[j].frame <= *counter && env->points[j+1].frame >= *counter) {
1696
+ *outval = jar_xm_envelope_lerp(env->points + j, env->points + j + 1, *counter) / (float)0x40;
1697
+ break;
1698
+ };
1699
+ };
1700
+ /* Make sure it is safe to increment frame count */
1701
+ if(!ch->sustained || !env->sustain_enabled || *counter != env->points[env->sustain_point].frame) { (*counter)++; };
1702
+ };
1703
+ };
1704
+
1705
+ static void jar_xm_envelopes(jar_xm_channel_context_t *ch) {
1706
+ if(ch->instrument != NULL) {
1707
+ if(ch->instrument->volume_envelope.enabled) {
1708
+ if(!ch->sustained) {
1709
+ ch->fadeout_volume -= (float)ch->instrument->volume_fadeout / 65536.f;
1710
+ jar_xm_CLAMP_DOWN(ch->fadeout_volume);
1711
+ };
1712
+ jar_xm_envelope_tick(ch, &(ch->instrument->volume_envelope), &(ch->volume_envelope_frame_count), &(ch->volume_envelope_volume));
1713
+ };
1714
+ if(ch->instrument->panning_envelope.enabled) {
1715
+ jar_xm_envelope_tick(ch, &(ch->instrument->panning_envelope), &(ch->panning_envelope_frame_count), &(ch->panning_envelope_panning));
1716
+ };
1717
+ };
1718
+ };
1719
+
1720
+ static void jar_xm_tick(jar_xm_context_t* ctx) {
1721
+ if(ctx->current_tick == 0) {
1722
+ jar_xm_row(ctx); // We have processed all ticks and we run the row
1723
+ }
1724
+
1725
+ jar_xm_module_t* mod = &(ctx->module);
1726
+ for(uint8_t i = 0; i < ctx->module.num_channels; ++i) {
1727
+ jar_xm_channel_context_t* ch = ctx->channels + i;
1728
+ jar_xm_envelopes(ch);
1729
+ jar_xm_autovibrato(ctx, ch);
1730
+ if(ch->arp_in_progress && !HAS_ARPEGGIO(ch->current)) {
1731
+ ch->arp_in_progress = false;
1732
+ ch->arp_note_offset = 0;
1733
+ jar_xm_update_frequency(ctx, ch);
1734
+ }
1735
+ if(ch->vibrato_in_progress && !HAS_VIBRATO(ch->current)) {
1736
+ ch->vibrato_in_progress = false;
1737
+ ch->vibrato_note_offset = 0.f;
1738
+ jar_xm_update_frequency(ctx, ch);
1739
+ }
1740
+
1741
+ // Effects in volumne column mostly handled on a per tick basis
1742
+ switch(ch->current->volume_column & 0xF0) {
1743
+ case 0x50: // Checks for volume = 64
1744
+ if(ch->current->volume_column != 0x50) break;
1745
+ case 0x10: // Set volume 0-15
1746
+ case 0x20: // Set volume 16-32
1747
+ case 0x30: // Set volume 32-48
1748
+ case 0x40: // Set volume 48-64
1749
+ ch->volume = (float)(ch->current->volume_column - 16) / 64.0f;
1750
+ break;
1751
+ case 0x60: // Volume slide down
1752
+ jar_xm_volume_slide(ch, ch->current->volume_column & 0x0F);
1753
+ break;
1754
+ case 0x70: // Volume slide up
1755
+ jar_xm_volume_slide(ch, ch->current->volume_column << 4);
1756
+ break;
1757
+ case 0x80: // Fine volume slide down
1758
+ jar_xm_volume_slide(ch, ch->current->volume_column & 0x0F);
1759
+ break;
1760
+ case 0x90: // Fine volume slide up
1761
+ jar_xm_volume_slide(ch, ch->current->volume_column << 4);
1762
+ break;
1763
+ case 0xA0: // Set vibrato speed
1764
+ ch->vibrato_param = (ch->vibrato_param & 0x0F) | ((ch->current->volume_column & 0x0F) << 4);
1765
+ break;
1766
+ case 0xB0: // Vibrato
1767
+ ch->vibrato_in_progress = false;
1768
+ jar_xm_vibrato(ctx, ch, ch->vibrato_param, ch->vibrato_ticks++);
1769
+ break;
1770
+ case 0xC0: // Set panning
1771
+ if(!ctx->current_tick ) {
1772
+ ch->panning = (float)(ch->current->volume_column & 0x0F) / 15.0f;
1773
+ }
1774
+ break;
1775
+ case 0xD0: // Panning slide left
1776
+ jar_xm_panning_slide(ch, ch->current->volume_column & 0x0F);
1777
+ break;
1778
+ case 0xE0: // Panning slide right
1779
+ jar_xm_panning_slide(ch, ch->current->volume_column << 4);
1780
+ break;
1781
+ case 0xF0: // Tone portamento
1782
+ if(!ctx->current_tick ) {
1783
+ if(ch->current->volume_column & 0x0F) { ch->tone_portamento_param = ((ch->current->volume_column & 0x0F) << 4) | (ch->current->volume_column & 0x0F); }
1784
+ };
1785
+ jar_xm_tone_portamento(ctx, ch);
1786
+ break;
1787
+ default:
1788
+ break;
1789
+ }
1790
+
1791
+ // Only some standard effects handled on a per tick basis
1792
+ // see jar_xm_handle_note_and_instrument for all effects handling on a per row basis
1793
+ switch(ch->current->effect_type) {
1794
+ case 0: /* 0xy: Arpeggio */
1795
+ if(ch->current->effect_param > 0) {
1796
+ char arp_offset = ctx->tempo % 3;
1797
+ switch(arp_offset) {
1798
+ case 2: /* 0 -> x -> 0 -> y -> x -> … */
1799
+ if(ctx->current_tick == 1) {
1800
+ ch->arp_in_progress = true;
1801
+ ch->arp_note_offset = ch->current->effect_param >> 4;
1802
+ jar_xm_update_frequency(ctx, ch);
1803
+ break;
1804
+ }
1805
+ /* No break here, this is intended */
1806
+ case 1: /* 0 -> 0 -> y -> x -> … */
1807
+ if(ctx->current_tick == 0) {
1808
+ ch->arp_in_progress = false;
1809
+ ch->arp_note_offset = 0;
1810
+ jar_xm_update_frequency(ctx, ch);
1811
+ break;
1812
+ }
1813
+ /* No break here, this is intended */
1814
+ case 0: /* 0 -> y -> x -> … */
1815
+ jar_xm_arpeggio(ctx, ch, ch->current->effect_param, ctx->current_tick - arp_offset);
1816
+ default:
1817
+ break;
1818
+ }
1819
+ }
1820
+ break;
1821
+
1822
+ case 1: /* 1xx: Portamento up */
1823
+ if(ctx->current_tick == 0) break;
1824
+ jar_xm_pitch_slide(ctx, ch, -ch->portamento_up_param);
1825
+ break;
1826
+ case 2: /* 2xx: Portamento down */
1827
+ if(ctx->current_tick == 0) break;
1828
+ jar_xm_pitch_slide(ctx, ch, ch->portamento_down_param);
1829
+ break;
1830
+ case 3: /* 3xx: Tone portamento */
1831
+ if(ctx->current_tick == 0) break;
1832
+ jar_xm_tone_portamento(ctx, ch);
1833
+ break;
1834
+ case 4: /* 4xy: Vibrato */
1835
+ if(ctx->current_tick == 0) break;
1836
+ ch->vibrato_in_progress = true;
1837
+ jar_xm_vibrato(ctx, ch, ch->vibrato_param, ch->vibrato_ticks++);
1838
+ break;
1839
+ case 5: /* 5xy: Tone portamento + Volume slide */
1840
+ if(ctx->current_tick == 0) break;
1841
+ jar_xm_tone_portamento(ctx, ch);
1842
+ jar_xm_volume_slide(ch, ch->volume_slide_param);
1843
+ break;
1844
+ case 6: /* 6xy: Vibrato + Volume slide */
1845
+ if(ctx->current_tick == 0) break;
1846
+ ch->vibrato_in_progress = true;
1847
+ jar_xm_vibrato(ctx, ch, ch->vibrato_param, ch->vibrato_ticks++);
1848
+ jar_xm_volume_slide(ch, ch->volume_slide_param);
1849
+ break;
1850
+ case 7: /* 7xy: Tremolo */
1851
+ if(ctx->current_tick == 0) break;
1852
+ jar_xm_tremolo(ctx, ch, ch->tremolo_param, ch->tremolo_ticks++);
1853
+ break;
1854
+ case 8: /* 8xy: Set panning */
1855
+ break;
1856
+ case 9: /* 9xy: Sample offset */
1857
+ break;
1858
+ case 0xA: /* Axy: Volume slide */
1859
+ if(ctx->current_tick == 0) break;
1860
+ jar_xm_volume_slide(ch, ch->volume_slide_param);
1861
+ break;
1862
+ case 0xE: /* EXy: Extended command */
1863
+ switch(ch->current->effect_param >> 4) {
1864
+ case 0x9: /* E9y: Retrigger note */
1865
+ if(ctx->current_tick != 0 && ch->current->effect_param & 0x0F) {
1866
+ if(!(ctx->current_tick % (ch->current->effect_param & 0x0F))) {
1867
+ jar_xm_trigger_note(ctx, ch, 0);
1868
+ jar_xm_envelopes(ch);
1869
+ }
1870
+ }
1871
+ break;
1872
+ case 0xC: /* ECy: Note cut */
1873
+ if((ch->current->effect_param & 0x0F) == ctx->current_tick) {
1874
+ jar_xm_cut_note(ch);
1875
+ }
1876
+ break;
1877
+ case 0xD: /* EDy: Note delay */
1878
+ if(ch->note_delay_param == ctx->current_tick) {
1879
+ jar_xm_handle_note_and_instrument(ctx, ch, ch->current);
1880
+ jar_xm_envelopes(ch);
1881
+ }
1882
+ break;
1883
+ default:
1884
+ break;
1885
+ }
1886
+ break;
1887
+ case 16: /* Fxy: Set tempo/BPM */
1888
+ break;
1889
+ case 17: /* Hxy: Global volume slide */
1890
+ if(ctx->current_tick == 0) break;
1891
+ if((ch->global_volume_slide_param & 0xF0) && (ch->global_volume_slide_param & 0x0F)) { break; }; /* Invalid state */
1892
+ if(ch->global_volume_slide_param & 0xF0) { /* Global slide up */
1893
+ float f = (float)(ch->global_volume_slide_param >> 4) / (float)0x40;
1894
+ ctx->global_volume += f;
1895
+ jar_xm_CLAMP_UP(ctx->global_volume);
1896
+ } else { /* Global slide down */
1897
+ float f = (float)(ch->global_volume_slide_param & 0x0F) / (float)0x40;
1898
+ ctx->global_volume -= f;
1899
+ jar_xm_CLAMP_DOWN(ctx->global_volume);
1900
+ };
1901
+ break;
1902
+
1903
+ case 20: /* Kxx: Key off */
1904
+ if(ctx->current_tick == ch->current->effect_param) { jar_xm_key_off(ch); };
1905
+ break;
1906
+ case 21: /* Lxx: Set envelope position */
1907
+ break;
1908
+ case 25: /* Pxy: Panning slide */
1909
+ if(ctx->current_tick == 0) break;
1910
+ jar_xm_panning_slide(ch, ch->panning_slide_param);
1911
+ break;
1912
+ case 27: /* Rxy: Multi retrig note */
1913
+ if(ctx->current_tick == 0) break;
1914
+ if(((ch->multi_retrig_param) & 0x0F) == 0) break;
1915
+ if((ctx->current_tick % (ch->multi_retrig_param & 0x0F)) == 0) {
1916
+ float v = ch->volume * multi_retrig_multiply[ch->multi_retrig_param >> 4]
1917
+ + multi_retrig_add[ch->multi_retrig_param >> 4];
1918
+ jar_xm_CLAMP(v);
1919
+ jar_xm_trigger_note(ctx, ch, 0);
1920
+ ch->volume = v;
1921
+ };
1922
+ break;
1923
+
1924
+ case 29: /* Txy: Tremor */
1925
+ if(ctx->current_tick == 0) break;
1926
+ ch->tremor_on = ( (ctx->current_tick - 1) % ((ch->tremor_param >> 4) + (ch->tremor_param & 0x0F) + 2) > (ch->tremor_param >> 4) );
1927
+ break;
1928
+ default:
1929
+ break;
1930
+ };
1931
+
1932
+ float panning, volume;
1933
+ panning = ch->panning + (ch->panning_envelope_panning - .5f) * (.5f - fabs(ch->panning - .5f)) * 2.0f;
1934
+ if(ch->tremor_on) {
1935
+ volume = .0f;
1936
+ } else {
1937
+ volume = ch->volume + ch->tremolo_volume;
1938
+ jar_xm_CLAMP(volume);
1939
+ volume *= ch->fadeout_volume * ch->volume_envelope_volume;
1940
+ };
1941
+
1942
+ if (mod->ramping) {
1943
+ ch->target_panning = panning;
1944
+ ch->target_volume = volume;
1945
+ } else {
1946
+ ch->actual_panning = panning;
1947
+ ch->actual_volume = volume;
1948
+ };
1949
+ };
1950
+
1951
+ ctx->current_tick++; // ok so we understand that ticks increment within the row
1952
+ if(ctx->current_tick >= ctx->tempo + ctx->extra_ticks) {
1953
+ // This means it reached the end of the row and we reset
1954
+ ctx->current_tick = 0;
1955
+ ctx->extra_ticks = 0;
1956
+ };
1957
+
1958
+ // Number of ticks / second = BPM * 0.4
1959
+ ctx->remaining_samples_in_tick += (float)ctx->rate / ((float)ctx->bpm * 0.4f);
1960
+ };
1961
+
1962
+ static void jar_xm_next_of_sample(jar_xm_context_t* ctx, jar_xm_channel_context_t* ch, int previous) {
1963
+ jar_xm_module_t* mod = &(ctx->module);
1964
+
1965
+ // ch->curr_left = 0.f;
1966
+ // ch->curr_right = 0.f;
1967
+ if(ch->instrument == NULL || ch->sample == NULL || ch->sample_position < 0) {
1968
+ ch->curr_left = 0.f;
1969
+ ch->curr_right = 0.f;
1970
+ if (mod->ramping) {
1971
+ if (ch->frame_count < jar_xm_SAMPLE_RAMPING_POINTS) {
1972
+ if (previous > -1) {
1973
+ ch->end_of_previous_sample_left[previous] = jar_xm_LERP(ch->end_of_previous_sample_left[ch->frame_count], ch->curr_left, (float)ch->frame_count / (float)jar_xm_SAMPLE_RAMPING_POINTS);
1974
+ ch->end_of_previous_sample_right[previous] = jar_xm_LERP(ch->end_of_previous_sample_right[ch->frame_count], ch->curr_right, (float)ch->frame_count / (float)jar_xm_SAMPLE_RAMPING_POINTS);
1975
+ } else {
1976
+ ch->curr_left = jar_xm_LERP(ch->end_of_previous_sample_left[ch->frame_count], ch->curr_left, (float)ch->frame_count / (float)jar_xm_SAMPLE_RAMPING_POINTS);
1977
+ ch->curr_right = jar_xm_LERP(ch->end_of_previous_sample_right[ch->frame_count], ch->curr_right, (float)ch->frame_count / (float)jar_xm_SAMPLE_RAMPING_POINTS);
1978
+ };
1979
+ };
1980
+ };
1981
+ return;
1982
+ };
1983
+ if(ch->sample->length == 0) {
1984
+ return;
1985
+ };
1986
+
1987
+ float t = 0.f;
1988
+ uint32_t b = 0;
1989
+ if(mod->linear_interpolation) {
1990
+ b = ch->sample_position + 1;
1991
+ t = ch->sample_position - (uint32_t)ch->sample_position; /* Cheaper than fmodf(., 1.f) */
1992
+ };
1993
+
1994
+ float u_left, u_right;
1995
+ u_left = ch->sample->data[(uint32_t)ch->sample_position];
1996
+ if (ch->sample->stereo) {
1997
+ u_right = ch->sample->data[(uint32_t)ch->sample_position + ch->sample->length];
1998
+ } else {
1999
+ u_right = u_left;
2000
+ };
2001
+ float v_left = 0.f, v_right = 0.f;
2002
+ switch(ch->sample->loop_type) {
2003
+ case jar_xm_NO_LOOP:
2004
+ if(mod->linear_interpolation) {
2005
+ v_left = (b < ch->sample->length) ? ch->sample->data[b] : .0f;
2006
+ if (ch->sample->stereo) {
2007
+ v_right = (b < ch->sample->length) ? ch->sample->data[b + ch->sample->length] : .0f;
2008
+ } else {
2009
+ v_right = v_left;
2010
+ };
2011
+ };
2012
+ ch->sample_position += ch->step;
2013
+ if(ch->sample_position >= ch->sample->length) { ch->sample_position = -1; } // stop playing this sample
2014
+ break;
2015
+ case jar_xm_FORWARD_LOOP:
2016
+ if(mod->linear_interpolation) {
2017
+ v_left = ch->sample->data[ (b == ch->sample->loop_end) ? ch->sample->loop_start : b ];
2018
+ if (ch->sample->stereo) {
2019
+ v_right = ch->sample->data[ (b == ch->sample->loop_end) ? ch->sample->loop_start + ch->sample->length : b + ch->sample->length];
2020
+ } else {
2021
+ v_right = v_left;
2022
+ };
2023
+ };
2024
+ ch->sample_position += ch->step;
2025
+ if (ch->sample_position >= ch->sample->loop_end) {
2026
+ ch->sample_position -= ch->sample->loop_length;
2027
+ };
2028
+ if(ch->sample_position >= ch->sample->length) {
2029
+ ch->sample_position = ch->sample->loop_start;
2030
+ };
2031
+ break;
2032
+ case jar_xm_PING_PONG_LOOP:
2033
+ if(ch->ping) {
2034
+ if(mod->linear_interpolation) {
2035
+ v_left = (b >= ch->sample->loop_end) ? ch->sample->data[(uint32_t)ch->sample_position] : ch->sample->data[b];
2036
+ if (ch->sample->stereo) {
2037
+ v_right = (b >= ch->sample->loop_end) ? ch->sample->data[(uint32_t)ch->sample_position + ch->sample->length] : ch->sample->data[b + ch->sample->length];
2038
+ } else {
2039
+ v_right = v_left;
2040
+ };
2041
+ };
2042
+ ch->sample_position += ch->step;
2043
+ if(ch->sample_position >= ch->sample->loop_end) {
2044
+ ch->ping = false;
2045
+ ch->sample_position = (ch->sample->loop_end << 1) - ch->sample_position;
2046
+ };
2047
+ if(ch->sample_position >= ch->sample->length) {
2048
+ ch->ping = false;
2049
+ ch->sample_position -= ch->sample->length - 1;
2050
+ };
2051
+ } else {
2052
+ if(mod->linear_interpolation) {
2053
+ v_left = u_left;
2054
+ v_right = u_right;
2055
+ u_left = (b == 1 || b - 2 <= ch->sample->loop_start) ? ch->sample->data[(uint32_t)ch->sample_position] : ch->sample->data[b - 2];
2056
+ if (ch->sample->stereo) {
2057
+ u_right = (b == 1 || b - 2 <= ch->sample->loop_start) ? ch->sample->data[(uint32_t)ch->sample_position + ch->sample->length] : ch->sample->data[b + ch->sample->length - 2];
2058
+ } else {
2059
+ u_right = u_left;
2060
+ };
2061
+ };
2062
+ ch->sample_position -= ch->step;
2063
+ if(ch->sample_position <= ch->sample->loop_start) {
2064
+ ch->ping = true;
2065
+ ch->sample_position = (ch->sample->loop_start << 1) - ch->sample_position;
2066
+ };
2067
+ if (ch->sample_position <= .0f) {
2068
+ ch->ping = true;
2069
+ ch->sample_position = .0f;
2070
+ };
2071
+ };
2072
+ break;
2073
+
2074
+ default:
2075
+ v_left = .0f;
2076
+ v_right = .0f;
2077
+ break;
2078
+ };
2079
+
2080
+ float endval_left = mod->linear_interpolation ? jar_xm_LERP(u_left, v_left, t) : u_left;
2081
+ float endval_right = mod->linear_interpolation ? jar_xm_LERP(u_right, v_right, t) : u_right;
2082
+
2083
+ if (mod->ramping) {
2084
+ if(ch->frame_count < jar_xm_SAMPLE_RAMPING_POINTS) {
2085
+ /* Smoothly transition between old and new sample. */
2086
+ if (previous > -1) {
2087
+ ch->end_of_previous_sample_left[previous] = jar_xm_LERP(ch->end_of_previous_sample_left[ch->frame_count], endval_left, (float)ch->frame_count / (float)jar_xm_SAMPLE_RAMPING_POINTS);
2088
+ ch->end_of_previous_sample_right[previous] = jar_xm_LERP(ch->end_of_previous_sample_right[ch->frame_count], endval_right, (float)ch->frame_count / (float)jar_xm_SAMPLE_RAMPING_POINTS);
2089
+ } else {
2090
+ ch->curr_left = jar_xm_LERP(ch->end_of_previous_sample_left[ch->frame_count], endval_left, (float)ch->frame_count / (float)jar_xm_SAMPLE_RAMPING_POINTS);
2091
+ ch->curr_right = jar_xm_LERP(ch->end_of_previous_sample_right[ch->frame_count], endval_right, (float)ch->frame_count / (float)jar_xm_SAMPLE_RAMPING_POINTS);
2092
+ };
2093
+ };
2094
+ };
2095
+
2096
+ if (previous > -1) {
2097
+ ch->end_of_previous_sample_left[previous] = endval_left;
2098
+ ch->end_of_previous_sample_right[previous] = endval_right;
2099
+ } else {
2100
+ ch->curr_left = endval_left;
2101
+ ch->curr_right = endval_right;
2102
+ };
2103
+ };
2104
+
2105
+ // gather all channel audio into stereo float
2106
+ static void jar_xm_mixdown(jar_xm_context_t* ctx, float* left, float* right) {
2107
+ jar_xm_module_t* mod = &(ctx->module);
2108
+
2109
+ if(ctx->remaining_samples_in_tick <= 0) {
2110
+ jar_xm_tick(ctx);
2111
+ };
2112
+ ctx->remaining_samples_in_tick--;
2113
+ *left = 0.f;
2114
+ *right = 0.f;
2115
+ if(ctx->max_loop_count > 0 && ctx->loop_count > ctx->max_loop_count) { return; }
2116
+
2117
+ for(uint8_t i = 0; i < ctx->module.num_channels; ++i) {
2118
+ jar_xm_channel_context_t* ch = ctx->channels + i;
2119
+ if(ch->instrument != NULL && ch->sample != NULL && ch->sample_position >= 0) {
2120
+ jar_xm_next_of_sample(ctx, ch, -1);
2121
+ if(!ch->muted && !ch->instrument->muted) {
2122
+ *left += ch->curr_left * ch->actual_volume * (1.f - ch->actual_panning);
2123
+ *right += ch->curr_right * ch->actual_volume * ch->actual_panning;
2124
+ };
2125
+
2126
+ if (mod->ramping) {
2127
+ ch->frame_count++;
2128
+ jar_xm_SLIDE_TOWARDS(ch->actual_volume, ch->target_volume, ctx->volume_ramp);
2129
+ jar_xm_SLIDE_TOWARDS(ch->actual_panning, ch->target_panning, ctx->panning_ramp);
2130
+ };
2131
+ };
2132
+ };
2133
+ if (ctx->global_volume != 1.0f) {
2134
+ *left *= ctx->global_volume;
2135
+ *right *= ctx->global_volume;
2136
+ };
2137
+
2138
+ // experimental
2139
+ // float counter = (float)ctx->generated_samples * 0.0001f
2140
+ // *left = tan(&left + sin(counter));
2141
+ // *right = tan(&right + cos(counter));
2142
+
2143
+ // apply brick wall limiter when audio goes beyond bounderies
2144
+ if(*left < -1.0) {*left = -1.0;} else if(*left > 1.0) {*left = 1.0;};
2145
+ if(*right < -1.0) {*right = -1.0;} else if(*right > 1.0) {*right = 1.0;};
2146
+ };
2147
+
2148
+ void jar_xm_generate_samples(jar_xm_context_t* ctx, float* output, size_t numsamples) {
2149
+ if(ctx && output) {
2150
+ ctx->generated_samples += numsamples;
2151
+ for(size_t i = 0; i < numsamples; i++) {
2152
+ jar_xm_mixdown(ctx, output + (2 * i), output + (2 * i + 1));
2153
+ };
2154
+ };
2155
+ };
2156
+
2157
+ uint64_t jar_xm_get_remaining_samples(jar_xm_context_t* ctx) {
2158
+ uint64_t total = 0;
2159
+ uint8_t currentLoopCount = jar_xm_get_loop_count(ctx);
2160
+ jar_xm_set_max_loop_count(ctx, 0);
2161
+ while(jar_xm_get_loop_count(ctx) == currentLoopCount) {
2162
+ total += ctx->remaining_samples_in_tick;
2163
+ ctx->remaining_samples_in_tick = 0;
2164
+ jar_xm_tick(ctx);
2165
+ }
2166
+ ctx->loop_count = currentLoopCount;
2167
+ return total;
2168
+ }
2169
+
2170
+ //--------------------------------------------
2171
+ //FILE LOADER - TODO - NEEDS TO BE CLEANED UP
2172
+ //--------------------------------------------
2173
+ #undef DEBUG
2174
+ #define DEBUG(...) do { \
2175
+ fprintf(stderr, __VA_ARGS__); \
2176
+ fflush(stderr); \
2177
+ } while(0)
2178
+
2179
+ #define DEBUG_ERR(...) do { \
2180
+ fprintf(stderr, __VA_ARGS__); \
2181
+ fflush(stderr); \
2182
+ } while(0)
2183
+
2184
+ #define FATAL(...) do { \
2185
+ fprintf(stderr, __VA_ARGS__); \
2186
+ fflush(stderr); \
2187
+ exit(1); \
2188
+ } while(0)
2189
+
2190
+ #define FATAL_ERR(...) do { \
2191
+ fprintf(stderr, __VA_ARGS__); \
2192
+ fflush(stderr); \
2193
+ exit(1); \
2194
+ } while(0)
2195
+
2196
+
2197
+ int jar_xm_create_context_from_file(jar_xm_context_t** ctx, uint32_t rate, const char* filename) {
2198
+ FILE* xmf;
2199
+ int size;
2200
+ int ret;
2201
+
2202
+ xmf = fopen(filename, "rb");
2203
+ if(xmf == NULL) {
2204
+ DEBUG_ERR("Could not open input file");
2205
+ *ctx = NULL;
2206
+ return 3;
2207
+ }
2208
+
2209
+ fseek(xmf, 0, SEEK_END);
2210
+ size = ftell(xmf);
2211
+ rewind(xmf);
2212
+ if(size == -1) {
2213
+ fclose(xmf);
2214
+ DEBUG_ERR("fseek() failed");
2215
+ *ctx = NULL;
2216
+ return 4;
2217
+ }
2218
+
2219
+ char* data = JARXM_MALLOC(size + 1);
2220
+ if(!data || fread(data, 1, size, xmf) < size) {
2221
+ fclose(xmf);
2222
+ DEBUG_ERR(data ? "fread() failed" : "JARXM_MALLOC() failed");
2223
+ JARXM_FREE(data);
2224
+ *ctx = NULL;
2225
+ return 5;
2226
+ }
2227
+
2228
+ fclose(xmf);
2229
+
2230
+ ret = jar_xm_create_context_safe(ctx, data, size, rate);
2231
+ JARXM_FREE(data);
2232
+
2233
+ switch(ret) {
2234
+ case 0:
2235
+ break;
2236
+ case 1: DEBUG("could not create context: module is not sane\n");
2237
+ *ctx = NULL;
2238
+ return 1;
2239
+ break;
2240
+ case 2: FATAL("could not create context: malloc failed\n");
2241
+ return 2;
2242
+ break;
2243
+ default: FATAL("could not create context: unknown error\n");
2244
+ return 6;
2245
+ break;
2246
+ }
2247
+
2248
+ return 0;
2249
+ }
2250
+
2251
+ // not part of the original library
2252
+ void jar_xm_reset(jar_xm_context_t* ctx) {
2253
+ for (uint16_t i = 0; i < jar_xm_get_number_of_channels(ctx); i++) {
2254
+ jar_xm_cut_note(&ctx->channels[i]);
2255
+ }
2256
+ ctx->current_row = 0;
2257
+ ctx->current_table_index = 0;
2258
+ ctx->current_tick = 0;
2259
+ ctx->tempo =ctx->default_tempo; // reset to file default value
2260
+ ctx->bpm = ctx->default_bpm; // reset to file default value
2261
+ ctx->global_volume = ctx->default_global_volume; // reset to file default value
2262
+ }
2263
+
2264
+
2265
+ void jar_xm_flip_linear_interpolation(jar_xm_context_t* ctx) {
2266
+ if (ctx->module.linear_interpolation) {
2267
+ ctx->module.linear_interpolation = 0;
2268
+ } else {
2269
+ ctx->module.linear_interpolation = 1;
2270
+ }
2271
+ }
2272
+
2273
+ void jar_xm_table_jump(jar_xm_context_t* ctx, int table_ptr) {
2274
+ for (uint16_t i = 0; i < jar_xm_get_number_of_channels(ctx); i++) {
2275
+ jar_xm_cut_note(&ctx->channels[i]);
2276
+ }
2277
+ ctx->current_row = 0;
2278
+ ctx->current_tick = 0;
2279
+ if(table_ptr > 0 && table_ptr < ctx->module.length) {
2280
+ ctx->current_table_index = table_ptr;
2281
+ ctx->module.restart_position = table_ptr; // The reason to jump is to start a new loop or track
2282
+ } else {
2283
+ ctx->current_table_index = 0;
2284
+ ctx->module.restart_position = 0; // The reason to jump is to start a new loop or track
2285
+ ctx->tempo =ctx->default_tempo; // reset to file default value
2286
+ ctx->bpm = ctx->default_bpm; // reset to file default value
2287
+ ctx->global_volume = ctx->default_global_volume; // reset to file default value
2288
+ };
2289
+ }
2290
+
2291
+
2292
+ // TRANSLATE NOTE NUMBER INTO USER VALUE (ie. 1 = C-1, 2 = C#1, 3 = D-1 ... )
2293
+ const char* xm_note_chr(int number) {
2294
+ if (number == NOTE_OFF) {
2295
+ return "==";
2296
+ };
2297
+ number = number % 12;
2298
+ switch(number) {
2299
+ case 1: return "C-";
2300
+ case 2: return "C#";
2301
+ case 3: return "D-";
2302
+ case 4: return "D#";
2303
+ case 5: return "E-";
2304
+ case 6: return "F-";
2305
+ case 7: return "F#";
2306
+ case 8: return "G-";
2307
+ case 9: return "G#";
2308
+ case 10: return "A-";
2309
+ case 11: return "A#";
2310
+ case 12: return "B-";
2311
+ };
2312
+ return "??";
2313
+ };
2314
+
2315
+ const char* xm_octave_chr(int number) {
2316
+ if (number == NOTE_OFF) {
2317
+ return "=";
2318
+ };
2319
+
2320
+ int number2 = number - number % 12;
2321
+ int result = floor(number2 / 12) + 1;
2322
+ switch(result) {
2323
+ case 1: return "1";
2324
+ case 2: return "2";
2325
+ case 3: return "3";
2326
+ case 4: return "4";
2327
+ case 5: return "5";
2328
+ case 6: return "6";
2329
+ case 7: return "7";
2330
+ case 8: return "8";
2331
+ default: return "?"; /* UNKNOWN */
2332
+ };
2333
+
2334
+ };
2335
+
2336
+ // TRANSLATE NOTE EFFECT CODE INTO USER VALUE
2337
+ const char* xm_effect_chr(int fx) {
2338
+ switch(fx) {
2339
+ case 0: return "0"; /* ZERO = NO EFFECT */
2340
+ case 1: return "1"; /* 1xx: Portamento up */
2341
+ case 2: return "2"; /* 2xx: Portamento down */
2342
+ case 3: return "3"; /* 3xx: Tone portamento */
2343
+ case 4: return "4"; /* 4xy: Vibrato */
2344
+ case 5: return "5"; /* 5xy: Tone portamento + Volume slide */
2345
+ case 6: return "6"; /* 6xy: Vibrato + Volume slide */
2346
+ case 7: return "7"; /* 7xy: Tremolo */
2347
+ case 8: return "8"; /* 8xx: Set panning */
2348
+ case 9: return "9"; /* 9xx: Sample offset */
2349
+ case 0xA: return "A";/* Axy: Volume slide */
2350
+ case 0xB: return "B";/* Bxx: Position jump */
2351
+ case 0xC: return "C";/* Cxx: Set volume */
2352
+ case 0xD: return "D";/* Dxx: Pattern break */
2353
+ case 0xE: return "E";/* EXy: Extended command */
2354
+ case 0xF: return "F";/* Fxx: Set tempo/BPM */
2355
+ case 16: return "G"; /* Gxx: Set global volume */
2356
+ case 17: return "H"; /* Hxy: Global volume slide */
2357
+ case 21: return "L"; /* Lxx: Set envelope position */
2358
+ case 25: return "P"; /* Pxy: Panning slide */
2359
+ case 27: return "R"; /* Rxy: Multi retrig note */
2360
+ case 29: return "T"; /* Txy: Tremor */
2361
+ case 33: return "X"; /* Xxy: Extra stuff */
2362
+ default: return "?"; /* UNKNOWN */
2363
+ };
2364
+ }
2365
+
2366
+ #ifdef JAR_XM_RAYLIB
2367
+
2368
+ #include "raylib.h" // Need RayLib API calls for the DEBUG display
2369
+
2370
+ void jar_xm_debug(jar_xm_context_t *ctx) {
2371
+ int size=40;
2372
+ int x = 0, y = 0;
2373
+
2374
+ // DEBUG VARIABLES
2375
+ y += size; DrawText(TextFormat("CUR TBL = %i", ctx->current_table_index), x, y, size, WHITE);
2376
+ y += size; DrawText(TextFormat("CUR PAT = %i", ctx->module.pattern_table[ctx->current_table_index]), x, y, size, WHITE);
2377
+ y += size; DrawText(TextFormat("POS JMP = %d", ctx->position_jump), x, y, size, WHITE);
2378
+ y += size; DrawText(TextFormat("JMP DST = %i", ctx->jump_dest), x, y, size, WHITE);
2379
+ y += size; DrawText(TextFormat("PTN BRK = %d", ctx->pattern_break), x, y, size, WHITE);
2380
+ y += size; DrawText(TextFormat("CUR ROW = %i", ctx->current_row), x, y, size, WHITE);
2381
+ y += size; DrawText(TextFormat("JMP ROW = %i", ctx->jump_row), x, y, size, WHITE);
2382
+ y += size; DrawText(TextFormat("ROW LCT = %i", ctx->row_loop_count), x, y, size, WHITE);
2383
+ y += size; DrawText(TextFormat("LCT = %i", ctx->loop_count), x, y, size, WHITE);
2384
+ y += size; DrawText(TextFormat("MAX LCT = %i", ctx->max_loop_count), x, y, size, WHITE);
2385
+ x = size * 12; y = 0;
2386
+
2387
+ y += size; DrawText(TextFormat("CUR TCK = %i", ctx->current_tick), x, y, size, WHITE);
2388
+ y += size; DrawText(TextFormat("XTR TCK = %i", ctx->extra_ticks), x, y, size, WHITE);
2389
+ y += size; DrawText(TextFormat("TCK/ROW = %i", ctx->tempo), x, y, size, ORANGE);
2390
+ y += size; DrawText(TextFormat("SPL TCK = %f", ctx->remaining_samples_in_tick), x, y, size, WHITE);
2391
+ y += size; DrawText(TextFormat("GEN SPL = %i", ctx->generated_samples), x, y, size, WHITE);
2392
+ y += size * 7;
2393
+
2394
+ x = 0;
2395
+ size=16;
2396
+ // TIMELINE OF MODULE
2397
+ for (int i=0; i < ctx->module.length; i++) {
2398
+ if (i == ctx->jump_dest) {
2399
+ if (ctx->position_jump) {
2400
+ DrawRectangle(i * size * 2, y - size, size * 2, size, GOLD);
2401
+ } else {
2402
+ DrawRectangle(i * size * 2, y - size, size * 2, size, BROWN);
2403
+ };
2404
+ };
2405
+ if (i == ctx->current_table_index) {
2406
+ // DrawText(TextFormat("%02X", ctx->current_tick), i * size * 2, y - size, size, WHITE);
2407
+ DrawRectangle(i * size * 2, y, size * 2, size, RED);
2408
+ DrawText(TextFormat("%02X", ctx->current_row), i * size * 2, y - size, size, YELLOW);
2409
+ } else {
2410
+ DrawRectangle(i * size * 2, y, size * 2, size, ORANGE);
2411
+ };
2412
+ DrawText(TextFormat("%02X", ctx->module.pattern_table[i]), i * size * 2, y, size, WHITE);
2413
+ };
2414
+ y += size;
2415
+
2416
+ jar_xm_pattern_t* cur = ctx->module.patterns + ctx->module.pattern_table[ctx->current_table_index];
2417
+
2418
+ /* DISPLAY CURRENTLY PLAYING PATTERN */
2419
+
2420
+ x += 2 * size;
2421
+ for(uint8_t i = 0; i < ctx->module.num_channels; i++) {
2422
+ DrawRectangle(x, y, 8 * size, size, PURPLE);
2423
+ DrawText("N", x, y, size, YELLOW);
2424
+ DrawText("I", x + size * 2, y, size, YELLOW);
2425
+ DrawText("V", x + size * 4, y, size, YELLOW);
2426
+ DrawText("FX", x + size * 6, y, size, YELLOW);
2427
+ x += 9 * size;
2428
+ };
2429
+ x += size;
2430
+ for (int j=(ctx->current_row - 14); j<(ctx->current_row + 15); j++) {
2431
+ y += size;
2432
+ x = 0;
2433
+ if (j >=0 && j < (cur->num_rows)) {
2434
+ DrawRectangle(x, y, size * 2, size, BROWN);
2435
+ DrawText(TextFormat("%02X",j), x, y, size, WHITE);
2436
+ x += 2 * size;
2437
+ for(uint8_t i = 0; i < ctx->module.num_channels; i++) {
2438
+ if (j==(ctx->current_row)) {
2439
+ DrawRectangle(x, y, 8 * size, size, DARKGREEN);
2440
+ } else {
2441
+ DrawRectangle(x, y, 8 * size, size, DARKGRAY);
2442
+ };
2443
+ jar_xm_pattern_slot_t *s = cur->slots + j * ctx->module.num_channels + i;
2444
+ // jar_xm_channel_context_t *ch = ctx->channels + i;
2445
+ if (s->note > 0) {DrawText(TextFormat("%s%s", xm_note_chr(s->note), xm_octave_chr(s->note) ), x, y, size, WHITE);} else {DrawText("...", x, y, size, GRAY);};
2446
+ if (s->instrument > 0) {
2447
+ DrawText(TextFormat("%02X", s->instrument), x + size * 2, y, size, WHITE);
2448
+ if (s->volume_column == 0) {
2449
+ DrawText(TextFormat("%02X", 64), x + size * 4, y, size, YELLOW);
2450
+ };
2451
+ } else {
2452
+ DrawText("..", x + size * 2, y, size, GRAY);
2453
+ if (s->volume_column == 0) {
2454
+ DrawText("..", x + size * 4, y, size, GRAY);
2455
+ };
2456
+ };
2457
+ if (s->volume_column > 0) {DrawText(TextFormat("%02X", (s->volume_column - 16)), x + size * 4, y, size, WHITE);};
2458
+ if (s->effect_type > 0 || s->effect_param > 0) {DrawText(TextFormat("%s%02X", xm_effect_chr(s->effect_type), s->effect_param), x + size * 6, y, size, WHITE);};
2459
+ x += 9 * size;
2460
+ };
2461
+ };
2462
+ };
2463
+
2464
+ }
2465
+ #endif // RayLib extension
2466
+
2467
+ #endif//end of JAR_XM_IMPLEMENTATION
2468
+ //-------------------------------------------------------------------------------
2469
+
2470
+ #endif//end of INCLUDE_JAR_XM_H