static effect looops

This commit is contained in:
minjaesong
2024-01-24 17:51:00 +09:00
parent 89b372e4d8
commit 2016be562b
9 changed files with 32 additions and 16 deletions

Binary file not shown.

Binary file not shown.

View File

@@ -32,6 +32,9 @@ class AudioMixer(val bufferSize: Int): Disposable {
const val SPEED_OF_SOUND = 340f const val SPEED_OF_SOUND = 340f
const val DEFAULT_FADEOUT_LEN = 1.8 const val DEFAULT_FADEOUT_LEN = 1.8
internal const val DS_FLTIDX_PAN = 2
internal const val DS_FLTIDX_LOW = 3
} }
@@ -229,11 +232,11 @@ class AudioMixer(val bufferSize: Int): Disposable {
it.addSidechainInput(sfxSumBus, 1.0) it.addSidechainInput(sfxSumBus, 1.0)
} }
convolveBusOpen.filters[1] = Convolv(ModMgr.getFile("basegame", "audio/convolution/EchoThief - PurgatoryChasm.bin"), decibelsToFullscale(-6.0).toFloat()) convolveBusOpen.filters[1] = Convolv("basegame", "audio/convolution/EchoThief - PurgatoryChasm.bin", decibelsToFullscale(-6.0).toFloat())
convolveBusOpen.filters[2] = Gain(decibelsToFullscale(17.0).toFloat()) // don't make it too loud; it'll sound like a shit convolveBusOpen.filters[2] = Gain(decibelsToFullscale(17.0).toFloat()) // don't make it too loud; it'll sound like a shit
convolveBusOpen.volume = 0.5 // will be controlled by the other updater which surveys the world convolveBusOpen.volume = 0.5 // will be controlled by the other updater which surveys the world
convolveBusCave.filters[1] = Convolv(ModMgr.getFile("basegame", "audio/convolution/EchoThief - WaterplacePark-trimmed.bin"), decibelsToFullscale(-3.0).toFloat()) convolveBusCave.filters[1] = Convolv("basegame", "audio/convolution/EchoThief - WaterplacePark-trimmed.bin", decibelsToFullscale(-3.0).toFloat())
convolveBusCave.filters[2] = Gain(decibelsToFullscale(16.0).toFloat()) convolveBusCave.filters[2] = Gain(decibelsToFullscale(16.0).toFloat())
convolveBusCave.volume = 0.5 // will be controlled by the other updater which surveys the world convolveBusCave.volume = 0.5 // will be controlled by the other updater which surveys the world
@@ -247,8 +250,8 @@ class AudioMixer(val bufferSize: Int): Disposable {
dynamicTracks.forEach { dynamicTracks.forEach {
it.filters[0] = BinoPan(0f) it.filters[DS_FLTIDX_PAN] = BinoPan(0f)
it.filters[1] = Lowpass(SAMPLING_RATE / 2f) it.filters[DS_FLTIDX_LOW] = Lowpass(SAMPLING_RATE / 2f)
sfxSumBus.addSidechainInput(it, 1.0) sfxSumBus.addSidechainInput(it, 1.0)
} }

View File

@@ -3,6 +3,8 @@ package net.torvald.terrarum.audio
import com.badlogic.gdx.utils.Queue import com.badlogic.gdx.utils.Queue
import net.torvald.reflection.forceInvoke import net.torvald.reflection.forceInvoke
import net.torvald.terrarum.* import net.torvald.terrarum.*
import net.torvald.terrarum.audio.AudioMixer.Companion.DS_FLTIDX_LOW
import net.torvald.terrarum.audio.AudioMixer.Companion.DS_FLTIDX_PAN
import net.torvald.terrarum.audio.AudioMixer.Companion.SPEED_OF_SOUND_AIR import net.torvald.terrarum.audio.AudioMixer.Companion.SPEED_OF_SOUND_AIR
import net.torvald.terrarum.audio.TerrarumAudioMixerTrack.Companion.SAMPLING_RATE import net.torvald.terrarum.audio.TerrarumAudioMixerTrack.Companion.SAMPLING_RATE
import net.torvald.terrarum.audio.TerrarumAudioMixerTrack.Companion.SAMPLING_RATED import net.torvald.terrarum.audio.TerrarumAudioMixerTrack.Companion.SAMPLING_RATED
@@ -117,22 +119,22 @@ class MixerTrackProcessor(bufferSize: Int, val rate: Int, val track: TerrarumAud
// update panning and shits // update panning and shits
if (track.trackType == TrackType.DYNAMIC_SOURCE && track.isPlaying) { if (track.trackType == TrackType.DYNAMIC_SOURCE && track.isPlaying) {
(track.filters[0] as BinoPan).earDist = App.audioMixer.listenerHeadSize (track.filters[DS_FLTIDX_PAN] as BinoPan).earDist = App.audioMixer.listenerHeadSize
if (App.audioMixer.actorNowPlaying != null) { if (App.audioMixer.actorNowPlaying != null) {
if (track.trackingTarget == null || track.trackingTarget == App.audioMixer.actorNowPlaying) { if (track.trackingTarget == null || track.trackingTarget == App.audioMixer.actorNowPlaying) {
// "reset" the track // "reset" the track
track.volume = track.maxVolume track.volume = track.maxVolume
(track.filters[0] as BinoPan).pan = 0f (track.filters[DS_FLTIDX_PAN] as BinoPan).pan = 0f
(track.filters[1] as Lowpass).setCutoff(SAMPLING_RATE / 2f) (track.filters[DS_FLTIDX_LOW] as Lowpass).setCutoff(SAMPLING_RATE / 2f)
} }
else if (track.trackingTarget is ActorWithBody) { else if (track.trackingTarget is ActorWithBody) {
val relativeXpos = relativeXposition(App.audioMixer.actorNowPlaying!!, track.trackingTarget as ActorWithBody) val relativeXpos = relativeXposition(App.audioMixer.actorNowPlaying!!, track.trackingTarget as ActorWithBody)
val distFromActor = distBetweenActors(App.audioMixer.actorNowPlaying!!, track.trackingTarget as ActorWithBody) val distFromActor = distBetweenActors(App.audioMixer.actorNowPlaying!!, track.trackingTarget as ActorWithBody)
val vol = track.maxVolume * getVolFun(distFromActor / distFalloff).coerceAtLeast(0.0) val vol = track.maxVolume * getVolFun(distFromActor / distFalloff).coerceAtLeast(0.0)
track.volume = vol track.volume = vol
(track.filters[0] as BinoPan).pan = (1.3f * relativeXpos / distFalloff).toFloat() (track.filters[DS_FLTIDX_PAN] as BinoPan).pan = (1.3f * relativeXpos / distFalloff).toFloat()
(track.filters[1] as Lowpass).setCutoff( (track.filters[DS_FLTIDX_LOW] as Lowpass).setCutoff(
(SAMPLING_RATED*0.5) / (24.0 * (distFromActor / distFalloff).sqr() + 1.0) (SAMPLING_RATED*0.5) / (24.0 * (distFromActor / distFalloff).sqr() + 1.0)
) )
@@ -155,8 +157,8 @@ class MixerTrackProcessor(bufferSize: Int, val rate: Int, val track: TerrarumAud
else { else {
// "reset" the track // "reset" the track
track.volume = track.maxVolume track.volume = track.maxVolume
(track.filters[0] as BinoPan).pan = 0f (track.filters[DS_FLTIDX_PAN] as BinoPan).pan = 0f
(track.filters[1] as Lowpass).setCutoff(SAMPLING_RATE / 2f) (track.filters[DS_FLTIDX_LOW] as Lowpass).setCutoff(SAMPLING_RATE / 2f)
} }
} }

View File

@@ -6,6 +6,7 @@ import net.torvald.reflection.forceInvoke
import net.torvald.terrarum.App import net.torvald.terrarum.App
import net.torvald.terrarum.audio.AudioHelper import net.torvald.terrarum.audio.AudioHelper
import net.torvald.terrarum.audio.AudioProcessBuf.Companion.MP3_CHUNK_SIZE import net.torvald.terrarum.audio.AudioProcessBuf.Companion.MP3_CHUNK_SIZE
import net.torvald.terrarum.audio.decibelsToFullscale
import net.torvald.terrarum.serialise.toUint import net.torvald.terrarum.serialise.toUint
import java.io.File import java.io.File
import kotlin.math.absoluteValue import kotlin.math.absoluteValue
@@ -43,8 +44,8 @@ open class LoFi(
private fun staticMixThru(inbuf: List<FloatArray>, outbuf: List<FloatArray>) { private fun staticMixThru(inbuf: List<FloatArray>, outbuf: List<FloatArray>) {
for (h in 0 until App.audioBufferSize) { for (h in 0 until App.audioBufferSize) {
outbuf[0][h] = inbuf[0][h] + staticSample[0][staticSamplePlayCursor] outbuf[0][h] = inbuf[0][h] + staticSample[0][staticSamplePlayCursor] * 2.512f // +8 dB
outbuf[1][h] = inbuf[1][h] + staticSample[1][staticSamplePlayCursor] outbuf[1][h] = inbuf[1][h] + staticSample[1][staticSamplePlayCursor] * 2.512f // +8 dB
staticSamplePlayCursor = (staticSamplePlayCursor + 1) % staticSample[0].size staticSamplePlayCursor = (staticSamplePlayCursor + 1) % staticSample[0].size
} }
} }

View File

@@ -30,6 +30,6 @@ class Tape(irModule: String, irPath: String, crossfeed: Float, gain: Float) : Lo
* Created by minjaesong on 2024-01-24. * Created by minjaesong on 2024-01-24.
*/ */
class Holo(irModule: String, irPath: String, crossfeed: Float, gain: Float) : LoFi( class Holo(irModule: String, irPath: String, crossfeed: Float, gain: Float) : LoFi(
"basegame", "audio/effects/static/film_pops.ogg", "basegame", "audio/effects/static/film_pops_lowpass.ogg",
irModule, irPath, crossfeed, gain irModule, irPath, crossfeed, gain
) )

View File

@@ -42,7 +42,7 @@ class FixtureJukebox : Electric, PlaysMusic {
@Transient private val backLamp: SheetSpriteAnimation @Transient private val backLamp: SheetSpriteAnimation
@Transient private val filterIndex = 2 @Transient private val filterIndex = 0
internal val discInventory = ArrayList<ItemID>() internal val discInventory = ArrayList<ItemID>()

View File

@@ -14,6 +14,7 @@ import net.torvald.terrarum.Terrarum.mouseTileY
import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE
import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZED import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZED
import net.torvald.terrarum.audio.* import net.torvald.terrarum.audio.*
import net.torvald.terrarum.audio.AudioMixer.Companion.DS_FLTIDX_PAN
import net.torvald.terrarum.audio.dsp.* import net.torvald.terrarum.audio.dsp.*
import net.torvald.terrarum.controller.TerrarumController import net.torvald.terrarum.controller.TerrarumController
import net.torvald.terrarum.gameworld.GameWorld import net.torvald.terrarum.gameworld.GameWorld
@@ -519,7 +520,7 @@ class BasicDebugInfoWindow : UICanvas() {
Toolkit.fillArea(batch, x, y, miniW, miniH) Toolkit.fillArea(batch, x, y, miniW, miniH)
// pan // pan
val panw = (track.filters[0] as BinoPan).pan * 0.5f * miniW val panw = (track.filters[DS_FLTIDX_PAN] as BinoPan).pan * 0.5f * miniW
batch.color = COL_METER_GRAD batch.color = COL_METER_GRAD
Toolkit.fillArea(batch, x.toFloat(), y.toFloat(), miniW.toFloat(), 2f) Toolkit.fillArea(batch, x.toFloat(), y.toFloat(), miniW.toFloat(), 2f)
batch.color = COL_METER_GRAD2 batch.color = COL_METER_GRAD2