jukebox: speaker sim using convolver

This commit is contained in:
minjaesong
2024-01-12 19:55:36 +09:00
parent 40365fd828
commit 988c9dbff7
8 changed files with 34 additions and 12 deletions

View File

@@ -20,8 +20,9 @@ import java.io.File
import kotlin.math.roundToInt import kotlin.math.roundToInt
/** /**
* @param ir Binary file containing MONO IR * @param ir Binary file containing MONO IR (containing only two channels)
* @param crossfeed The amount of channel crossfeeding to simulate the stereo ID * @param crossfeed The amount of channel crossfeeding to simulate the true stereo IR. Fullscale (0.0 - 1.0)
* @param gain output gain. Fullscale (0.0 - 1.0)
*/ */
class Convolv(ir: File, val crossfeed: Float, gain: Float = 1f / 256f): TerrarumAudioFilter() { class Convolv(ir: File, val crossfeed: Float, gain: Float = 1f / 256f): TerrarumAudioFilter() {
private val gain: Float = gain / (1f + crossfeed) private val gain: Float = gain / (1f + crossfeed)

View File

@@ -127,12 +127,13 @@ abstract class Actor : Comparable<Actor>, Runnable {
return track return track
} }
open fun startAudio(music: MusicContainer, volume: TrackVolume = 1.0) { open fun startAudio(music: MusicContainer, volume: TrackVolume = 1.0, doSomethingWithTrack: (TerrarumAudioMixerTrack) -> Unit = {}) {
getTrackByAudio(music)?.let { getTrackByAudio(music)?.let {
it.stop() it.stop()
it.trackingTarget = this it.trackingTarget = this
it.currentTrack = music it.currentTrack = music
it.maxVolumeFun = { volume } it.maxVolumeFun = { volume }
doSomethingWithTrack(it)
it.play() it.play()
} }
} }
@@ -141,8 +142,11 @@ abstract class Actor : Comparable<Actor>, Runnable {
}*/ }*/
open fun stopAudio(music: MusicContainer) { open fun stopAudio(music: MusicContainer, doSomethingWithTrack: (TerrarumAudioMixerTrack) -> Unit = {}) {
musicTracks[music]?.stop() musicTracks[music]?.let {
doSomethingWithTrack(it)
it.stop()
}
} }
/*open fun onAudioInterrupt(sound: Sound) { /*open fun onAudioInterrupt(sound: Sound) {

View File

@@ -7,6 +7,8 @@ import net.torvald.terrarum.ModMgr
import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE
import net.torvald.terrarum.audio.AudioMixer import net.torvald.terrarum.audio.AudioMixer
import net.torvald.terrarum.audio.AudioMixer.DEFAULT_FADEOUT_LEN import net.torvald.terrarum.audio.AudioMixer.DEFAULT_FADEOUT_LEN
import net.torvald.terrarum.audio.dsp.Convolv
import net.torvald.terrarum.audio.dsp.NullFilter
import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gameactors.AVKey
import net.torvald.terrarum.langpack.Lang import net.torvald.terrarum.langpack.Lang
import net.torvald.terrarum.modulebasegame.MusicContainer import net.torvald.terrarum.modulebasegame.MusicContainer
@@ -30,6 +32,7 @@ class FixtureJukebox : Electric {
@Transient private val testMusic = ModMgr.getGdxFile("basegame", "audio/music/discs/01 Thousands of Shards.ogg").let { @Transient private val testMusic = ModMgr.getGdxFile("basegame", "audio/music/discs/01 Thousands of Shards.ogg").let {
MusicContainer("Thousands of Shards", it.file(), Gdx.audio.newMusic(it)) { MusicContainer("Thousands of Shards", it.file(), Gdx.audio.newMusic(it)) {
unloadConvolver(musicNowPlaying)
discCurrentlyPlaying = null discCurrentlyPlaying = null
musicNowPlaying = null musicNowPlaying = null
(INGAME.musicGovernor as TerrarumMusicGovernor).stopMusic(pauseLen = Math.random().toFloat() * 30f + 30f) (INGAME.musicGovernor as TerrarumMusicGovernor).stopMusic(pauseLen = Math.random().toFloat() * 30f + 30f)
@@ -79,13 +82,24 @@ class FixtureJukebox : Electric {
musicNowPlaying = testMusic // todo use index musicNowPlaying = testMusic // todo use index
AudioMixer.requestFadeOut(AudioMixer.musicTrack, DEFAULT_FADEOUT_LEN / 2f) { AudioMixer.requestFadeOut(AudioMixer.musicTrack, DEFAULT_FADEOUT_LEN / 2f) {
startAudio(musicNowPlaying!!) startAudio(musicNowPlaying!!) {
it.filters[2] = Convolv(ModMgr.getFile("basegame", "audio/convolution/Soundwoofer - large_speaker_Marshall JVM 205C SM57 A 0 0 1.bin"), 0f, 5f / 16f)
}
} }
} }
private fun forceStop() { private fun forceStop() {
musicNowPlaying?.let { musicNowPlaying?.let {
stopAudio(it) stopAudio(it)
unloadConvolver(it)
}
}
private fun unloadConvolver(music: MusicContainer?) {
if (music != null) {
musicTracks[music]?.let {
it.filters[2] = NullFilter
}
} }
} }