mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-07 20:31:51 +09:00
random sound audio bank
This commit is contained in:
@@ -19,9 +19,9 @@ abstract class AudioBank : Disposable {
|
||||
|
||||
abstract val name: String
|
||||
|
||||
abstract val samplingRate: Float
|
||||
abstract val channels: Int
|
||||
abstract val totalSizeInSamples: Long
|
||||
abstract var samplingRate: Float
|
||||
abstract var channels: Int
|
||||
abstract var totalSizeInSamples: Long
|
||||
abstract fun currentPositionInSamples(): Long
|
||||
|
||||
open fun sendMessage(msg: String) {}
|
||||
@@ -30,5 +30,5 @@ abstract class AudioBank : Disposable {
|
||||
abstract fun readSamples(bufferL: FloatArray, bufferR: FloatArray): Int
|
||||
abstract fun reset()
|
||||
|
||||
abstract val songFinishedHook: (AudioBank) -> Unit
|
||||
abstract var songFinishedHook: (AudioBank) -> Unit
|
||||
}
|
||||
@@ -382,33 +382,19 @@ class FeedSamplesToAdev(val bufferSize: Int, val rate: Int, val track: TerrarumA
|
||||
if (track.trackType != TrackType.MASTER) throw IllegalArgumentException("Track is not master")
|
||||
}
|
||||
|
||||
val sleepTime = (1000000000.0 * ((bufferSize / 4.0) / TerrarumAudioMixerTrack.SAMPLING_RATED)).toLong()
|
||||
val sleepMS = sleepTime / 1000000
|
||||
val sleepNS = (sleepTime % 1000000).toInt()
|
||||
|
||||
private fun printdbg(msg: Any) {
|
||||
if (true) println("[AudioAdapter ${track.name}] $msg")
|
||||
}
|
||||
@Volatile private var exit = false
|
||||
override fun run() {
|
||||
while (!exit) {
|
||||
|
||||
val writeQueue = track.pcmQueue
|
||||
val queueSize = writeQueue.size
|
||||
if (queueSize > 0) {
|
||||
// printdbg("PULL; Queue size: $queueSize")
|
||||
val samples = writeQueue.removeFirst()
|
||||
track.adev!!.writeSamples(samples)
|
||||
while (!Thread.currentThread().isInterrupted) {
|
||||
try {
|
||||
val writeQueue = track.pcmQueue
|
||||
val queueSize = writeQueue.size
|
||||
if (queueSize > 0) {
|
||||
val samples = writeQueue.removeFirst()
|
||||
track.adev!!.writeSamples(samples)
|
||||
}
|
||||
}
|
||||
catch (_: InterruptedException) {
|
||||
Thread.currentThread().interrupt()
|
||||
}
|
||||
// else {
|
||||
// printdbg("QUEUE EMPTY QUEUE EMPTY QUEUE EMPTY ")
|
||||
// }
|
||||
|
||||
// Thread.sleep(sleepMS, sleepNS)
|
||||
}
|
||||
}
|
||||
|
||||
fun stop() {
|
||||
exit = true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,8 +30,8 @@ class MusicContainer(
|
||||
val samplingRateOverride: Float?, // this is FIXED sampling rate
|
||||
override var songFinishedHook: (AudioBank) -> Unit = {}
|
||||
): AudioBank() {
|
||||
override val samplingRate: Float
|
||||
override val channels: Int
|
||||
override var samplingRate: Float
|
||||
override var channels: Int
|
||||
val codec: String
|
||||
|
||||
// make Java code shorter
|
||||
@@ -58,7 +58,7 @@ class MusicContainer(
|
||||
|
||||
|
||||
var samplesReadCount = 0L; internal set
|
||||
override val totalSizeInSamples: Long
|
||||
override var totalSizeInSamples: Long
|
||||
private val totalSizeInBytes: Long
|
||||
|
||||
private val gdxMusic: Music = Gdx.audio.newMusic(FileHandle(file))
|
||||
|
||||
@@ -120,7 +120,7 @@ object WorldSimulator {
|
||||
|
||||
fun growOrKillGrass() {
|
||||
// season-dependent growth rate
|
||||
// https://www.desmos.com/calculator/ivxyxuj0bm
|
||||
// https://www.desmos.com/calculator/4u5npfxgak
|
||||
val baseCount = 2 * world.worldTime.timeDelta
|
||||
val season = world.worldTime.ecologicalSeason.coerceIn(0f, 5f) // 1->1.0, 2.5->3.0, 4->1.0
|
||||
val seasonalMult = 1f + sech2((season - 2.5f)) * 2f
|
||||
|
||||
@@ -19,15 +19,15 @@ class AudioBankMusicBox(override var songFinishedHook: (AudioBank) -> Unit = {})
|
||||
}
|
||||
|
||||
override val name = "spieluhr"
|
||||
override val samplingRate = 48000f // 122880 // use 122880 to make each tick is 2048 samples
|
||||
override val channels = 1
|
||||
override var samplingRate = 48000f // 122880 // use 122880 to make each tick is 2048 samples
|
||||
override var channels = 1
|
||||
|
||||
private val getSample = // usage: getSample(noteNum 0..60)
|
||||
InstrumentLoader.load("spieluhr", "basegame", "audio/effects/notes/spieluhr.ogg", 41)
|
||||
|
||||
private val SAMPLES_PER_TICK = samplingRate / App.TICK_SPEED // should be 800 on default setting
|
||||
|
||||
override val totalSizeInSamples = getSample(0).first.size.toLong() // length of lowest-pitch note
|
||||
override var totalSizeInSamples = getSample(0).first.size.toLong() // length of lowest-pitch note
|
||||
|
||||
private val messageQueue = ArrayList<Msg>()
|
||||
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
package net.torvald.terrarum.modulebasegame.audio.audiobank
|
||||
|
||||
import net.torvald.terrarum.audio.AudioBank
|
||||
import net.torvald.terrarum.audio.AudioCodex
|
||||
import net.torvald.terrarum.tryDispose
|
||||
|
||||
/**
|
||||
* Created by minjaesong on 2024-08-16.
|
||||
*/
|
||||
open class AudioBankTemplateRandomSound(
|
||||
private val audioCodex: AudioCodex,
|
||||
/** Name must be equal to the name in the AudioCodex identifier */
|
||||
override val name: String,
|
||||
|
||||
override var songFinishedHook: (AudioBank) -> Unit
|
||||
) : AudioBank() {
|
||||
|
||||
override var samplingRate: Float = 48000f
|
||||
override var channels: Int = 1
|
||||
override var totalSizeInSamples: Long = 1152L
|
||||
|
||||
|
||||
private var currentSample = audioCodex.getRandomAudio(name)!!.makeCopy()
|
||||
set(value) {
|
||||
field = value
|
||||
samplingRate = value.samplingRate
|
||||
channels = value.channels
|
||||
totalSizeInSamples = value.totalSizeInSamples
|
||||
}
|
||||
|
||||
private fun getNextRandomSample() {
|
||||
currentSample = audioCodex.getRandomAudio(name)!!
|
||||
}
|
||||
|
||||
override fun makeCopy(): AudioBank {
|
||||
return AudioBankTemplateRandomSound(audioCodex, name, songFinishedHook)
|
||||
}
|
||||
|
||||
override fun currentPositionInSamples() = currentSample.currentPositionInSamples()
|
||||
|
||||
override fun readSamples(bufferL: FloatArray, bufferR: FloatArray): Int {
|
||||
return currentSample.readSamples(bufferL, bufferR)
|
||||
}
|
||||
|
||||
override fun reset() {
|
||||
currentSample.tryDispose()
|
||||
getNextRandomSample()
|
||||
}
|
||||
|
||||
override fun dispose() {
|
||||
currentSample.tryDispose()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user