From 9df7f283013d16a5848d4223b7c8786a4e62cfa4 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Thu, 25 Jan 2024 03:04:34 +0900 Subject: [PATCH] ambient mixer --- ...uscular_summer.1.ogg => crepuscular.1.ogg} | 0 ...uscular_summer.2.ogg => crepuscular.2.ogg} | 0 ...uscular_summer.3.ogg => crepuscular.3.ogg} | 0 ...uscular_summer.4.ogg => crepuscular.4.ogg} | 0 ...uscular_summer.5.ogg => crepuscular.5.ogg} | 0 ...uscular_summer.6.ogg => crepuscular.6.ogg} | 0 ...uscular_summer.7.ogg => crepuscular.7.ogg} | 0 ...uscular_summer.8.ogg => crepuscular.8.ogg} | 0 .../audio/ambient/season/matutinal.1.ogg | 3 + .../audio/ambient/season/matutinal.2.ogg | 3 + ...nocturnal_summer.1.ogg => nocturnal.1.ogg} | 0 .../sounds/ambient/ambient_forest_01.ogg | 3 - .../sounds/ambient/ambient_meadow_01.ogg | 3 - .../sounds/ambient/ambient_windy_01.ogg | 3 - .../sounds/ambient/ambient_woods_01.ogg | 3 - .../basegame/sounds/ambient/crickets_01.ogg | 3 - .../basegame/sounds/ambient/crickets_02.ogg | 3 - .../sounds/effects/power_button_push.wav | Bin 27178 -> 0 bytes src/net/torvald/terrarum/CreditSingleton.kt | 5 +- src/net/torvald/terrarum/audio/AudioMixer.kt | 120 +++++++++------ .../terrarum/audio/MixerTrackProcessor.kt | 22 ++- .../terrarum/modulebasegame/TerrarumIngame.kt | 3 +- .../modulebasegame/TerrarumMusicGovernor.kt | 138 +++++++++++++++--- .../terrarum/modulebasegame/TitleScreen.kt | 2 +- 24 files changed, 216 insertions(+), 98 deletions(-) rename assets/mods/basegame/audio/ambient/season/{crepuscular_summer.1.ogg => crepuscular.1.ogg} (100%) rename assets/mods/basegame/audio/ambient/season/{crepuscular_summer.2.ogg => crepuscular.2.ogg} (100%) rename assets/mods/basegame/audio/ambient/season/{crepuscular_summer.3.ogg => crepuscular.3.ogg} (100%) rename assets/mods/basegame/audio/ambient/season/{crepuscular_summer.4.ogg => crepuscular.4.ogg} (100%) rename assets/mods/basegame/audio/ambient/season/{crepuscular_summer.5.ogg => crepuscular.5.ogg} (100%) rename assets/mods/basegame/audio/ambient/season/{crepuscular_summer.6.ogg => crepuscular.6.ogg} (100%) rename assets/mods/basegame/audio/ambient/season/{crepuscular_summer.7.ogg => crepuscular.7.ogg} (100%) rename assets/mods/basegame/audio/ambient/season/{crepuscular_summer.8.ogg => crepuscular.8.ogg} (100%) create mode 100644 assets/mods/basegame/audio/ambient/season/matutinal.1.ogg create mode 100644 assets/mods/basegame/audio/ambient/season/matutinal.2.ogg rename assets/mods/basegame/audio/ambient/season/{nocturnal_summer.1.ogg => nocturnal.1.ogg} (100%) delete mode 100644 assets/mods/basegame/sounds/ambient/ambient_forest_01.ogg delete mode 100644 assets/mods/basegame/sounds/ambient/ambient_meadow_01.ogg delete mode 100644 assets/mods/basegame/sounds/ambient/ambient_windy_01.ogg delete mode 100644 assets/mods/basegame/sounds/ambient/ambient_woods_01.ogg delete mode 100644 assets/mods/basegame/sounds/ambient/crickets_01.ogg delete mode 100644 assets/mods/basegame/sounds/ambient/crickets_02.ogg delete mode 100644 assets/mods/basegame/sounds/effects/power_button_push.wav diff --git a/assets/mods/basegame/audio/ambient/season/crepuscular_summer.1.ogg b/assets/mods/basegame/audio/ambient/season/crepuscular.1.ogg similarity index 100% rename from assets/mods/basegame/audio/ambient/season/crepuscular_summer.1.ogg rename to assets/mods/basegame/audio/ambient/season/crepuscular.1.ogg diff --git a/assets/mods/basegame/audio/ambient/season/crepuscular_summer.2.ogg b/assets/mods/basegame/audio/ambient/season/crepuscular.2.ogg similarity index 100% rename from assets/mods/basegame/audio/ambient/season/crepuscular_summer.2.ogg rename to assets/mods/basegame/audio/ambient/season/crepuscular.2.ogg diff --git a/assets/mods/basegame/audio/ambient/season/crepuscular_summer.3.ogg b/assets/mods/basegame/audio/ambient/season/crepuscular.3.ogg similarity index 100% rename from assets/mods/basegame/audio/ambient/season/crepuscular_summer.3.ogg rename to assets/mods/basegame/audio/ambient/season/crepuscular.3.ogg diff --git a/assets/mods/basegame/audio/ambient/season/crepuscular_summer.4.ogg b/assets/mods/basegame/audio/ambient/season/crepuscular.4.ogg similarity index 100% rename from assets/mods/basegame/audio/ambient/season/crepuscular_summer.4.ogg rename to assets/mods/basegame/audio/ambient/season/crepuscular.4.ogg diff --git a/assets/mods/basegame/audio/ambient/season/crepuscular_summer.5.ogg b/assets/mods/basegame/audio/ambient/season/crepuscular.5.ogg similarity index 100% rename from assets/mods/basegame/audio/ambient/season/crepuscular_summer.5.ogg rename to assets/mods/basegame/audio/ambient/season/crepuscular.5.ogg diff --git a/assets/mods/basegame/audio/ambient/season/crepuscular_summer.6.ogg b/assets/mods/basegame/audio/ambient/season/crepuscular.6.ogg similarity index 100% rename from assets/mods/basegame/audio/ambient/season/crepuscular_summer.6.ogg rename to assets/mods/basegame/audio/ambient/season/crepuscular.6.ogg diff --git a/assets/mods/basegame/audio/ambient/season/crepuscular_summer.7.ogg b/assets/mods/basegame/audio/ambient/season/crepuscular.7.ogg similarity index 100% rename from assets/mods/basegame/audio/ambient/season/crepuscular_summer.7.ogg rename to assets/mods/basegame/audio/ambient/season/crepuscular.7.ogg diff --git a/assets/mods/basegame/audio/ambient/season/crepuscular_summer.8.ogg b/assets/mods/basegame/audio/ambient/season/crepuscular.8.ogg similarity index 100% rename from assets/mods/basegame/audio/ambient/season/crepuscular_summer.8.ogg rename to assets/mods/basegame/audio/ambient/season/crepuscular.8.ogg diff --git a/assets/mods/basegame/audio/ambient/season/matutinal.1.ogg b/assets/mods/basegame/audio/ambient/season/matutinal.1.ogg new file mode 100644 index 000000000..7b2b3cffd --- /dev/null +++ b/assets/mods/basegame/audio/ambient/season/matutinal.1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3512d59ee1184c055920869616395af7e8dd3ef2f4dd550b8ea6cdb865cffeee +size 5055841 diff --git a/assets/mods/basegame/audio/ambient/season/matutinal.2.ogg b/assets/mods/basegame/audio/ambient/season/matutinal.2.ogg new file mode 100644 index 000000000..c7a3b0e9a --- /dev/null +++ b/assets/mods/basegame/audio/ambient/season/matutinal.2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f4872cbb7c6f5011a8483a3f071af430a9d6b0d246830c8160c21cc225043f22 +size 2655030 diff --git a/assets/mods/basegame/audio/ambient/season/nocturnal_summer.1.ogg b/assets/mods/basegame/audio/ambient/season/nocturnal.1.ogg similarity index 100% rename from assets/mods/basegame/audio/ambient/season/nocturnal_summer.1.ogg rename to assets/mods/basegame/audio/ambient/season/nocturnal.1.ogg diff --git a/assets/mods/basegame/sounds/ambient/ambient_forest_01.ogg b/assets/mods/basegame/sounds/ambient/ambient_forest_01.ogg deleted file mode 100644 index 259c63b89..000000000 --- a/assets/mods/basegame/sounds/ambient/ambient_forest_01.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:34e4726370b05ca5d86f9da90b92019133ea5e4e295b7cdb827902939ee80225 -size 47830918 diff --git a/assets/mods/basegame/sounds/ambient/ambient_meadow_01.ogg b/assets/mods/basegame/sounds/ambient/ambient_meadow_01.ogg deleted file mode 100644 index 655003e4e..000000000 --- a/assets/mods/basegame/sounds/ambient/ambient_meadow_01.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8ca210dc0d6d510c6759ecfb1a18f5f5bde7d755d349b655985f51bf4fd659ea -size 32842648 diff --git a/assets/mods/basegame/sounds/ambient/ambient_windy_01.ogg b/assets/mods/basegame/sounds/ambient/ambient_windy_01.ogg deleted file mode 100644 index bf5c15750..000000000 --- a/assets/mods/basegame/sounds/ambient/ambient_windy_01.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e63d8f2c6c735ed9972584724a8e518f89ce19dee57b66c6c623cbf9a316d07 -size 44738208 diff --git a/assets/mods/basegame/sounds/ambient/ambient_woods_01.ogg b/assets/mods/basegame/sounds/ambient/ambient_woods_01.ogg deleted file mode 100644 index a45f8535a..000000000 --- a/assets/mods/basegame/sounds/ambient/ambient_woods_01.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:64c4b711a05a5a2f68e15721a39e66b141c7f4ef5ab0a1fed898e9c468798187 -size 36846225 diff --git a/assets/mods/basegame/sounds/ambient/crickets_01.ogg b/assets/mods/basegame/sounds/ambient/crickets_01.ogg deleted file mode 100644 index 49f51094b..000000000 --- a/assets/mods/basegame/sounds/ambient/crickets_01.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cd2158ed8559895338cf0a06c05137767064e90670f342c1b739b07924f1dd6d -size 14517832 diff --git a/assets/mods/basegame/sounds/ambient/crickets_02.ogg b/assets/mods/basegame/sounds/ambient/crickets_02.ogg deleted file mode 100644 index 7c9a291c8..000000000 --- a/assets/mods/basegame/sounds/ambient/crickets_02.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:290fa34b30a9940e63b0e8421b687c49fa5a8d28e87680d2b52e1abe32bcf40d -size 17169001 diff --git a/assets/mods/basegame/sounds/effects/power_button_push.wav b/assets/mods/basegame/sounds/effects/power_button_push.wav deleted file mode 100644 index f3c700249557090d507ad0316b834da3ca03e6b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27178 zcmeI42b5Jsv+uk2nLv&rD54}IX~;ox&N-@}0}L4kXND|DMv^RdZVpYj>@8HH*DDahs=EN;NJrYJdnTx2|SR%0|`8kzyk?9kiY{8 zJdnTx2|SR%0|`8k!2eeg=o}drnYXS|N9_@N$R4!&?LM{F?y*1Eo%VaX-EOs;?MA!7 zerwm;uhbg#g<7RnsAX!2`dodcK2ZzQd^^|9u^-wG>`XhuPP6aW$##NzQ;k)l^$0yo z577fvKNX{*Rd3tFcCnr8%l0MP*0!`wZ9`kv*0fdB^Qx>Wp^B>K)RQWo%42ic>^8Ga zXG5*B$@ZSQsjk}d>a;qp59y!uZnZ;gRvXkhMzdTkW)ySPZ1ujHuHIG?y`D#^VQPpP zsN&SC^xI4Iu-)jnv+ZbJq4y59JtKIL)=srkFYxmP^&;&h)j_>tJ2Jv3uJ2)csy=)_ zP7P3lx!(vihI>z-j~VuTJKN5)3z5NcwOW0pzGXZ+)NaOhNFQgM=hYR)d`~4?r9xC% zl}TmSIrU>YAM<;Td6r=bqv;);3Jy;L1L(GuikmMoBgWbV)pdJwDALti|bz;=3Hrg^%-Bm~Fj?AMy^J?WZ z4>Wcf=sK#Vsp?jA%bJq5sCrfxbn-g6^}{-=%Amr@?HH42?wT9sk~wRCQAgB4wO8#@ z+teoY4YOMViB8MqGx*kM(N4U z`+9+1uGXvV>L>M!zNGJJtJ66-^b`6yT}oHhb#-(7qVBAEqhCYy7(G!>)9>q#)hBj| zU1`_Yujz54*9^I)xDxnQASo?w<>h`FyW zg`LQ_FU!_6>*AN)nt$WH%#*H+dSa0C>i%vQIy~AcW8>SkAF7h3{D~5U3qSsJjsi)K zXU(0IGwnkW*`CO{Kg*uXM>3zwlp}NPtf#VnpCe7KjE@EL7ARQr*>VwA%Y0iYShIM; zi!{@$AnGE{6WS~%@;|Vf;=MGNa-MiPu}osE@HW@F9v*n? z%}ehmEK0vV+wL?cLvDo!GUdqr^h4#-HOSUJYjn<$x2IiLcyW#15pv922?>T}3_gCP zNLZz38)bPZyjS+YImh37FMhsWnc>?Uy8?%UzXq@0Pdpd6n?C%Z%y~kdOjkI4N$2?s z)$Y_%^#hH=n}@c(-|oVTC)=OukkBDxhjbmn+Xr3>z8K%uX{DR1CdmzxYwPOam2LT( zB`*}Y_HSV^l5AV(PeY%Yy>*80%e;zU~bXH)xp5(ld zW<>aF!G0<_q^IeU_)6G|S=yv+p_?T(N~(Xq?%mqSHQnk7)!eF~RfAP;S4*g7s@ob) ztqgV2*9&W?o4PHNT01W|FUNOI?C$nSh)o_4I#iEJd_zrgrknQzbJ8qymIPPnb;;i) zZZo^oK85uL&IB$vR|B{7eVrU)1A#!eNpCWltRPYjo6|gE9<{k`Zj(EhJLyq3mwGtx zkj@^=lAJL)U1C_0)~-$r-VI(4UJRZI9ybTn9=lC#2w4-lOn++TxbK?D!LeqjjdgnH zNY&P95~!^!+fvSRfqWsk!ZN1`53%OHxu(wP6VAbq-GQxYgI#M@m_=&7J3IIuIyy1< zM)K(3>%k$x0l~OnUxUS~t}04(Qk`t1d0D;ebkNdXwy%J7uP7hQy4Y@}huaIw>T6?7 zKQqt_Hbc#DGXjhrr^aK&lhxZ;&kQ|NeV{&c<~Vcpd}l%66aAU`9BW!?m!b8`)N;K7 zi&?+#!P+e3< z)4{Z}txQwX(9~hQDynj-B$)WDDyZ_R+>W49MwQlvfDXwv-rTm=?InB8oVF*-5p&S& zvp;~fThu0l1>=!cflf=*BK3)$uji_d^oRO=B?vW5y`!e+NeYCrx(=^2^MPt;`URNV5O^vjp%xKyeJJyWlUT>H;%$x3bcf1|1 zCxC$yoC$iOn&?b)CMlXTiJm8^$#$}tY`u5vM0^L=*|*Gi_f0!ajkBZGDDFGLzHW!v z*X$ttOg|N?#bfnmRlBJ!x)c83W%ZJNLAOz@RCCo-HBt@0z1pg#t!}EC%Jz9%-j=nc zO(|Q#M%ZGuur8#ZLzd5|r={7a?NjP0&4X9Z*k|o?_BmBp7f}(mxGJej>$0l6s)Prw zu4-}L2C6Z=w8ks8*OB;JclA-@KEXPx653`D}hwP(Q7o1>=jV2z0QFF0U&pPZp}KYN(nZ zi&m;F%)s-@*jW$N$3}ZTc_1$R>)L1*ljCMzv zk#@KpCc1?W$9Jp#x}T0yaacx-?aQk7k!HQdY@;py9|jO-`{Dlwqam-OyJPKmGs#S~ z@7WK{Jo6cL`2`+wGv4}uJ*Lj;YdW5doAf$|&Z`SCqiVX5ZpTW-=-2fGJyS2#tMx|x zqdoznN-}Be!?vI;X{*^L@P(d?X)Ja#7d!u!J07v;?H!{`29wJabR*yob=>B`m)x#y zUw5!O%AH`Qw1Q+L%} zdz(+L!ICb*m3~zx)p2!L9Z-Aq4|+SZ`PO3{%fOz6_G7edhMj`$jX{2ckwzcY9WDoo zn3krosb^r2u!qvn6DgVC!9T+uVZbTxV=o?G<(T zw{}HcrCn1uU~V$z`!>NQ*`PJxkOPYgSLwi|EGoNt7(IFn4Ju%t#Lfz-VydJqgB?Dv zD#ICSs5-VD%(gN7wmB@fwQb8tUobD3mymIX-&%Y4-V0b-TkNeRn$|=&QuS3GzF$@O zm{`o`!}c*&DXUEn8@9~hHgY{@elds4UTkQSU1wH-!Si9@GvH(6kkKIYrUyLgCHigx z!>*>D*QGp!EubF98nWxmI-L$#W5kb%E75tIpap>Q{Tlo>phq!R9D*)a+tBQa}C2T2J6tc0P40?ut zwl!2uS}mIVt^xK`!|EzC>+NER^osad*QFDk7KBSKih!keh-UZL3P5(oi_J`;G`~Ee5{rN8QOKme);~923 zZJM15LcU|)roqF(N}q?n;UNxw1zdU^tQn$G{E9?Ewl_8|kx)nVifWJcwedAiHBfbR zE!LrmXr3;uilZ%s@E8T~$d4h594ad@OgdKD(TbH2ogpSu_+_-@1QEl}VEkUY%k#_| z@de_USF07s`g8l4U4T?RQnQfvWLy`o;cgFJk9@G-lD(G%BOc zrgJKZ#-3u95vsJRz|3o^dU(GU*kgOVZWq-PM2;g884A9Gy7c^xovvom=f`RRb6O1c zuEcMxWv;{-cC*^b?02dk)E=UzpFp!iXzEeW@C2H3%ARH%bCDM}MNkM7KRmRFcKLsKC_YN&U3-MYg z8Z9mCx8}c=Pvt6yZ^%Cj>IK1uM0&YT&$k)Vb;f#8ol|GjDWr-esQt`SxY$-DEB+PH zIF=x*4Q9{6LrsPAqk_@sx+`VS5PAcNhygLJsDbJ*tkX zQqWQ16F$t)RuPEYv-^{!EI?5yyk12=-nmH z>s`eIispHGr*5&zqG{r*<5~G6*5CEKpZ4@8jI~Hdz92JLAU-e`OzLs)!N>Ykxxyy# zUp0k4;s08IFfXv;9kD046U?c<8shU9Y=066HUpW?MxqPtA}d_-3lQ~dIN>G`b_ep? zgXH!jufv`t{leVwN#49Jg2|V~ewc;K1Ap#WlK6EzJMA)8Tx90wkjJmspXlvz?sFK~ zA7C|pRJ&n0JIHfvVcj->9qZIuEP55Oj*nXl$?|**mZ#>nrZDEW&}nj8;FRF&U=X4| zI1!`zGCzsNy4$YsRB}yl)tB-3l4)v3zNIu-EeI2cT~YVfBPrM^qZyPTf|ax!p-#yflH9){ zJ=LMlX2_vEbMMBe`q{yZbu8=fHWoP>=JP3$!)mfQ8|)UWZVxMa2unK2nx97pu7O>* z(Q03(gPuxs@EK_UNSe@^|ItY?U>_*)E8vbh>o^uML znu#vYWlmy6K1vAB6T3L}TmF}b&1-^GKmW<@QoWatCi2rq7aw5+UBn&*QEGcK7d#Ok zc9W4`tk3YyQS5&Yi29w!_!cpP z5@?;zP98^N1cmZ@j8ihJpCC!`%wHhM+93Q|ehWvF9CJy~zc5}vveo(UHIEYsK1M$G zUDiw%p6z!y-K23bVG4F8ko^1k1rKM())?{iB1+#jDmX1T9FF7bkXKYm~S zJW}tGDwW@VOW&!o7TF&5yoC4(@f4yBnZPvvkqLauM7*6vi6<8?euS2~2EP2oQ~m3> z|8=Y~-v9dHuZhgjUyIZ=`Th4_`%0B(>hBX)bV(k*oKxTbyWesz>F19!O&z1WCu{G& z78(EkkoSIl%4Af&Y-P78Ef$u>%MSfyh3AR45GLwBBZ9 zTXO#(2q7LN(epa;yO5IS3HDjfTRsV1<@1nBa#4?Y&+_q3LE2M1yqJgY zYtJ7Fe-Ihv0l^>QngBd}10G`yjBXvfHe0z;G8Gy4EFGGriJI=G#5LlxWJF1fS5{SK z;?GTH;=F`JmbDC8yMzqubCM5fm?cj)Y8CMdTb;aYk zSBV*u=tbm}h4Ex&lp$W$L?a{9r=sa ziVi36{3bYlk@v;c#W!EUqsKF+G|c)Tn&e6XX!tUi%xoCYd*nSnCK6nUKm3Na-pi9L z!!s|yd(Yvsxn%YvhF-#VmczKkbFRa4eg}u!4)c)=@{j1_K@h{&KOav-8;{^g_wl*x zQ1AHdA^Uqj;BR;F-ezKmm1JXP6NA1b?3S2gFHM+@#9ty&VH)SWxyahzVN4$~?zhQs zPvQ4GnAjGsER7eh%vwZXW0{fWMZWt3eePxy7tkM#428XlyfY|?e&=x?$#Tr}c8O<` zDW6T7m68vVY|wkKkJ(6KF}k^tyB$F0N9gMZZ1gK+vCL~LcqVMvxArH|>ul(vWlbcP zDlz#rM!>EJ-#y}aD|SX$!S9gb2FXXzw(yWRN}|wRJYPeUHOI?I`8(M8;X=hhxC-#c z5@1SxEJ!%eBiPcztZNQ0&dbHC?DU=kM0yrXspzr)QXU7BnaOO)M>C_9^u5DlJW@Zf z9S*z28-x6modJo5B^Exwcz;2guAo_h0+M4D%aZs~JgxZI4Ct@$FN+4=;z~b`6aFZ& z+Q)r<pp>O`CxMXeXZbvaJ`(|S7O+Quq$DTWC%gm+{}7} z7bO)#8qdHHYm@QsN_zoolZ;q(Sp7%HP1bQftFjGb6x}(67D*icvo{{eNPZ30e1YbC z!SAoo`^`vUA6K8iZZ4(FRZuILISVcb;w5^h=ttjvh9@Ok&ii+mx#V3gVRgT9mqXl5 zR#NnS8+YHxYNtlZyZJ<9>qpCyc}is@Vl!exr;xbM(IsZS;n}#1LeNTjmVO1HuOe&V z-QvB4c?usA9TSgmi03CgyE(`2!=5#Xg&xKpzd`m3vAU(63??GAK3>E&9l4F9T41Pc zPAu1)m}EH5`;rGP$r?nUf927_e5|=)t&_kNLH9&Y!*4Jqm)F7oe9tc4LY|ACm67|| zDao1L@#f%j^aQ>o4BgLbrAC^9>4N2Q2l-5pT|Aa#jDF8;h~E1xyN99V@@#$h$+37*yuP-3Ot#%Rd-&i8{ z-bA%+iP~y&FUd#MC)SnyH_1kIR*B5P#q^9HkP}Jy!o0cEUH2 z*IGb4JH^Z3jU+QWmfXkt$9j%S_e}6%>A!>-dgxxdM!~* zChenaYA#RW*QbzNNyb){m2AL#Wam?4(LSZgT&2nDm(fniM0N2pQQhdfE3f>uY2mF6 zdro9oizDIZkh|2woGn#!K3%CX9BzpMl^EN+M84${uA;0Y36&2J~T*?1L?C@ ziybw>@;kFnGl=}%o8FGYG%u4h3I8;L8n8a>>a{@!t6LuhBwz05KMEpULDDL$USo2H zl68HB6_NUZ7a3tQbhn1=1F}#4G~>^Mj~5RwemxslB~3W2cwOPf!cv7{$iA2OT#1c; z;n`W<@i94sk!Sb3=QFHjNzljNJFm$I>ZaIALuTZ+2J}xA8sn?rX}`}ka?-c-nZe`I zIY7yR+^am6)Ks-+r|MNCA-mpEwJ{96jz-5{V1CuO$8*f$5oVATE6NVyJi(fjz?SP` zwH?qH$$rIoYu*E0ZO6B2AfF<(09hXSmSnLX!8VI9qI%r5Cu=tW=I{wwILYFCgEwD; zW-R2rN$eEH(6`)0tXy)RWq4FjRmtr%Aa~muDa-zW*r4Fl%iOV*YQj!%HLfa!wmgTn zQ=7nAKfyzq|2z-+lmpodx4VaQkAu_S+2!mqO+}M@5AlMBc=eF1?3#*v1&Nv}!63$Jniov15<`if0!L*JS&3F@8SDT{3B=-SQJFuV-Z2*m2tpK1!2p{&uwm>3vPsZ?#&5bdtJFUBXrNFcVc8oky3|ZS)Yb#y?Qckk{5RJ;92(%=8=3bFE!O z<>hOpy?LIhjr;CFcda|eokX?9>s0VefTgcQPFGYq{j9Ewo({1SsePQoH6NJC*jNwU z(y8ba3}g%>Iv1QH&X3Ob&UXF1{!tyGuJsDCGAdN3Lw@4l6Vw%bT<_9rsnnc`v|?=+ z>Kt0SP27fV10IdsMpSv#gXukQi`vI+T6>ETed*3{x(xSh9{WL zO08gJcEXj9!>c8JKF{ytyxs+aUtf%b`stu5soTsFAdg~ z%fr5MpkfnntrNRRv5b8vyIQgnG=$Ojg-yHy(`m#t74R<9MNm;8)gu|G9}yjp-N0;E zw!d#9xht>g4BM9MmEf9WYr?P)<3&1>O%T88@55)}^V~W=o~sygmmS#}U|W6qOWl!` z9iP68YLv%4Kf#A?5@}$?N#roH(1ZW&Qs7=imQ1zf+7=M_6R*k6_hQ+ph0kmx#@|EqEBUDl<_bJh;@Df%c3t=Od&qG4 zHJen1eJ^#_%+ar!S!I`)g;bACHDk>{WZ%Ztq9QR5J|F?>_?bv$JxI0K>lgNfT-K9A z@N*?6yxs3(=>0B`eW~YlV%TM^NiHl0x_%AY+D)V*xfH5aS+g(j|UPq{+^uV4K)X5}1C4`j$f=<|goE3EpQG_B;hko!~LNckvgCki=%< z?i1YiF43Q#Jq+dh@qGI@DE$>Ra&J>>+LL|YdaPv$4`Hwt(5WbTQGvRsI@Fs>yY%wAWp9U;O4c^mjH@^-HK+UTNfn z231-h+}q&VSgcB_7$?x@Tt3}Q9orRSZ8qjp5|4=eQae`%q%MxWW+V%6#_q)KKT;Do zNzzA4BrK;kUW8?I!w!a`v(s3G&%xjCh->!|DV<{MSJf@54U>@uxlSs`q<;G$9$B!9 zFm0$oyhx?RF14PVp+6_ z9=l(UY`>8P>Pm)sJ)e9{{%|cm^-ET2HF4!iaBdk0vjiO$e&S&u7P63B=X}~c+Fbnf z$M|?@^Ld{PnE8}EFm>~085Xe0NG{N?Y1sw_{eUJMBmz9?#ZuS749VJuf;w4MF8IV# zSac~}k+VS!h-6+us=Zm+VeH{gR`0>{7BQ~%dK--F2>F|9unz?)Jf!kc+g%D=uj@8< z+q+%OtJEitA^LrvF)d>R65k%Or?Iwsu65IxY$mrUh&L!}sq#CFy8q41+Wa2s1uxoKz!i7 zb64M?mi8w2bJe}W+>HB;TG?ljP9x)F;c)2?Re*_>LK2M_(!`P^BmS4bt1 zSudUyzq8ZqwtLlnPG=pZ^7*uL7H)f4UsLdPkl;Qjlk5gvH)td!D``baTX{l-YodvF zsdePqE5QqiXOeyi9&r!2d)yuFCiAsfg8)= zd)AzAe>Qvc4!s!;v({Z1ToU}$oey81#c7b~a>hcx<-CFRkJckWg5j1k4ODy#afUd9 zox$LdG|r5BRZY@=Wcw;ktOI=ekgw2f5*^-w($ ze>f3)nnv~gEImhXNq-Kqi-xXo*SYJ>x9)fDCU=Y3YPYIwdb_iOm`mDDy;JQpJ6-?O z+IF*zyfF+4Kld%DMeVWR6nieqLAgcv*ac>;`%!RKaHc!MykjO)={1gXbi*C|0|@de zIKl}E6G?2?&a|>f&`Py=WnDp+A(D}ZvmgvVw`RA8)0dJ5lDL8WKXqMS*5{qm#A8SF zK~0rDcDvQ%t7O~kO0yKMxKPd2AL&`(?{qxn6ge5l8JV%7JDju`>JD)SxdYw)Za+6J z7~{r(Pkm|8DNUYp+9Bn{V?Q+j|1sEkEilX(p+~_QIC-fj>v!~YXJ%klU`}9u;8SO@ zvqFEN*Kt;Xx-UcB7ZLsm>QgTgE#HB?DH~=oxY^uX=5hB)PUsbP%ej@^T5bc*?6q@W zHeHZNoEbu9?G1MQW_Twm78%L@Y+!d~mm&srP6f^ft~qy{Bu59ros9Y+BJ_Nm8o?(K zb5tSc(m+eb{w4ftS6F~lTn$BQIV)qPa7u7y@`p)tlNSaT1($MW>I*#3deBZVX$SmZ zkGF$$fL#1xsr%GacoJow(ZA|*`n*0*PT(Tv9%=0Ha#Dd+pn0{MetqL*SoS4p=AwJi zz2IIj7tDG0ygX><+;c&i_x!wkCRI4@rR2-OE5WOrQM=*Za&Lof_f$O6N+!aT9g{Gf z*2xga9Fi^M;gClHd7ONKCqteI6mg1USLI-HqKIa4rd0p7#G<@55?|jf8a!zt4q$8`)8c$ZA z(@~X)aZ0#_+$Y^9+(%3{H-j5SfpC(07hiOVQw_hE!)8CR%lDiG-C)+4FX5s~s3csV zKK4$Kz03WjN__&nf;vfX&^tM1rK*0I-~97ooU0j*$COHS&H!O?QfJ9|IxK!F6?gC9 zzh>b{KPIAD$Vu4Gv6U6>DsmuS;Xl5G&24tK;Z4v5Bm2`*Ped(|@+)1>!ircmR-7tv zeO=$wxAbj&hm)}PIG-4=rT$xX64}KweshUyXgD#yB~#_#?Mvaw67fR`L_YW3d$ham z9ajGq?WTLf!5wW_OQsCl}3W_o&(L{@`v!a%=2zsBq zuxc*@5=%ayhw0*DCi$Xfoa(7hbW+1sC9W@T$`DIOm?EZ-dB!|x3Yfg+aah$OCMRb_ zi8Y8{($jC6Kv*Co;7~SXIUky=li)}3tl%Aeo17l8GSLbrkyz&o@T#-wSACio<|I+W z3G$NczY;?qCQdqNs6~T=`E`?f;B!CFb`i(19}J#sN0YV%w+6T1OE$yUHmQwT_WQo0 zZ3M0V*u3}TbG=D#ayDaSTZm7jZhbpU@2|D%d(}Sp+J2(KgXq9vyueX?jFavXiJub0 zf{C7G?B|tN35XV5p?!I*oK~r;1a~DegR{^Lsi&gh%050w>Hb zp~1(9!uGh^%|`cYaA=wPnLFS82z;9EzU@wQ-xLpJIG0DxRBE47ny@C$fDYHAoUwuN zfysesAu~fh3Rw`cIIudf-r3^pc7AqF!67-5&Kf^V&&6~_rylW8XB`t59++ZgCof4} ze|1;pqv4lNCx)iU{>ZP--Y*+oCrg`zF6aA&jm|yo`doK;x()Yto1>u@^xcd)B=fJi zZ#;FY`1OiOwbL|9c;R-(&>mqi*#_qt@$k6Z6GNs3-@7~O_MC+I?!q&l-To~1qCAV; z#Wz3C{P{zlW&AYf!t4v~%)R;16;4j3nR<8f#W%B#erUKm#P(0K7oE| zhh`j|_ATcfhbo}>Pj4)}y&9hLUBb5bT?u>d9!Ngq91Hs;a60sC`1!!agiALsUAuJk z(#?zJTtN1kj)xs~4!S?;@548zS?_!iSQ1K}D1p;j`gI%UbPH>rwpqqn>B@x_4u3o( zn+bK}jYRV7%m-H_%uAeZ#_B=3XP`r9GhI`cw?&fkC*@4ekmMvMCf!WB5Ip4`N!}j> z_w81YcVqCoWSYAvd28bLNqd6C>-LPkf^F)MjA6M$pA9J=RzK{eK(sT;naN)4R{jn_ zJlX%ks%{`EY*hH%G#kTDlb9(OQajK+WMaq)=b)1mcp{`$pr?M@S>v2gA)M`Q<_y56 zY%!M;GT$$Cx9#oMZq2#9>CV~vVM$LV)V?1TKl0v3cfY=WFyVSaSVEq}5{b1F+a>i# z8UzEMW*-29q$0YR+M%iXg#n30yWXyOw^TEt(vb>w6 zU&dzX3#AK5do*-;$f%H3fv22%VB8e*A}2Vn1y^%!vx*5Z+ws#4Yz7cyqHSa|B=1Tb zpHMeGJbqjJnE0CUf%r}FBNJ*Qgd}cDcq6f4QkJBHi610(Oe)05_6_b^rmcD!{QBOR z6^IGc4de?XJBOUr&a^4v2p9zHtk&Cn@<_xNiPpCh9!&OR*Z1|=C;IZ;{0trvVL*f)7}(#+(g$(w_RgV$UK zJS`03wldw_*MgISbAzjc+k%H+H1Q^sos_&}z{(LXH`J|&L!xv~r>~A9N`XH*L*bCb zLVAD`>qG~7I8jaqr>)b}sY}#QRu^Tb>`|S?J0o}##&t~ZV_#uCasOv_j(L}Tld1Dc7@j>(f>yerT$v|~rH=wKT<;2p%=)k1F%)o-c%D_fvFRbxaAP|x>P$*C} z&^pj7Fxr`=zfeEI%DxS8jZ@R8$)MTX*eV^l9rsI+J2qcPd8N@S-C+5DW3&SJx@!P8#F_aB3q?IK^h zp4{nD@*cvu-s6r_y!r$=W$2x3hVO7LPckp^S5b)E7AiRn>{k*V0)4NN83+(f%F4zl8hjgbiI_U)13qkJ)Ez zNf>B7xMv5lf3LDLzz&_{D#$m^C+D)1XlOP0n{{~gZ($@Ujcg_Hl38oKvzq+1f`#N! zK7^CJLmqOhcVafyAQPBK8%9tEUSEz=sLzn^e1xnF%mEg4huH6&J&u?95f3S~UPy*4 zXzHCN5=D$Awgz*Nu>94T?ywQ5Sa}((lsXY#bK1a9sC(f=P&?WS8NWyp6i{9OKW!#p*YJISet_u#Bk?G!W7j5p)p^CQSx4>kkL z%S{`#MHH%Hm4SUDJN1l;%iA%kYxh2t^56J+L;k$oJ6FozrgWo-Mty5Ub?aVta7G zdREF`O+Lumwo%i(HKJpp@|G%EqG*XCog&JV%v-u-(UPT$mn~VkaNZIT5#@?Slr2`G zM3Lg5f;G@^_1i>sz5%u>k`H6dh2qXmm{1 zV#UjsFJCO8gxrKHio_1;6BjwKNT1jOatr?+HKSrX#dPl**FCyVUb$yv$LM}>mGbB3 z^Sr5Z>D~9YoA-$=>dmWYr|90r21fQRR=j9LvAi|G_qtAA9VxB`FdG&Zhz)b9fL2e;tzKiz=EtN9;|y0<^cnuGd8 z_U_)PQB>#dtmYrYGa$16e=vH!$%ns-h+Znxh>41fi;ig-9o;Kc6Iw*~>(jYobaY&| zyfs>s&if3SQ8T(zlfJPnqk8v^j*0A5L6o5=|4Wp4*6aDV8%5QOjEkz2zeGgwGDRZF z7b#J^Wr>npU7>jSLJ{RFL`3{{bt808{uI{VUSG08$$z;%x^wp~gZ|;wjT%*`*C#eE zvQMX|dNnKMXLLoockf)Gc(t-MYSgG+KB8=ih%)7h7q4EsbV**;E*DX)c!?U-%cc&F zuQT6%y;;@NuXq0UzTPCJJGL6x>u+yU?jMYTWvb9PGOm07sG8loM#Z9zHS4u#TDV@d z<}C}?tI$Rxe^7)A3HA>W~RkmE|TBS;q ztx>#m@iNt`mo8VTdg54tGoA6 z-n^b=REX>(##t$UY-Ina&c5QMe$@T%r2bFlOV9qz2Xu?#)_>8Tzv#nn7sp0-i5n0Z z6IHD%OZ9)Ry}#YBQ@6-IU88{3V$T;7kQ4>YU+lk86y^WH(*HJ^|0Sa66x}Bd@&32U z;hz}d|28?K3ZP;!aZ9NtQnA>-8c~W})r^Y4emmEWiSF&$kLMIB{H=-nBfapy-} z=^vSx|NZFy7ijWrLFQMpQH7Q<@RHa+z()1Ru77JQ{^fCUdE?05xQ813qMAl`?-Q4| zQDjWdsF>JP5c$J};$SP~uidb9>a~Bqrb`SrYVP@(E+tBr!rer8|Ngv4sRQyB=}#l} z7x52VgMs_+!C|0J#eU;YDKkPF|0n;Y0PO!{7kTqO=;Ys$?*nl?5ZAvYfq(1b2io;O zT>q8?{;iAu|J1H@zb8AQ`ar`6kjkhLQ!b_@`=sCA*eTnkEh%mN$N&7q#(x;jDv7D2 z?oe*ouwILn@9?`` - effects/steps/GRSS.*.ogg diff --git a/src/net/torvald/terrarum/audio/AudioMixer.kt b/src/net/torvald/terrarum/audio/AudioMixer.kt index c6e81ffe7..dea33b679 100644 --- a/src/net/torvald/terrarum/audio/AudioMixer.kt +++ b/src/net/torvald/terrarum/audio/AudioMixer.kt @@ -7,7 +7,6 @@ import com.badlogic.gdx.utils.Disposable import com.jme3.math.FastMath import net.torvald.spriteanimation.AssembledSpriteAnimation import net.torvald.terrarum.* -import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.audio.TerrarumAudioMixerTrack.Companion.SAMPLING_RATE import net.torvald.terrarum.audio.TerrarumAudioMixerTrack.Companion.SAMPLING_RATED import net.torvald.terrarum.audio.dsp.* @@ -56,18 +55,20 @@ class AudioMixer(val bufferSize: Int): Disposable { val dynamicSourceCount: Int get() = App.getConfigInt("audio_dynamic_source_max") - val tracks = Array(10) { TerrarumAudioMixerTrack( + val tracks = Array(12) { TerrarumAudioMixerTrack( if (it == 0) "Music" else if (it == 1) "Amb1" else if (it == 2) "Amb2" - else if (it == 3) "GUI" - else if (it == 4) "\u00E4AMB" - else if (it == 5) "\u00E4SFX" - else if (it == 6) "\u00F0 \u00E4 \u00F0" // summation - else if (it == 7) "\u00D9Open\u00D9" // convolution1 - else if (it == 8) "\u00D9Cave\u00D9" // convolution2 - else if (it == 9) "\u00F0 \u00DA \u00F0" // fade - else "Trk${it+1}", trackType = if (it >= 3) TrackType.BUS else TrackType.STATIC_SOURCE, maxVolumeFun = { + else if (it == 3) "AMB1+2" + else if (it == 4) "Amb3" + else if (it == 5) "Amb4" + else if (it == 6) "GUI" + else if (it == 7) "\u00E4SFX" + else if (it == 8) "\u00F0 \u00E4 \u00F0" // summation + else if (it == 9) "\u00D9Open\u00D9" // convolution1 + else if (it == 10) "\u00D9Cave\u00D9" // convolution2 + else if (it == 11) "\u00F0 \u00DA \u00F0" // fade + else "Trk${it+1}", trackType = if (it >= 7 || it == 3) TrackType.BUS else TrackType.STATIC_SOURCE, maxVolumeFun = { when (it) { 0 -> { musicVolume } 4 -> { ambientVolume } @@ -91,21 +92,30 @@ class AudioMixer(val bufferSize: Int): Disposable { get() = tracks[1] val ambientTrack2: TerrarumAudioMixerTrack get() = tracks[2] - val guiTrack: TerrarumAudioMixerTrack + val amb1plus2: TerrarumAudioMixerTrack get() = tracks[3] - - val ambSumBus: TerrarumAudioMixerTrack + val ambientTrack3: TerrarumAudioMixerTrack get() = tracks[4] - val sfxSumBus: TerrarumAudioMixerTrack + val ambientTrack4: TerrarumAudioMixerTrack get() = tracks[5] - val sumBus: TerrarumAudioMixerTrack + + val guiTrack: TerrarumAudioMixerTrack get() = tracks[6] - val convolveBusOpen: TerrarumAudioMixerTrack + + val sfxSumBus: TerrarumAudioMixerTrack get() = tracks[7] - val convolveBusCave: TerrarumAudioMixerTrack + val sumBus: TerrarumAudioMixerTrack get() = tracks[8] - val fadeBus: TerrarumAudioMixerTrack + val convolveBusOpen: TerrarumAudioMixerTrack get() = tracks[9] + val convolveBusCave: TerrarumAudioMixerTrack + get() = tracks[10] + val fadeBus: TerrarumAudioMixerTrack + get() = tracks[11] + + val ambientTracks = arrayOf( + ambientTrack1, ambientTrack2 + ) var processing = false @@ -215,20 +225,19 @@ class AudioMixer(val bufferSize: Int): Disposable { musicTrack.filters[1] = Vecto() musicTrack.filters[2] = Spectro() - ambientTrack1.filters[1] = Vecto(decibelsToFullscale(24.0).toFloat()) - ambientTrack1.filters[2] = Spectro() - ambientTrack2.filters[1] = Vecto(decibelsToFullscale(24.0).toFloat()) - ambientTrack2.filters[2] = Spectro() + ambientTracks.forEach { + it.filters[1] = Vecto(decibelsToFullscale(24.0).toFloat()) + it.filters[2] = Spectro() + amb1plus2.addSidechainInput(it, 1.0) + } sfxSumBus.filters[1] = Vecto(0.7071f) sfxSumBus.filters[2] = Spectro() - ambSumBus.addSidechainInput(ambientTrack1, 1.0) - ambSumBus.addSidechainInput(ambientTrack2, 1.0) - ambSumBus.filters[1] = Gain(1f) // controlled by the "openness" controller - listOf(sumBus, convolveBusOpen, convolveBusCave).forEach { it.addSidechainInput(musicTrack, 1.0) - it.addSidechainInput(ambSumBus, 1.0) + it.addSidechainInput(amb1plus2, 1.0) + it.addSidechainInput(ambientTrack3, 1.0) + it.addSidechainInput(ambientTrack4, 1.0) it.addSidechainInput(sfxSumBus, 1.0) } @@ -282,7 +291,7 @@ class AudioMixer(val bufferSize: Int): Disposable { ) private val fadeReqs = HashMap().also { map -> - listOf(musicTrack, ambientTrack1, ambientTrack2, guiTrack, ambSumBus, fadeBus).forEach { + listOf(musicTrack, ambientTrack1, ambientTrack2, guiTrack, amb1plus2, fadeBus).forEach { map[it] = FadeRequest() } } @@ -349,8 +358,9 @@ class AudioMixer(val bufferSize: Int): Disposable { (Gdx.audio as? Lwjgl3Audio)?.update() masterTrack.volume = masterVolume musicTrack.getFilter().gain = musicVolume.toFloat() * 0.5f - ambientTrack1.getFilter().gain = ambientVolume.toFloat() * 2 - ambientTrack2.getFilter().gain = ambientVolume.toFloat() * 2 + ambientTracks.forEach { + it.getFilter().gain = ambientVolume.toFloat() + } sfxSumBus.volume = sfxVolume guiTrack.volume = guiVolume @@ -371,15 +381,12 @@ class AudioMixer(val bufferSize: Int): Disposable { musicTrack.stop() musicTrack.currentTrack = null } - if (req.fadeTarget == 0.0 && (track == ambientTrack1 || track == fadeBus)) { - ambientTrack1.stop() - ambientTrack1.currentTrack = null - } - if (req.fadeTarget == 0.0 && (track == ambientTrack2 || track == fadeBus)) { - ambientTrack2.stop() - ambientTrack2.currentTrack = null - } - + /*ambientTracks.forEach { + if (req.fadeTarget == 0.0 && (track == it || track == fadeBus)) { + it.stop() + it.currentTrack = null + } + }*/ req.callback() } } @@ -427,14 +434,15 @@ class AudioMixer(val bufferSize: Int): Disposable { musicTrack.play() } - if (!ambientTrack1.isPlaying && ambientTrack1.nextTrack != null) { - ambientTrack1.queueNext(null) - if (ambientStopped) { - requestFadeIn(ambientTrack1, DEFAULT_FADEOUT_LEN * 4, 1.0, 0.00001) + ambientTracks.forEach { + if (!it.isPlaying && it.nextTrack != null) { + it.queueNext(null) + if (ambientStopped) { + requestFadeIn(it, DEFAULT_FADEOUT_LEN * 4, 1.0, 0.00001) + } + it.play() + ambientStopped = false } - ambientTrack1.volume = 1.0 - ambientTrack1.play() - ambientStopped = false } } @@ -468,6 +476,22 @@ class AudioMixer(val bufferSize: Int): Disposable { // fade will be processed by the update() } + fun startAmb1(song: MusicContainer) { + if (ambientTrack1.isPlaying == true) { + requestFadeOut(musicTrack, DEFAULT_FADEOUT_LEN) + } + ambientTrack1.nextTrack = song + // fade will be processed by the update() + } + + fun startAmb2(song: MusicContainer) { + if (ambientTrack2.isPlaying == true) { + requestFadeOut(musicTrack, DEFAULT_FADEOUT_LEN) + } + ambientTrack2.nextTrack = song + // fade will be processed by the update() + } + fun requestFadeOut(track: TerrarumAudioMixerTrack, length: Double = DEFAULT_FADEOUT_LEN, target: Double = 0.0, source: Double? = null, jobAfterFadeout: () -> Unit = {}) { val req = fadeReqs[track]!! if (!req.fadeoutFired) { @@ -481,8 +505,8 @@ class AudioMixer(val bufferSize: Int): Disposable { } fun requestFadeIn(track: TerrarumAudioMixerTrack, length: Double, target: Double = 1.0, source: Double? = null, jobAfterFadeout: () -> Unit = {}) { - printdbg(this, "fadein called by") - printStackTrace(this) +// printdbg(this, "fadein called by") +// printStackTrace(this) val req = fadeReqs[track]!! if (!req.fadeinFired) { diff --git a/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt b/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt index a9185f715..362ae1845 100644 --- a/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt +++ b/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt @@ -74,19 +74,29 @@ class MixerTrackProcessor(bufferSize: Int, val rate: Int, val track: TerrarumAud track.currentTrack?.reset() track.pullNextTrack() - val tmpBuf = ByteArray(buffer.size - bytesRead) - val newRead = track.currentTrack?.gdxMusic?.forceInvoke("read", arrayOf(tmpBuf)) ?: 0 + bytesRead += read0(buffer, bytesRead) + } + // if isLooping=true, do gapless sampleRead but reads from itself + else if (track.currentTrack?.gdxMusic?.isLooping == true && bytesRead < buffer.size) { + track.currentTrack?.reset() - track.currentTrack?.let { it.samplesRead += newRead / 4 } - System.arraycopy(tmpBuf, 0, buffer, bytesRead, tmpBuf.size) - - bytesRead += newRead + bytesRead += read0(buffer, bytesRead) } bytesRead }, { purgeStreamBuf() }) } + private fun read0(buffer: ByteArray, bytesRead: Int): Int { + val tmpBuf = ByteArray(buffer.size - bytesRead) + val newRead = track.currentTrack?.gdxMusic?.forceInvoke("read", arrayOf(tmpBuf)) ?: 0 + + track.currentTrack?.let { it.samplesRead += newRead / 4 } + System.arraycopy(tmpBuf, 0, buffer, bytesRead, tmpBuf.size) + + return newRead + } + override fun run() { // while (running) { // uncomment to multithread /*synchronized(pauseLock) { // uncomment to multithread diff --git a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt index fb5ed2b74..9ba0bdcfd 100644 --- a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt +++ b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt @@ -12,7 +12,6 @@ import net.torvald.terrarum.Terrarum.getPlayerSaveFiledesc import net.torvald.terrarum.Terrarum.getWorldSaveFiledesc import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZED -import net.torvald.terrarum.audio.dsp.Gain import net.torvald.terrarum.blockproperties.BlockPropUtil import net.torvald.terrarum.blockstats.MinimapComposer import net.torvald.terrarum.blockstats.TileSurvey @@ -914,7 +913,7 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) { App.audioMixer.convolveBusCave.volume = 0.0 } val openness = (TileSurvey.getRatio("basegame.Ingame.openness") ?: 0.0).times(1.74).coerceIn(0.0, 1.0) - (App.audioMixer.ambSumBus.filters[1] as Gain).gain = openness.pow(2.0 / 3.0).toFloat() + App.audioMixer.amb1plus2.volume = openness.pow(2.0 / 3.0) diff --git a/src/net/torvald/terrarum/modulebasegame/TerrarumMusicGovernor.kt b/src/net/torvald/terrarum/modulebasegame/TerrarumMusicGovernor.kt index de5eaec1d..75c983bc6 100644 --- a/src/net/torvald/terrarum/modulebasegame/TerrarumMusicGovernor.kt +++ b/src/net/torvald/terrarum/modulebasegame/TerrarumMusicGovernor.kt @@ -9,14 +9,15 @@ import com.badlogic.gdx.backends.lwjgl3.audio.Wav import com.badlogic.gdx.backends.lwjgl3.audio.Wav.WavInputStream import com.badlogic.gdx.utils.GdxRuntimeException import com.jcraft.jorbis.VorbisFile +import com.jme3.math.FastMath import javazoom.jl.decoder.Bitstream import net.torvald.reflection.extortField import net.torvald.reflection.forceInvoke import net.torvald.terrarum.* import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.audio.AudioMixer -import net.torvald.terrarum.audio.TerrarumAudioMixerTrack import net.torvald.terrarum.audio.TerrarumAudioMixerTrack.Companion.SAMPLING_RATE +import net.torvald.terrarum.gameworld.WorldTime.Companion.DAY_LENGTH import java.io.File import java.io.FileInputStream import javax.sound.sampled.AudioSystem @@ -278,7 +279,7 @@ class TerrarumMusicGovernor : MusicGovernor() { Gdx.audio.newMusic(fileHandle).also { it.isLooping = true } - ) { stopAmbient() } + ) { } } catch (e: GdxRuntimeException) { e.printStackTrace() @@ -373,15 +374,34 @@ class TerrarumMusicGovernor : MusicGovernor() { // App.audioMixer.ambientTrack.nextTrack = currentAmbientTrack } - private fun startAmbient(song: MusicContainer) { - currentAmbientTrack = song - App.audioMixer.startAmb(song) - printdbg(this, "startAmbient Now playing: $song") -// INGAME.sendNotification("Now Playing $EMDASH ${song.name}") + private fun startAmbient1(song: MusicContainer) { + App.audioMixer.startAmb1(song) + printdbg(this, "startAmbient1 Now playing: $song") + ambState = STATE_PLAYING + } + private fun startAmbient2(song: MusicContainer) { + App.audioMixer.startAmb2(song) + printdbg(this, "startAmbient2 Now playing: $song") + ambState = STATE_PLAYING + } + + private fun queueAmbientForce1(song: MusicContainer) { + App.audioMixer.ambientTrack1.let { + it.nextTrack = song + it.stop() + } + printdbg(this, "startAmbient1 Now playing: $song") + ambState = STATE_PLAYING + } + private fun queueAmbientForce2(song: MusicContainer) { + App.audioMixer.ambientTrack2.let { + it.nextTrack = song + it.stop() + } + printdbg(this, "startAmbient2 Now playing: $song") ambState = STATE_PLAYING } - private lateinit var currentAmbientTrack: MusicContainer override fun update(ingame: IngameInstance, delta: Float) { // start the song queueing if there is one to play @@ -409,36 +429,112 @@ class TerrarumMusicGovernor : MusicGovernor() { } } + val season = ingame.world.worldTime.ecologicalSeason + val isAM = (ingame.world.worldTime.todaySeconds < DAY_LENGTH / 2) // 0 until DAY_LENGTH (86400) + val solarElevDeg = ingame.world.worldTime.solarElevationDeg + val isSunUp = (solarElevDeg >= 0) + val seasonName = when (season) { + in 0f..2f -> "autumn" + in 2f..3f -> "summer" + in 3f..5f -> "autumn" + else -> "winter" + } + when (ambState) { STATE_FIREPLAY -> { if (!ambFired) { ambFired = true - val season = ingame.world.worldTime.ecologicalSeason - val time = ingame.world.worldTime.todaySeconds // 0 until DAY_LENGTH (86400) - val seasonName = when (season) { - in 0f..2f -> "autumn" - in 2f..3f -> "summer" - in 3f..5f -> "autumn" - else -> "winter" - } - val timeMode = "diurnal" + // ambient track 1: diurnal/nocturnal + // ambient track 2: crepuscular/matutinal + val track1 = if (isSunUp) + ambients["ambient.season.diurnal_$seasonName"]!!.random() // mad respect to Klankbeeld + else + ambients["ambient.season.nocturnal"]!!.random() // as it turns out ambient recordings of a wild place AT NIGHT is quite rare - val track = ambients["ambient.season.${timeMode}_$seasonName"]!!.random() - startAmbient(track) + val track2 = if (isAM) + ambients["ambient.season.matutinal"]!!.random() + else + ambients["ambient.season.crepuscular"]!!.random() + + startAmbient1(track1) + startAmbient2(track2) } } STATE_PLAYING -> { - // stopMusic() will be called when the music finishes; it's on the setOnCompletionListener + // mix ambient tracks + + // queue up nocturnal + if (!isSunUp && oldWorldSolarElev >= 0) + queueAmbientForce1(ambients["ambient.season.nocturnal"]!!.random()) // as it turns out ambient recordings of a wild place AT NIGHT is quite rare + // queue up diurnal + else if (isSunUp && oldWorldSolarElev < 0) + queueAmbientForce1(ambients["ambient.season.diurnal_$seasonName"]!!.random()) // mad respect to Klankbeeld + + // queue up crepuscular + if (!isAM && oldWorldTime < DAY_LENGTH / 2) + queueAmbientForce2(ambients["ambient.season.crepuscular"]!!.random()) + else if (isAM && oldWorldTime >= DAY_LENGTH / 2) + queueAmbientForce2(ambients["ambient.season.matutinal"]!!.random()) + + // play around the fader + val track2vol = if (isAM) + when (solarElevDeg) { + in TRACK2_DAWN_ELEV_UP_MIN..TRACK2_DAWN_ELEV_UP_MAX -> + FastMath.interpolateLinear( + (solarElevDeg - TRACK2_DAWN_ELEV_UP_MIN) / (TRACK2_DAWN_ELEV_UP_MAX - TRACK2_DAWN_ELEV_UP_MIN), + 1.0, 0.0 + ) + in TRACK2_DAWN_ELEV_DN_MAX..TRACK2_DAWN_ELEV_DN_MIN -> + FastMath.interpolateLinear( + (solarElevDeg - TRACK2_DAWN_ELEV_DN_MIN) / (TRACK2_DAWN_ELEV_DN_MAX - TRACK2_DAWN_ELEV_DN_MIN), + 1.0, 0.0 + ) + in TRACK2_DAWN_ELEV_DN_MIN..TRACK2_DAWN_ELEV_UP_MIN -> 1.0 + else -> 0.0 + } + else + when (solarElevDeg) { + in TRACK2_DUSK_ELEV_UP_MIN..TRACK2_DUSK_ELEV_UP_MAX -> + FastMath.interpolateLinear( + (solarElevDeg - TRACK2_DUSK_ELEV_UP_MIN) / (TRACK2_DUSK_ELEV_UP_MAX - TRACK2_DUSK_ELEV_UP_MIN), + 1.0, 0.0 + ) + in TRACK2_DUSK_ELEV_DN_MAX..TRACK2_DUSK_ELEV_DN_MIN -> + FastMath.interpolateLinear( + (solarElevDeg - TRACK2_DUSK_ELEV_DN_MIN) / (TRACK2_DUSK_ELEV_DN_MAX - TRACK2_DUSK_ELEV_DN_MIN), + 1.0, 0.0 + ) + in TRACK2_DUSK_ELEV_DN_MIN..TRACK2_DUSK_ELEV_UP_MIN -> 1.0 + else -> 0.0 + } + val track1vol = 1.0 - track2vol + + App.audioMixer.ambientTrack1.volume = track1vol + App.audioMixer.ambientTrack2.volume = track2vol } STATE_INTERMISSION -> { ambState = STATE_FIREPLAY } } - + oldWorldSolarElev = solarElevDeg + oldWorldTime = ingame.world.worldTime.todaySeconds } + private var oldWorldSolarElev = Terrarum.ingame?.world?.worldTime?.solarElevationDeg ?: 0.0 + private var oldWorldTime = Terrarum.ingame?.world?.worldTime?.todaySeconds ?: 0 + + private val TRACK2_DUSK_ELEV_UP_MAX = 15.0 + private val TRACK2_DUSK_ELEV_UP_MIN = 0.1 + private val TRACK2_DUSK_ELEV_DN_MIN = -0.1 + private val TRACK2_DUSK_ELEV_DN_MAX = -15.0 + + private val TRACK2_DAWN_ELEV_UP_MAX = 20.0 + private val TRACK2_DAWN_ELEV_UP_MIN = 5.0 + private val TRACK2_DAWN_ELEV_DN_MIN = 5.0 + private val TRACK2_DAWN_ELEV_DN_MAX = -10.0 + override fun dispose() { App.audioMixer.requestFadeOut(App.audioMixer.fadeBus, AudioMixer.DEFAULT_FADEOUT_LEN) // explicit call for fade-out when the game instance quits stopMusic(App.audioMixer.musicTrack.currentTrack) diff --git a/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt b/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt index f8b6e8425..95abe5726 100644 --- a/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt +++ b/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt @@ -266,7 +266,7 @@ class TitleScreen(batch: FlippingSpriteBatch) : IngameInstance(batch) { App.bogoflops = maxOf(App.bogoflops, bogoflops) - listOf(App.audioMixer.ambientTrack1, App.audioMixer.ambientTrack2).forEach { + App.audioMixer.ambientTracks.forEach { it.stop() it.currentTrack = null it.nextTrack = null