CapsAdmin

Untitled

Nov 8th, 2011
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.29 KB | None | 0 0
  1. local print = epoe.Print
  2.  
  3. require'audio'
  4.  
  5. if( audio ) then
  6.     audio:stop()
  7. end
  8.  
  9. audio = audio or Audio()
  10. samples =
  11. {
  12.     Sample("sound/synth/sine.wav"),
  13.     Sample("sound/synth/sine.wav"),
  14.     Sample("sound/synth/tri.wav"),
  15.     Sample("sound/synth/sine.wav"),
  16.     Sample("sound/synth/tri.wav"),
  17.     Sample("sound/synth/sine.wav"),
  18.     Sample("sound/synth/tri.wav"),
  19.     Sample("sound/synth/sine.wav"),
  20.     Sample("sound/synth/sine.wav"),
  21.     Sample("sound/synth/tri.wav"),
  22.     Sample("sound/synth/sine.wav"),
  23.     Sample("sound/synth/tri.wav"),
  24.     Sample("sound/synth/sine.wav"),
  25.     Sample("sound/synth/tri.wav")
  26.  
  27.     /*
  28.  
  29.         [1] = "12_5_pwm_1760.wav",
  30.     [2] = "12_5_pwm_440.wav",
  31.     [3] = "12_5_pwm_880.wav",
  32.     [4] = "25_pwm_1760.wav",
  33.     [5] = "25_pwm_440.wav",
  34.     [6] = "25_pwm_880.wav",
  35.     [7] = "75_pwm_1760.wav",
  36.     [8] = "75_pwm_440.wav",
  37.     [9] = "75_pwm_880.wav",
  38.     [10] = "brown_noise.wav",
  39.     [11] = "pink_noise.wav",
  40.     [12] = "saw.wav",
  41.     [13] = "saw_1760.wav",
  42.     [14] = "saw_440.wav",
  43.     [15] = "saw_880.wav",
  44.     [16] = "saw_inverted_1760.wav",
  45.     [17] = "saw_inverted_440.wav",
  46.     [18] = "saw_inverted_880.wav",
  47.     [19] = "sine.wav",
  48.     [20] = "sine_1760.wav",
  49.     [21] = "sine_440.wav",
  50.     [22] = "sine_880.wav",
  51.     [23] = "square.wav",
  52.     [24] = "square_1760.wav",
  53.     [25] = "square_440.wav",
  54.     [26] = "square_880.wav",
  55.     [27] = "tri.wav",
  56.     [28] = "triangle_1760.wav",
  57.     [29] = "triangle_440.wav",
  58.     [30] = "triangle_880.wav",
  59.     [31] = "white_noise.wav",
  60.     */
  61. }
  62.  
  63. mididata = {}
  64.  
  65. local channels = {
  66.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  67. }
  68.  
  69. local time, rate = 0, 0
  70. local gate = true
  71.  
  72. local function note_to_freq(note)
  73.     return (440 * 2 ^ (note / 12))
  74. end
  75.  
  76. function audio:process(buffer, count)
  77.     if not mididata then
  78.         audio:stop()
  79.     end
  80.  
  81.     for i=1, count, audio.channels do
  82.  
  83.         for channel, data in pairs(mididata) do
  84.             local notedata = data.notedata[data.index]
  85.             if notedata then
  86.  
  87.                 if time >= data.next_time and data.notedata[data.index+1] then
  88.                     data.next_time = time + data.notedata[data.index+1].ms
  89.                     data.index = data.index + 1
  90.                     data.decay = 1
  91.                 end
  92.  
  93.                 if gate then
  94.                     data.decay = math.Clamp(data.decay - (2 / audio.rate), 0, 1)
  95.  
  96.                     buffer[i] =
  97.                     samples[channel]
  98.                     [rate * notedata.note] *
  99.                     (notedata.volume / 150) *
  100.                     data.decay
  101.  
  102.                     buffer[i + 1] = buffer[i]
  103.                 else
  104.                     buffer[i] = 0
  105.                     buffer[i + 1] = buffer[i]
  106.                 end
  107.             else
  108.                 --index = 1
  109.                 --audio:stop()
  110.             end
  111.             rate = rate + (1 / audio.rate)
  112.         end
  113.     end
  114.  
  115.  
  116.     time = time + (FrameTime() * 5)
  117. end
  118.  
  119.  
  120. http.Get("http://dl.dropbox.com/u/29407915/zelda.txt", "", function(content)
  121.     for line in content:gmatch("(.-)\n") do
  122.         local ms, channel, note, volume = line:match("(%d+):(%d+):(%d+):(%d+)")
  123.  
  124.         ms = tonumber(ms)
  125.         channel = tonumber(channel)
  126.         note = tonumber(note)
  127.         volume = tonumber(volume)
  128.  
  129.         if ms and channel and note and volume then
  130.             if ms > 0 then
  131.                 ms = ms / 1000
  132.             end
  133.  
  134.             local new =
  135.             {
  136.                 ms = ms,
  137.                 channel = channel,
  138.                 note = note_to_freq(note + 12),
  139.                 volume = volume
  140.             }
  141.  
  142.             mididata[channel] = mididata[channel] or
  143.             {
  144.                 index = 1,
  145.                 decay = 1,
  146.                 next_time = 0,
  147.                 notedata = {},
  148.             }
  149.  
  150.             table.insert(mididata[channel].notedata, new)
  151.         end
  152.     end
  153.  
  154.     print("playing")
  155.  
  156.     audio:start()
  157. end)
  158.  
  159.  
Advertisement
Add Comment
Please, Sign In to add comment