0,]']╠>SО}WЪмu╖Пp8╥d%qy)6o;]иA╕ЖsОВТТТ■╟бVl├3ю?═╙ ╙═ ═ ╙╙ ╙ ═ ю╙ ═ ═╙ ═ ═╙═╙ ═╙ ╙╙╙╙ ╙╙╙ ═ ═ ═╙╙╙═╙ ═╙╙╙╙╙ юл═╙╙═╙╙═ ══ ╙═ ╙ ═ ╙ ═ ╙ ╙ ╙╙ ╙╙ ╙═ ╙ ╙ ╙ ╙ ═ юлл╙ ╙════ ══ ╙ ╙ ═ ╙═ ╙ ╙ ═ ═ ╙ ╙╙ ╙ ╙═ юллл╙╙╙════╙ ╙ ═╙╙╙═╙ ╙╙ ╙╙═╙═ ═ ═╙╙╙╙═╙╙╙ лллл═ ═ ллллл ═ ═╙ ═ ═╙ лллллл ═╙═╙ ╙ ═╙═╙ ╙ ═╙ ╙ллллллл╙╙ ╙═ ═ ╙ ╙═ ═ ╙ ═╙ ═ ╙ юллллллл╙╙ ╙ ═ ═╙╙ ═ ══ ═ юлллллллл╙═ ═╙═╙ ═╙═╙ ═╙ ╙╙═╙╙юлллллллллюлллллллллл╙╙╙═╙юллллллллллл╙╙╙ ═ ═╙╙═ лллллллллллл╙ ═╙╙═╙ ллллллллллллл╙ ╙ ╙╙╙ ╙ лллллллллллллл╙ ╙╙ ══╙лллллллллллллллюллллллллллллллл═ ╙╙ ╙╙ ╙╙╙╙юлллллллллллллллл═╙ ╙╙ ═╙╙╙═╙ ╙ ╙╙═ ═ юллллллллллллллллл╙ ═ ╙═ ╙ ╙ ╙╙╙╙═╙═╙юлллллллллллллллллл╙ ═ ╙ ╙ ╙ ╙ ═ ═ ╙╙ллллллллллллллллллл╙╙╙ ═╙╙╙╙╙╙╙╙╙╙╙ ╙╙ лллллллллллллллллллл╙лллллллллллллллллллллллллллллллллллллллллллюллллллллллллллллллллллю юллллллллллллллллллллллюл юллллллллллллллллллллллюлл юллллллллллллллллллллллюллл юллллллллллллллллллллллюллл юллллллллллллллллллллллюллл л юллллллллллллллллллллллюллл лл юллллллллллллллллллллллюллл ллл юллллллллллллллллллллллюллл юллл юллллллллллллллллллллллюллл юлллл юллллллллллллллллллллллюллл юллллл юллллллллллллллллллллллюллл юлллллл юллллллллллллллллллллллюллл ллллллл юллллллллллллллллллллллюллл лллллллл юллллллллллллллллллллллюллл ллллллллл юллллллллллллллллллллллюллл юллллллюллл юллллллллллллллллллллллюллл юлллллллллл юллллллллллллллллллллллюллл юллллллллллл юллллллллллллллллллллллюллл юлллллллллллл юллллллллллллллллллллллюллл юллллллюлллллл лллллллллллллллллллллллюлллл юллллллюлллллл лллллллллллллллллллллллллллл юллллллюлллллл ллллллллллллллллллллллллллллл юллллллюлллллл лллллллллллллллллллллллдлллллл юллллллюлллллл лллллллллллллллллллллллдлллллл юллллллюлллллл ллллллллллллллллллллллллдлллллл юллллллюлллллл юллллллллллллллллллллллллдлллллл юллллллюлллллл юлллллллллллллллллллллллллдлллллл юллллллллллллл ллллллллллллллллллллллллллдлллллл юллллллллллллл лллллллллллллллллллллллллллдлллллл юллллллллллллл юлллллллллллллллллллллллллллдлллллл юллллллллллллл юллллллллллллллллллллллллллллдлллллл юллллллллллллл юлллллллллллллллллллллллллллллдлллллл юллллллллллллл юллллллллллллллллллллллллллллллдлллллл юллллллллллллл лллллллллллллллллллллллллллллллдлллллл юллллллллллллл ллллллллллллллллллллллллллллллллдлллллл юллллллллллллл лллллллллллллллллллллллллллллллллдлллллл юллллллллллллл ллллллллллллллллллллллллллллллллллдлллллл юллллллллллллл лллллллллллллллллллллллллллллллллллдлллллл юллллллллллллл `лллллллллллллллллллллллллллллллллллдлллллл юллллллллллллл ╛`лллллллллллллллллллллллллллллллллллдлллллл юллллллллллллл л╛`лллллллллллллллллллллллллллллллллллдлллллл юллллллллллллл лл╛`лллллллллллллллллллллллллллллллллллдлллллл юллллллллллллл юлл╛`лллллллллллллллллллллллллллллллллллдлллллл юллллллллллллл юллл╛`лллллллллллллллллллллллллллллллллллдлллллл юллллллллллллл юлллл╛`лллллллллллллллллллллллллллллллллллдлллллл юллллллллллллл юллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юллллллллллллл лллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юллллллллллллл ллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юллллллллллллл лллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл ллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юлллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юлллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл лллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл ююлллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл ююллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл ююлллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл люлллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юлюлллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юллюлллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юлллюлллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл ллллюлллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл л ллллюлллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл лл ллллюлллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл ллл ллллюлллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юллл ллллюлллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юлллл ллллюлллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юллллл ллллюлллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл лллллл юллллюлллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юлллллл лллллюлллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юлллллл юлллллюлллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юлллллл юллллллюлллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юллллллллллллллюлллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл лллллллллллллллллллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юлллллллллллллллллллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл ю юлллллллллллллллллллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юл юлллллллллллллллллллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юл юллллллллллллллллллллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юл лллллллллллллллллллллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл ююл юлллллллллллллллллллллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл ююлл юлллллллллллллллллллллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юлюлл юлллллллллллллллллллллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юлллл юлллллллллллллллллллллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юллллл юлллллллллллллллллллллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юлллллл юлллллллллллллллллллллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юллллллл юлллллллллллллллллллллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юллллллл юллллллллллллллллллллллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юллллллл лллллллллллллллллллллллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юлюлллллл юлллллллллллллллллллллллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юлюлллллл юллллллллллллллллллллллллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юлюлллллл юлллллллллллллллллллллллллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юлллллллл юлллллллллллллллллллллллллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юлллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл юлллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл ллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл ллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдлллллл лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл╛`лллллллллллллллллллллллллллллллллллдллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл╛юю`лллллллллллллллллллллллллллллллллллдллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл╛юлbлллллллллллллллллллллллллллллллллллдллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл╛ ююлbлллллллллллллллллллллллллллллллллллдллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл╛ ююю лbлллллллллллллллллллллллллллллллллллдллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл╛ юююллbлллллллллллллллллллллллллллллллллллдллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл╛ ллюллbлллллллллллллллллллллллллллллллллллдллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл╛ллллллbлллллллллллллллллллллллллллллллллллдллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл╛юллллллbлллллллллллллллллллллллллллллллллллФ'-- title: Sqrt buffer sort -- author: Sava -- desc: My own sorting algorithm! Slower than quick but faster than merge -- license: MIT License -- version: 0.2 -- script: lua w=240 h=136 sorts={ {name="Sqrt buffer sort", size=240, func=function() sqrtsort({1, #arr}) end}, {name="Bucketed sqrt buffer sort", size=240, func=function() bucketsqrtsort({1, #arr}) end}, {name="Simple sqrt buffer sort", size=240, func=function() simplesqrtsort({1, #arr}) end} } shuffles={ {name="Uniform", func=function() for i=1, sorts[cur].size do arr[i] = i end shuffle() end}, {name="Already sorted", func=function() for i=1, sorts[cur].size do arr[i] = i end end}, {name="Reversed", func=function() for i=1, sorts[cur].size do arr[i] = i end reverse({1, #arr}) end}, {name="Few unique - 32", func=function() local u = 32 for i=1, sorts[cur].size do arr[i] = (i-1)//(sorts[cur].size/u)*sorts[cur].size/u+1 end shuffle() end}, {name="Very few unique - 4", func=function() local u = 4 for i=1, sorts[cur].size do arr[i] = (i-1)//(sorts[cur].size/u)*sorts[cur].size/u+1 end shuffle() end}, {name="Half rotated", func=function() for i=1, sorts[cur].size do arr[i] = i end rotate({1, #arr}, #arr//2) end}, {name="Fake final merge", func=function() for i=1, sorts[cur].size do arr[i] = i end for i=1, sorts[cur].size//2 do write(i, i*2-1) write(i+sorts[cur].size//2, i*2) end end}, {name="Real final merge", func=function() for i=1, sorts[cur].size do arr[i] = i end local p1, p2 = 1, sorts[cur].size//2 for i=1, sorts[cur].size do if (math.random() > 0.5 and p1 < sorts[cur].size//2) or p2 > sorts[cur].size then write(p1, i) p1=p1+1 else write(p2, i) p2=p2+1 end end end}, {name="Weaved", func=function() for i=1, sorts[cur].size do arr[i] = i end for i=1, sorts[cur].size, 2 do write(i, (i+1)//2) write(i+1, (i+1)//2+sorts[cur].size//2) end end}, {name="Noisy", func=function() for i=1, sorts[cur].size do arr[i] = i+(math.random()*2-1)*5 end end}, {name="Quadratic", func=function() for i=1, sorts[cur].size do arr[i] = (((i-1)/sorts[cur].size)^2)*sorts[cur].size end shuffle() end}, {name="Heapified", func=function() for i=1, sorts[cur].size do arr[i] = i end for i=sorts[cur].size//2, 1, -1 do maxheapify(sorts[cur].size, i, {1, sorts[cur].size}) end end} } function insertionsort(r) local run = 0 local dir = read(r[1]+1)-read(r[1]) > 0 and 1 or -1 for i=r[1]+1, r[2] do if (read(i)-read(i-1))*dir >= 0 then run=run+1 else if dir == -1 then reverse({i-run, i}) end run=0 dir = read(i)-read(i-1) > 0 and 1 or -1 end end if dir == -1 then reverse({r[2]-run, r[2]}) end for i=r[1], r[2] do local pos = binarySearch({r[1], i}, read(i)) for j=i-1, pos, -1 do swap(j+1, j) end end end function simplesqrtsort(r) if r[2] <= r[1] then return end local blockSize = math.floor(math.sqrt(r[2]-r[1])) quickselect(r, r[1]+blockSize) subsimplesqrtsort({r[1]+blockSize, r[2]}, {r[1], r[1]+blockSize}, blockSize) insertionsort({r[1], r[1]+blockSize}) end function subsimplesqrtsort(r, buff, blockSize) if r[2] <= r[1] then return end insertionsort({r[1], r[1]+blockSize-1}) subsimplesqrtsort({r[1]+blockSize, r[2]}, buff, blockSize) buffmerge(buff, r, r[1]+blockSize) end function bucketsqrtsort(r) local blockSize = math.floor(math.sqrt(r[2]-r[1])) quickselect(r, r[1]+blockSize-1) local buckets = {} for i=1, blockSize do buckets[i]={} end for i=r[1]+blockSize, r[2] do local b = math.floor((read(i)-r[1])/(r[2]-r[1])*blockSize/2)+1 buckets[b][#buckets[b]+1]=read(i) end local curb = 1 local curi = 1 for i=r[1]+blockSize, r[2] do if not buckets[curb] then break end while #buckets[curb] < curi do if curi ~= 1 then subbucketsqrtsort({i-curi+1, i-1}, {r[1], r[1]+blockSize-1}, blockSize) end curb=curb+1 curi=1 end write(i, buckets[curb][curi]) curi=curi+1 end subbucketsqrtsort({r[2]-curi+1, r[2]}, {r[1], r[1]+blockSize-1}, blockSize) insertionsort({r[1], r[1]+blockSize-1}) end function subbucketsqrtsort(r, buff, blockSize) if r[2] <= r[1] then return end if r[2]-r[1] < blockSize then insertionsort(r) return end insertionsort({r[1], r[1]+blockSize-1}) subbucketsqrtsort({r[1]+blockSize, r[2]}, buff, blockSize) buffmerge(buff, r, r[1]+blockSize) end function sqrtsort(r) if r[2] <= r[1] then return end local blockSize = math.floor(math.sqrt(r[2]-r[1])) quickselect(r, r[1]+blockSize-1) subsqrtsort({r[1]+blockSize, r[2]}, {r[1], r[1]+blockSize-1}, blockSize) insertionsort({r[1], r[1]+blockSize-1}) end function subsqrtsort(r, buff, blockSize) if r[2] <= r[1] then return end if r[2]-r[1] <= blockSize then insertionsort(r) return end if r[2]-r[1] > blockSize*2 then local pivot = selectpartition({r[1], r[2]}, read(getpivot(r))) subsqrtsort({r[1], pivot-1}, buff, blockSize) subsqrtsort({pivot+1, r[2]}, buff, blockSize) return end insertionsort({r[1], r[1]+blockSize-1}) subsqrtsort({r[1]+blockSize, r[2]}, buff, blockSize) buffmerge(buff, r, r[1]+blockSize) end function maxheapify(l, a, r) local larg = a local left = (a-r[1]+1)*2+r[1]-1 local right = (a-r[1]+1)*2+r[1] if left < l and read(left) > read(larg) then larg = left end if right < l and read(right) > read(larg) then larg = right end if larg ~= a then swap(larg, a) maxheapify(l, larg, r) end end function reverse(r) for i=(r[2]-r[1])//2, 0, -1 do swap(i+r[1], r[2]-i) end end function rotate(r, i) reverse({r[1], i}) reverse({i+1, r[2]}) reverse({r[1], r[2]}) end function read(a) coroutine.yield(arr[a], a) return arr[a] end function write(a, v) coroutine.yield(v, a) arr[a] = v end function swap(a, b) arr[a], arr[b] = arr[b], arr[a] coroutine.yield(arr[a], a) coroutine.yield(arr[b], b) end function selectpartition(r, pivot) local p1, p2 = r[1], r[2] local last = p2 while p1 < p2 do while read(p1) < pivot do p1=p1+1 end while read(p2) > pivot do p2=p2-1 last = p2 end if read(p1) == pivot and read(p2) == pivot then p2=p2-1 if p1 >= p2 then break end end swap(p1, p2) end return (p1+last)//2 end function netswap(a, b) if read(a) > read(b) then swap(a, b) end end function sort9(e) local swaps={{0,3},{1,7},{2,5},{4,8},{0,7},{2,4},{3,8},{5,6},{0,2},{1,3},{4,5},{7,8},{1,4},{3,6},{5,7},{0,1},{2,4},{3,5},{6,8},{2,3},{4,5},{6,7},{1,2},{3,4},{5,6}} for i=1, #swaps do netswap(e[swaps[i][1]+1], e[swaps[i][2]+1]) --if e[swaps[i][1]+1] > e[swaps[i][2]+1] then --e[swaps[i][1]+1], e[swaps[i][2]+1] = e[swaps[i][2]+1], e[swaps[i][1]+1] --end end end function getpivot(r) if r[2]-r[1] <= 18 then return r[1] end local from = {} for i=r[1], r[2]-1, (r[2]-r[1])/9 do from[#from+1]=i//1 end sort9(from) return from[5] end function quickselect(r, k) if k >= r[1] and k <= r[2] then local pivot = selectpartition(r, read(getpivot(r))) if k == pivot then return elseif pivot > k then quickselect({r[1], pivot-1}, k) else quickselect({pivot+1, r[2]}, k) end end end function binarySearch(r, a) local curR = {r[1], r[2]} while curR[1] < curR[2] do local mid = (curR[1]+curR[2])//2 local cur = read(mid) if cur > a then curR[2] = mid else curR[1] = mid+1 end end return curR[1] end function binarySearchLast(r, a) local curR = {r[1], r[2]} while curR[1] < curR[2] do local mid = (curR[1]+curR[2])//2 local cur = read(mid) if cur > a then curR[2] = mid else curR[1] = mid+1 end end --if curR[1] == r[2] and read(curR[1]) <= a then curR[1]=curR[1]+1 end return curR[1] end function buffmerge(buff, r, mid) local p1, p2, i = 0, 0, 0 for j=r[1], mid-1 do swap(buff[1]+j-r[1], j) end while p1 < mid-r[1] and mid+p2 <= r[2] do if read(buff[1]+p1) < read(mid+p2) then swap(buff[1]+p1, r[1]+i) p1=p1+1 else swap(mid+p2, r[1]+i) p2=p2+1 end i=i+1 end while p1 < mid-r[1] do swap(buff[1]+p1, r[1]+i) p1=p1+1 i=i+1 end end function shuffle() for i=1, #arr do swap(i, math.random(1, #arr)) end end step=false init = coroutine.create(function() while true do if not shuffles[curShuf] then break end while true do if not sorts[cur] then break end steps=0 arr={} step=true shuffles[curShuf].func() step=false for i=1, 60 do coroutine.yield() end steps=0 step=true sorts[cur].func() step=false for i=1, #arr do coroutine.yield(arr[i], i) end for i=1, 120 do coroutine.yield() end cur=cur+1 end curShuf=curShuf+1 cur=1 end while true do coroutine.yield() end end) function BOOT() trace("start") end arr={} cur=1 curShuf=1 spd=4 steps = 0 hcols = {2, 10, 4, 6} t=0 function TIC() local hls = {} if shuffles[curShuf] then local ps = {} for i=1, spd do _, ps[i], hls[i] = coroutine.resume(init) if step then steps=steps+1 end end for i=1, spd do if type(ps[i]) == "string" then error(ps[i]) end if ps[i] and ps[i] > 0 then rsfx(ps[i]/#arr*80, 15, i%4) end end end cls(0) local s = w/#arr for i=1, #arr do local col = 12 for j=1, spd do if i == hls[j] then col = hcols[(j-1)%4+1] end end crect(s*(i-1), (1-(arr[i]/#arr))*h, s*(i+1)-1, h, col) end if not shuffles[curShuf] then print("done!", 0, 0, 10) else print(sorts[cur].name.."\n"..shuffles[curShuf].name.." - "..curShuf.."/"..#shuffles.."\nn = "..#arr.."\nsteps = "..steps, 0, 0, 10) end end function crect(x, y, x1, y1, col) tri(x, y, x1, y, x, y1, col) tri(x1, y, x1, y1, x, y1, col) end function rsfx(note, volume, channel) local w = {} t=0 for i=1, 32 do w[i]=((math.sin(t/16*2*math.pi)+1)/2*15+0.5)//1 t=t+1 end local freq = math.floor(math.pow(2, ((note-69)/12))*64*(440/60)*2) if freq > 255*8 then freq = 255*8 end poke(0xFF9C+channel*18, freq%256) poke(0xFF9C+channel*18+1, (volume<<4)+(freq>>8)) local empty = true for i,p in ipairs(w) do if p ~= 0 and p ~= 15 then empty = false end poke4((0xFF9C+channel*18+2)*2+i-1, p) end if empty then poke(0xFF9C+channel*18, 0) poke(0xFF9C+channel*18+1, 0) end end