mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-06-06 08:38:30 +09:00
jukebox: speaker sim using convolver
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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)
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user