Added pcm-reader and more sounds.
This commit is contained in:
		
							parent
							
								
									a0e8726ce6
								
							
						
					
					
						commit
						0f204f5fbf
					
				| 
						 | 
				
			
			@ -3,8 +3,12 @@
 | 
			
		|||
 | 
			
		||||
A script for an all-in-one elevator with floor selection, sounds, doors, and
 | 
			
		||||
more.
 | 
			
		||||
 | 
			
		||||
Requires `pcm-reader.lua` installed as to be required with `require("pcm")`
 | 
			
		||||
]]
 | 
			
		||||
 | 
			
		||||
local pcm = require("pcm")
 | 
			
		||||
 | 
			
		||||
-- Load floors from elevator settings.
 | 
			
		||||
local FLOORS = {}
 | 
			
		||||
local floorsFile = io.open("floors.tbl", "r") or error("Missing floors.tbl")
 | 
			
		||||
| 
						 | 
				
			
			@ -200,6 +204,8 @@ local function goToFloor(floorLabel)
 | 
			
		|||
    local motionKeyframes = computeLinearMotion(distance)
 | 
			
		||||
    playChime(currentFloor)
 | 
			
		||||
    closeDoor(currentFloor)
 | 
			
		||||
    local audioFile = "audio/going-up.pcm"
 | 
			
		||||
    if rpmDir == -1 then audioFile = "audio/going-down.pcm" end
 | 
			
		||||
    for _, frame in pairs(motionKeyframes) do
 | 
			
		||||
        local sleepTime = math.floor((frame.duration - 0.05) * 20) / 20 -- Make sure we round down to safely arrive before the detector.
 | 
			
		||||
        if frame.rpm == CONTROL_MAX_RPM then
 | 
			
		||||
| 
						 | 
				
			
			@ -366,8 +372,6 @@ end
 | 
			
		|||
    Main Script Area.
 | 
			
		||||
]]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
initControls()
 | 
			
		||||
initUserInterface()
 | 
			
		||||
while true do
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											Binary file not shown.
										
									
								
							| 
						 | 
				
			
			@ -0,0 +1,43 @@
 | 
			
		|||
local pcm = {}
 | 
			
		||||
 | 
			
		||||
-- Reads a file containing signed 8-bit PCM audio data, and converts it into a list of buffers to play.
 | 
			
		||||
function pcm.readFile(filename)
 | 
			
		||||
    if not fs.exists(filename) then error("Audio file " .. filename .. " doesn't exist.") end
 | 
			
		||||
    if fs.isDir(filename) then error("Cannot read audio from directory: " .. filename) end
 | 
			
		||||
    local frames = {}
 | 
			
		||||
    local currentFrame = {}
 | 
			
		||||
    local currentFrameSampleCount = 0
 | 
			
		||||
    local file = fs.open(filename, "rb")
 | 
			
		||||
    while true do
 | 
			
		||||
        local n = file.read()
 | 
			
		||||
        if n == nil then break end
 | 
			
		||||
        if n > 127 then n = n - 256 end
 | 
			
		||||
        table.insert(currentFrame, n)
 | 
			
		||||
        currentFrameSampleCount = currentFrameSampleCount + 1
 | 
			
		||||
        if currentFrameSampleCount == (128 * 1024) then
 | 
			
		||||
            table.insert(frames, currentFrame)
 | 
			
		||||
            currentFrame = {}
 | 
			
		||||
            currentFrameSampleCount = 0
 | 
			
		||||
        end
 | 
			
		||||
    end
 | 
			
		||||
    file.close()
 | 
			
		||||
    if currentFrameSampleCount > 0 then
 | 
			
		||||
        table.insert(frames, currentFrame)
 | 
			
		||||
    end
 | 
			
		||||
    return frames
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function pcm.playFrames(speaker, frames)
 | 
			
		||||
    for i = 1, #frames do
 | 
			
		||||
        while not speaker.playAudio(frames[i]) do
 | 
			
		||||
            os.pullEvent("speaker_audio_empty")
 | 
			
		||||
        end
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function pcm.playFile(speaker, filename)
 | 
			
		||||
    local frames = pcm.readFile(filename)
 | 
			
		||||
    pcm.playFrames(frames)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
return pcm
 | 
			
		||||
| 
						 | 
				
			
			@ -7,6 +7,7 @@ module pcm_to_lua;
 | 
			
		|||
 | 
			
		||||
import std.stdio;
 | 
			
		||||
import std.file;
 | 
			
		||||
import std.array;
 | 
			
		||||
 | 
			
		||||
const frameSize = 128 * 1024;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -23,6 +24,7 @@ int main(string[] args) {
 | 
			
		|||
 | 
			
		||||
    byte[] contents = cast(byte[]) std.file.read(audioFilename);
 | 
			
		||||
    ulong sampleIndex = 0;
 | 
			
		||||
    auto app = appender!string;
 | 
			
		||||
    stdout.writeln("local audio = {");
 | 
			
		||||
    foreach (byte sample; contents) {
 | 
			
		||||
        stdout.writefln!"    %d,"(sample);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue