Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local print = epoe.Print
- require'audio'
- if( audio ) then
- audio:stop()
- end
- audio = audio or Audio()
- samples =
- {
- Sample("sound/synth/sine.wav"),
- Sample("sound/synth/sine.wav"),
- Sample("sound/synth/tri.wav"),
- Sample("sound/synth/sine.wav"),
- Sample("sound/synth/tri.wav"),
- Sample("sound/synth/sine.wav"),
- Sample("sound/synth/tri.wav"),
- Sample("sound/synth/sine.wav"),
- Sample("sound/synth/sine.wav"),
- Sample("sound/synth/tri.wav"),
- Sample("sound/synth/sine.wav"),
- Sample("sound/synth/tri.wav"),
- Sample("sound/synth/sine.wav"),
- Sample("sound/synth/tri.wav")
- /*
- [1] = "12_5_pwm_1760.wav",
- [2] = "12_5_pwm_440.wav",
- [3] = "12_5_pwm_880.wav",
- [4] = "25_pwm_1760.wav",
- [5] = "25_pwm_440.wav",
- [6] = "25_pwm_880.wav",
- [7] = "75_pwm_1760.wav",
- [8] = "75_pwm_440.wav",
- [9] = "75_pwm_880.wav",
- [10] = "brown_noise.wav",
- [11] = "pink_noise.wav",
- [12] = "saw.wav",
- [13] = "saw_1760.wav",
- [14] = "saw_440.wav",
- [15] = "saw_880.wav",
- [16] = "saw_inverted_1760.wav",
- [17] = "saw_inverted_440.wav",
- [18] = "saw_inverted_880.wav",
- [19] = "sine.wav",
- [20] = "sine_1760.wav",
- [21] = "sine_440.wav",
- [22] = "sine_880.wav",
- [23] = "square.wav",
- [24] = "square_1760.wav",
- [25] = "square_440.wav",
- [26] = "square_880.wav",
- [27] = "tri.wav",
- [28] = "triangle_1760.wav",
- [29] = "triangle_440.wav",
- [30] = "triangle_880.wav",
- [31] = "white_noise.wav",
- */
- }
- mididata = {}
- local channels = {
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- }
- local time, rate = 0, 0
- local gate = true
- local function note_to_freq(note)
- return (440 * 2 ^ (note / 12))
- end
- function audio:process(buffer, count)
- if not mididata then
- audio:stop()
- end
- for i=1, count, audio.channels do
- for channel, data in pairs(mididata) do
- local notedata = data.notedata[data.index]
- if notedata then
- if time >= data.next_time and data.notedata[data.index+1] then
- data.next_time = time + data.notedata[data.index+1].ms
- data.index = data.index + 1
- data.decay = 1
- end
- if gate then
- data.decay = math.Clamp(data.decay - (2 / audio.rate), 0, 1)
- buffer[i] =
- samples[channel]
- [rate * notedata.note] *
- (notedata.volume / 150) *
- data.decay
- buffer[i + 1] = buffer[i]
- else
- buffer[i] = 0
- buffer[i + 1] = buffer[i]
- end
- else
- --index = 1
- --audio:stop()
- end
- rate = rate + (1 / audio.rate)
- end
- end
- time = time + (FrameTime() * 5)
- end
- http.Get("http://dl.dropbox.com/u/29407915/zelda.txt", "", function(content)
- for line in content:gmatch("(.-)\n") do
- local ms, channel, note, volume = line:match("(%d+):(%d+):(%d+):(%d+)")
- ms = tonumber(ms)
- channel = tonumber(channel)
- note = tonumber(note)
- volume = tonumber(volume)
- if ms and channel and note and volume then
- if ms > 0 then
- ms = ms / 1000
- end
- local new =
- {
- ms = ms,
- channel = channel,
- note = note_to_freq(note + 12),
- volume = volume
- }
- mididata[channel] = mididata[channel] or
- {
- index = 1,
- decay = 1,
- next_time = 0,
- notedata = {},
- }
- table.insert(mididata[channel].notedata, new)
- end
- end
- print("playing")
- audio:start()
- end)
Advertisement
Add Comment
Please, Sign In to add comment