Skip to content

Instantly share code, notes, and snippets.

@wararyo
Created May 25, 2018 07:05
Show Gist options
  • Save wararyo/12127afa05f879d1da06321bb8845f42 to your computer and use it in GitHub Desktop.
Save wararyo/12127afa05f879d1da06321bb8845f42 to your computer and use it in GitHub Desktop.
3D Rhythm Game for Sunaba
/*
#####################################
# CHUNITHMっぽそうでCHUNITHMっぽくない、#
# すこしCHUNITHMっぽい音ゲー ###########
#####################################
# コードの概要 (行頭の数字はコード中のだいたいの位置)
60 Settings ゲームプレイに直接関わる変数群
Camera カメラ設定
Stage ステージ設定
Judgement 判定の設定
80 Constants ゲーム内部で使用する定数
50 Addresses Sunabaであらかじめ用意されているアドレス群
70 User Addresses 自分で定義したアドレス 配列の開始アドレスなど
100 Frequencies 音階と周波数の対応テーブル
120 Color 色
130 Sin Table サイン関数で使用するテーブル 度 100倍された値
230 Digit Tex 数字を描画するときに使う数字のテクスチャ 3x5が10個
320 Functions 静的関数群
Utility 便利関数
Math 数学関連
Sound 音関連
Graphics 2Dグラフィック関連
3DGraphics 3Dグラフィック
610 Classes 構造体定義と、その構造体を使用した関数群
Matrix 4x4行列
Vector3D 三次元ベクトル
Box 三次元の箱
SlideNote ステージに置かれるスライドノート
AirNote ステージに置かれるエアノート
Note 譜面データ中の生のノート SlideNoteまたはAirNoteに変換された後描画
SoundNote 音の方の音符
850 Main メイン部分
1100 Database 楽譜データ
# 3Dのつくりかた
1. 三角関数を作ります
2. 三次元ベクトルを定義します
3. 行列を定義し、行列とベクトルの掛け算をする関数を作ります
4. 三次元ベクトルを足し算・回転させる関数を作ります
5. カメラを作り、ワールド座標をビュー座標にします(この時点で平行投影法での3Dができます)
6. ビューポート・射影変換行列を定義し、それを三次元ベクトルに掛けると完成
*/
##################
# Settings ######
##################
# Camera
const FOV -> 48
const NEAR_Z -> 18
const FAR_Z -> 72
# Stage
const STAGE_WIDTH -> 160
const STAGE_HEIGHT -> 1440
const STAGE_SPANX -> 40 #つまり4レーン
const STAGE_SPANY -> 1152
const STAGE_SPEED -> 13 #SPANとSPEEDから、曲の速さが決まる
# Judgement
const SLIDE_JUDGE_THRESHOLD -> 40 # 3D空間上のXがこれ以上ノートと離れたらFailedCountが進みます
const FAILED_COUNT_THRESHOLD -> 6 # スライドノートはこのフレーム以上ズレたらミスとなります
##################
# Constants ######
##################
const WIDTH -> 100
const HEIGHT -> 100
# Addresses
const DISABLE_AUTOREFRESH -> 55001
const REFRESH -> 55000
const MOUSE_X -> 50000
const MOUSE_Y -> 50001
const MOUSE_LEFT -> 50002
const MOUSE_RIGHT -> 50003
const UP -> 50004
const DOWN -> 50005
const LEFT -> 50006
const RIGHT -> 50007
const SPACE -> 50008
const ENTER -> 50009
const CANVAS_START -> 60000
const FREQ_START -> 55006
const ATTEN_START -> 55009
const VOL_START -> 55012
const OUTPUT_CHAR -> 55002
#User Addresses
const SOUND_CURRENT_CHANNEL -> 19634 # 一番最後に使ったサウンドチャンネルを表すアドレス
memory[SOUND_CURRENT_CHANNEL] -> 0
const CAMERA_POS -> 10000
const CAMERA_ROTATE -> 10003
const DRAWBOX_TEMP -> 12000 # Vector3[8] 24
const ROTATE_VECTOR_3_MATRIX -> 12024 # Matrix 16
const MULTIPLY_BY_MATRIX_VECTOR_3_TEMP -> 12040 # Matrix 16
const PERSP_MATRIX -> 12056 # Matrix 16
const DRAW_LINE_3D_TEMP -> 12072 # Vector3[2] 6
const DRAW_GRID_3D_TEMP -> 12078 # Vector3[2] 6
const DRAW_SLIDENOTE_TEMP -> 12084 # Vector3[4] 12
const DRAW_AIRNOTE_TEMP -> 12096 # Vector3[2] 6
const TESTBOX -> 15000 # Box 10
const CURSORBOX -> 15010 # Box 10
const SLIDE_NOTES -> 15020 # SlideNote[SLIDE_NOTES_LENGTH] 7*16 = 448
const SLIDE_NOTES_LENGTH -> 16 #配列数 アドレスじゃないです
const AIR_NOTES -> 15468 # AirNote[AIR_NOTES_LENGTH] 11*8 = 88
const AIR_NOTES_LENGTH -> 8 #配列数 アドレスじゃないです
const SONG_DATA -> 100 # SoundNote[512] 4*512 = 2048
const SONG_DATA_COUNT -> 99 # ノーツ数を格納するアドレス
const SCORE_DATA_COUNT -> 2148 #ノーツ数を格納するアドレス
const SCORE_DATA -> 2149 # Note[512] 5*512 = 2560
# Frequencies
const SOUND_FREQ -> 19635 # 音階の周波数を表す配列の開始アドレス
SOUND_FREQ[0] -> 523
SOUND_FREQ[1] -> 554
SOUND_FREQ[2] -> 587
SOUND_FREQ[3] -> 622
SOUND_FREQ[4] -> 659
SOUND_FREQ[5] -> 698
SOUND_FREQ[6] -> 740
SOUND_FREQ[7] -> 784
SOUND_FREQ[8] -> 831
SOUND_FREQ[9] -> 880
SOUND_FREQ[10] -> 932
SOUND_FREQ[11] -> 987
# Colors
const WHITE -> 999999
const GRAY -> 606060
const LIGHT_GRAY -> 808080
const BLUE -> 000099
const GREEN -> 009900
const RED -> 990000
const ORANGE -> 998000
const PURPLE -> 902060
# Sin table
const SIN_TABLE_START -> 16431 # サインテーブル開始アドレス
SIN_TABLE_START[0] -> 0
SIN_TABLE_START[1] -> 2
SIN_TABLE_START[2] -> 3
SIN_TABLE_START[3] -> 5
SIN_TABLE_START[4] -> 7
SIN_TABLE_START[5] -> 9
SIN_TABLE_START[6] -> 10
SIN_TABLE_START[7] -> 12
SIN_TABLE_START[8] -> 14
SIN_TABLE_START[9] -> 16
SIN_TABLE_START[10] -> 17
SIN_TABLE_START[11] -> 19
SIN_TABLE_START[12] -> 21
SIN_TABLE_START[13] -> 22
SIN_TABLE_START[14] -> 24
SIN_TABLE_START[15] -> 26
SIN_TABLE_START[16] -> 28
SIN_TABLE_START[17] -> 29
SIN_TABLE_START[18] -> 31
SIN_TABLE_START[19] -> 33
SIN_TABLE_START[20] -> 34
SIN_TABLE_START[21] -> 36
SIN_TABLE_START[22] -> 37
SIN_TABLE_START[23] -> 39
SIN_TABLE_START[24] -> 41
SIN_TABLE_START[25] -> 42
SIN_TABLE_START[26] -> 44
SIN_TABLE_START[27] -> 45
SIN_TABLE_START[28] -> 47
SIN_TABLE_START[29] -> 48
SIN_TABLE_START[30] -> 50
SIN_TABLE_START[31] -> 52
SIN_TABLE_START[32] -> 53
SIN_TABLE_START[33] -> 54
SIN_TABLE_START[34] -> 56
SIN_TABLE_START[35] -> 57
SIN_TABLE_START[36] -> 59
SIN_TABLE_START[37] -> 60
SIN_TABLE_START[38] -> 62
SIN_TABLE_START[39] -> 63
SIN_TABLE_START[40] -> 64
SIN_TABLE_START[41] -> 66
SIN_TABLE_START[42] -> 67
SIN_TABLE_START[43] -> 68
SIN_TABLE_START[44] -> 69
SIN_TABLE_START[45] -> 71
SIN_TABLE_START[46] -> 72
SIN_TABLE_START[47] -> 73
SIN_TABLE_START[48] -> 74
SIN_TABLE_START[49] -> 75
SIN_TABLE_START[50] -> 77
SIN_TABLE_START[51] -> 78
SIN_TABLE_START[52] -> 79
SIN_TABLE_START[53] -> 80
SIN_TABLE_START[54] -> 81
SIN_TABLE_START[55] -> 82
SIN_TABLE_START[56] -> 83
SIN_TABLE_START[57] -> 84
SIN_TABLE_START[58] -> 85
SIN_TABLE_START[59] -> 86
SIN_TABLE_START[60] -> 87
SIN_TABLE_START[61] -> 87
SIN_TABLE_START[62] -> 88
SIN_TABLE_START[63] -> 89
SIN_TABLE_START[64] -> 90
SIN_TABLE_START[65] -> 91
SIN_TABLE_START[66] -> 91
SIN_TABLE_START[67] -> 92
SIN_TABLE_START[68] -> 93
SIN_TABLE_START[69] -> 93
SIN_TABLE_START[70] -> 94
SIN_TABLE_START[71] -> 95
SIN_TABLE_START[72] -> 95
SIN_TABLE_START[73] -> 96
SIN_TABLE_START[74] -> 96
SIN_TABLE_START[75] -> 97
SIN_TABLE_START[76] -> 97
SIN_TABLE_START[77] -> 97
SIN_TABLE_START[78] -> 98
SIN_TABLE_START[79] -> 98
SIN_TABLE_START[80] -> 98
SIN_TABLE_START[81] -> 99
SIN_TABLE_START[82] -> 99
SIN_TABLE_START[83] -> 99
SIN_TABLE_START[84] -> 99
SIN_TABLE_START[85] -> 100
SIN_TABLE_START[86] -> 100
SIN_TABLE_START[87] -> 100
SIN_TABLE_START[88] -> 100
SIN_TABLE_START[89] -> 100
SIN_TABLE_START[90] -> 100
# Digit Tex
const DIGIT_TEXES -> 16522
const DIGIT_TEX_SIZE -> 15
setDigitTex(0,
1,1,1,
1,0,1,
1,0,1,
1,0,1,
1,1,1)
setDigitTex(1,
0,1,0,
0,1,0,
0,1,0,
0,1,0,
0,1,0)
setDigitTex(2,
1,1,1,
0,0,1,
1,1,1,
1,0,0,
1,1,1)
setDigitTex(3,
1,1,1,
0,0,1,
1,1,1,
0,0,1,
1,1,1)
setDigitTex(4,
1,0,1,
1,0,1,
1,1,1,
0,0,1,
0,0,1)
setDigitTex(5,
1,1,1,
1,0,0,
1,1,1,
0,0,1,
1,1,1)
setDigitTex(6,
1,1,1,
1,0,0,
1,1,1,
1,0,1,
1,1,1)
setDigitTex(7,
1,1,1,
0,0,1,
0,0,1,
0,0,1,
0,0,1)
setDigitTex(8,
1,1,1,
1,0,1,
1,1,1,
1,0,1,
1,1,1)
setDigitTex(9,
1,1,1,
1,0,1,
1,1,1,
0,0,1,
1,1,1)
##################
# Functions ######
##################
# System
# Utility
def Print(value)
memory[100000 + value] -> 1
def Color(red,green,blue)
out -> (red * 10000) + (green * 100) + blue
def ColorLerp(from,to,pct)
red -> Lerp(from/10000,to/10000,pct)
green -> Lerp(Mod(from,10000)/100,Mod(to,10000)/100,pct)
blue -> Lerp(Mod(from, 100),Mod(to, 100),pct)
out -> Color(red,green,blue)
def setDigitTex(num,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o)
addr -> DIGIT_TEXES+(DIGIT_TEX_SIZE*num)
addr[0] -> a
addr[1] -> b
addr[2] -> c
addr[3] -> d
addr[4] -> e
addr[5] -> f
addr[6] -> g
addr[7] -> h
addr[8] -> i
addr[9] -> j
addr[10] -> k
addr[11] -> l
addr[12] -> m
addr[13] -> n
addr[14] -> o
# Math
def Abs(value)
out -> value
if value < 0
out -> -value
def Neg(b) # 論理否定
out -> 0
if b = 0
out -> 1
def Mod(value, divider)
while value >= divider
value -> value - divider
out -> value
def Pow(value, index)
i -> 0
out -> 1 #indexが0の時の値だよ
multiplier -> value
if index > 0
while i < (index - 1)
i -> i + 1
value -> value * multiplier
out -> value
if index < 0
out -> 0
def Sin(deg) # 100倍した値です
while deg >= 360
deg -> deg - 360
while deg < 0
deg -> deg + 360
out -> 0
if (0 <= deg) * (deg <= 90)
out -> SIN_TABLE_START[deg]
if (91 <= deg) * (deg <= 180)
out -> SIN_TABLE_START[(180-deg)]
if (181 <= deg) * (deg <= 270)
out -> -SIN_TABLE_START[(deg-180)]
if (271 <= deg) * (deg <= 360)
out -> -SIN_TABLE_START[(360-deg)]
def Cos(deg) # 100倍した値です
out -> Sin(90 - deg)
def Cot(deg) # 100倍した値です
out -> Cos(deg)*100/Sin(deg)
def Lerp(from,to,pct)
out -> from + ((to - from)*pct/100)
# Sound
def PlaySound(freq,atten,vol)
if memory[SOUND_CURRENT_CHANNEL] < 3
memory[SOUND_CURRENT_CHANNEL] -> memory[SOUND_CURRENT_CHANNEL] + 1
if memory[SOUND_CURRENT_CHANNEL] = 3
memory[SOUND_CURRENT_CHANNEL] -> 0
PlaySoundChannel(freq,atten,vol, memory[SOUND_CURRENT_CHANNEL])
def PlaySoundChannel(freq, atten, vol, ch)
# 音割れ防止
memory[FREQ_START + ch] -> 1000
memory[ATTEN_START + ch] -> 100
memory[VOL_START + ch] -> 0
# 音を鳴らすぞ
memory[FREQ_START + ch] -> freq
memory[ATTEN_START + ch] -> atten
memory[VOL_START + ch] -> vol # VOLを設定した瞬間に発音するのでVOLは最後に設定しないとダメ
def PlayNote(noteNo, atten, vol)
#ノートナンバーを音階とオクターブに分解
octave -> 0 # 4オクターブ目(NoteNo.60-71)が0となる
while noteNo < 60
noteNo -> noteNo + 12
octave -> octave - 1
while noteNo > 71
noteNo -> noteNo - 12
octave -> octave + 1
scale -> noteNo - 60
if(octave = 0)
PlaySound (SOUND_FREQ[scale],atten,vol)
if(octave < 0)
PlaySound (SOUND_FREQ[scale]/Pow(2,-octave),atten,vol)
if(octave > 0)
PlaySound (SOUND_FREQ[scale]*Pow(2,octave),atten,vol)
def PlayNoteChannel(noteNo, atten, vol, ch)
#ノートナンバーを音階とオクターブに分解
octave -> 0 # 4オクターブ目(NoteNo.60-71)が0となる
while noteNo < 60
noteNo -> noteNo + 12
octave -> octave - 1
while noteNo > 71
noteNo -> noteNo - 12
octave -> octave + 1
scale -> noteNo - 60
if(octave = 0)
PlaySoundChannel (SOUND_FREQ[scale],atten,vol,ch)
if(octave < 0)
PlaySoundChannel (SOUND_FREQ[scale]/Pow(2,-octave),atten,vol,ch)
if(octave > 0)
PlaySoundChannel (SOUND_FREQ[scale]*Pow(2,octave),atten,vol,ch)
# Graphics
def Fill(color)
i -> 60000
while i < 69999
i -> i + 1
memory[i] -> color
def Pixel(x, y)
out -> CANVAS_START + (100*y) + x
def Plot(x, y, color)
if (0 <= x) * (x < 100) * (0 <= y) * (y < 100)
memory[Pixel(x,y)] -> color
def DrawLine(x0, y0, x1, y1, color) #ブレゼンハムのアルゴリズム
if(x0 > -1000)*(x0 < 1100)*(y0 > -1000)*(y0 < 1100)*(x1 > -1000)*(x1 < 1100)*(y1 > -1000)*(y1 < 1100)
steep -> Abs(y1 - y0) > Abs(x1 - x0)
if steep
#swap(x0, y0)
t -> x0
x0 -> y0
y0 -> t
#swap(x1, y1)
t -> x1
x1 -> y1
y1 -> t
if x0 > x1
#swap(x0, x1)
t -> x0
x0 -> x1
x1 -> t
#swap(y0, y1)
t -> y0
y0 -> y1
y1 -> t
deltax -> x1 - x0
deltay -> Abs(y1 - y0)
error -> deltax / 2
ystep -> 0
y -> y0
if y0 < y1
ystep -> 1
if y0 >= y1
ystep -> -1
x -> x0
while x <= x1 #for x from x0 to x1
x -> x + 1
if steep
Plot(y,x,color)
if Neg(steep)
Plot(x,y,color)
error -> error - deltay
if error < 0
y -> y + ystep
error -> error + deltax
def DrawRect(x0,y0,width,height,color)
y -> y0
y1 -> y0 + height
x1 -> x0 + width
while y <= y1
x -> x0
while x <= x1
Plot(x,y,color)
x -> x + 1
y -> y + 1
def DrawRectCenter(x0,y0,width,height,color)
DrawRect(x0-(width/2),y0-(height/2),width,height,color)
def DrawCircle(x,y,radius,color)
i -> 0
while i < 360
i -> i + 1
Plot(x+(Cos(i)*radius/100),y+(Sin(i)*radius/100),color)
def DrawDigit(x,y,num,color)
x -> x - 3
y -> y - 5
tex -> DIGIT_TEXES+(DIGIT_TEX_SIZE*num)
ty -> 0
while ty < 5
tx -> 0
while tx < 3
if tex[(ty*3)+tx]
Plot(x+tx,y+ty,color)
tx -> tx + 1
ty -> ty + 1
def DrawDigits(x,y,num,color)
first -> 1
while(num > 0)+first
DrawDigit(x,y,Mod(num,10),color)
num -> num / 10
x -> x - 4
first -> 0
# 3DGraphics
# ↑Y軸 /^奥に行くのがZ軸正方向
# *→X軸
newVector3(CAMERA_POS,0,10,-100)
newVector3(CAMERA_ROTATE,0,0,0)
newMatrix(PERSP_MATRIX,
Cot(FOV/2), 0, 0,0,
0, -Cot(FOV/2), 0,0,
0, 0, 100/(FAR_Z - NEAR_Z),0,
0,0,-(100 * NEAR_Z)/(FAR_Z - NEAR_Z),100)
def DrawLine3D(start, end, color) # Vector3のインスタンスを渡してね
s -> DRAW_LINE_3D_TEMP
e -> DRAW_LINE_3D_TEMP + VECTOR3_SIZE
fromToVector3(s,CAMERA_POS,start)
fromToVector3(e,CAMERA_POS,end)
rotateVector3(s,CAMERA_ROTATE[0],CAMERA_ROTATE[1],CAMERA_ROTATE[2])
rotateVector3(e,CAMERA_ROTATE[0],CAMERA_ROTATE[1],CAMERA_ROTATE[2])
Zstart -> s[2]
Zend -> e[2]
#Print(end)
multiplyByMatrixVector3(s,PERSP_MATRIX)
multiplyByMatrixVector3(e,PERSP_MATRIX)
#Print(s[0])
if(Zstart > 0)
s[0] -> s[0]/(Zstart)
s[1] -> s[1]/(Zstart)
if(Zend > 0)
e[0] -> e[0]/(Zend)
e[1] -> e[1]/(Zend)
#Print(start[2])
if(Zstart > 0)+(Zend > 0)
DrawLine(s[0]+50,s[1]+50,e[0]+50,e[1]+50,color)
def DrawGrid3D(centerX,centerZ,spanX,spanZ,sizeX,sizeZ)
s -> DRAW_GRID_3D_TEMP #Vector3
e -> DRAW_GRID_3D_TEMP + VECTOR3_SIZE #Vector3
startX -> centerX - (sizeX/2)
startZ -> centerZ - (sizeZ/2)
endX -> startX + sizeX
endZ -> startZ + sizeZ
x -> startX / spanX * spanX
z -> startZ / spanZ * spanZ
while x <= endX
newVector3(s,x,0,startZ)
newVector3(e,x,0,endZ)
DrawLine3D(s,e,GRAY)
x -> x + spanX
while z <= endZ
newVector3(s,startX,0,z)
newVector3(e,endX,0,z)
DrawLine3D(s,e,GRAY)
z -> z + spanZ
##################
# Classes ########
##################
/*
Matrixオブジェクト
4x4行列です
三次元ベクトルの変形に使用します
*/
const MATRIX_SIZE -> 16
def newMatrix(addr,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p)
addr[0] -> a
addr[1] -> b
addr[2] -> c
addr[3] -> d
addr[4] -> e
addr[5] -> f
addr[6] -> g
addr[7] -> h
addr[8] -> i
addr[9] -> j
addr[10] -> k
addr[11] -> l
addr[12] -> m
addr[13] -> n
addr[14] -> o
addr[15] -> p
/*
Vector3クラス
三次元ベクトルです
*/
const VECTOR3_SIZE -> 3
def newVector3(addr,x,y,z)
addr[0] -> x
addr[1] -> y
addr[2] -> z
def copyVector3(from, to)
to[0] -> from[0]
to[1] -> from[1]
to[2] -> from[2]
def offsetVector3(addr,offset)
addr[0] -> addr[0] + offset[0]
addr[1] -> addr[1] + offset[1]
addr[2] -> addr[2] + offset[2]
def offsetVector3f(addr,x,y,z)
addr[0] -> addr[0] + x
addr[1] -> addr[1] + y
addr[2] -> addr[2] + z
def multiplyVector3(addr, divider)
addr[0] -> addr[0] * divider
addr[1] -> addr[1] * divider
addr[2] -> addr[2] * divider
def divideVector3(addr, divider)
addr[0] -> addr[0] / divider
addr[1] -> addr[1] / divider
addr[2] -> addr[2] / divider
def fromToVector3(addr,from,to)
addr[0] -> to[0] - from[0]
addr[1] -> to[1] - from[1]
addr[2] -> to[2] - from[2]
def multiplyByMatrixVector3(vec,mat)
temp -> MULTIPLY_BY_MATRIX_VECTOR_3_TEMP
temp[0] -> (vec[0]*mat[0])+(vec[1]*mat[1])+(vec[2]*mat[2])+(100*mat[3])
temp[1] -> (vec[0]*mat[4])+(vec[1]*mat[5])+(vec[2]*mat[6])+(100*mat[7])
temp[2] -> (vec[0]*mat[8])+(vec[1]*mat[9])+(vec[2]*mat[10])+(100*mat[11])
vec[0] -> temp[0]
vec[1] -> temp[1]
vec[2] -> temp[2]
#Print (vec[0])
def rotateVector3(addr,x,y,z)
/*newMatrix(ROTATE_VECTOR_3_MATRIX,
(Cos(x)*Cos(y)*Cos(z)/10000)-(Sin(x)*Sin(z)/100), -(Cos(x)*Cos(y)*Sin(z)/10000)-(Sin(x)*Cos(z)/100), Cos(x)*Sin(y)/100,0,
(Sin(x)*Cos(y)*Cos(z)/10000)+(Cos(x)*Sin(z)/100), -(Sin(x)*Cos(y)*Sin(z)/10000)+(Cos(x)*Cos(z)/100), Sin(x)*Sin(y)/100,0,
-Sin(y)*Cos(z)/100 , Sin(y)*Sin(z)/100 , Cos(y), 0,
0,0,0,100)*/
newMatrix(ROTATE_VECTOR_3_MATRIX,
Cos(y)*Cos(z)/100, (Sin(x)*Sin(y)*Cos(z)/10000)+(Cos(x)*Sin(z)/100), -(Cos(x)*Sin(y)*Cos(z)/10000)+(Sin(x)*Sin(z)/100),0,
-Cos(y)*Sin(z)/100, -(Sin(x)*Sin(y)*Sin(z)/10000)+(Cos(x)*Cos(z)/100), (Cos(x)*Sin(y)*Sin(z)/10000)+(Sin(x)*Cos(z)/100),0,
Sin(y) , -Sin(x)*Cos(y)/100 , Cos(x)*Cos(y)/100, 0,
0,0,0,100)
multiplyByMatrixVector3(addr,ROTATE_VECTOR_3_MATRIX)
divideVector3(addr, 100)
def lerpVector3(addr,from,to,pct)
addr[0] -> Lerp(from[0],to[0],pct)
addr[1] -> Lerp(from[1],to[1],pct)
addr[2] -> Lerp(from[2],to[2],pct)
/*
Boxアクター
立方体です
*/
const BOX_SIZE -> 10 # メモリ上の占める領域
def newBox(addr,x,y,z,rotateX,rotateY,rotateZ,scaleX,scaleY,scaleZ,color)
addr[0] -> x
addr[1] -> y
addr[2] -> z
addr[3] -> rotateX
addr[4] -> rotateY
addr[5] -> rotateZ
addr[6] -> scaleX
addr[7] -> scaleY
addr[8] -> scaleZ
addr[9] -> color
def drawBox(addr)
newVector3(DRAWBOX_TEMP + (VECTOR3_SIZE*0),0 + (addr[6]/2),0 + (addr[7]/2),0 + (addr[8]/2))
newVector3(DRAWBOX_TEMP + (VECTOR3_SIZE*1),0 + (addr[6]/2),0 + (addr[7]/2),0 - (addr[8]/2))
newVector3(DRAWBOX_TEMP + (VECTOR3_SIZE*2),0 + (addr[6]/2),0 - (addr[7]/2),0 + (addr[8]/2))
newVector3(DRAWBOX_TEMP + (VECTOR3_SIZE*3),0 + (addr[6]/2),0 - (addr[7]/2),0 - (addr[8]/2))
newVector3(DRAWBOX_TEMP + (VECTOR3_SIZE*4),0 - (addr[6]/2),0 + (addr[7]/2),0 + (addr[8]/2))
newVector3(DRAWBOX_TEMP + (VECTOR3_SIZE*5),0 - (addr[6]/2),0 + (addr[7]/2),0 - (addr[8]/2))
newVector3(DRAWBOX_TEMP + (VECTOR3_SIZE*6),0 - (addr[6]/2),0 - (addr[7]/2),0 + (addr[8]/2))
newVector3(DRAWBOX_TEMP + (VECTOR3_SIZE*7),0 - (addr[6]/2),0 - (addr[7]/2),0 - (addr[8]/2))
i -> 0
while i < 8
rotateVector3(DRAWBOX_TEMP + (VECTOR3_SIZE*i),addr[3],addr[4],addr[5])
offsetVector3(DRAWBOX_TEMP + (VECTOR3_SIZE*i),addr+0)
i -> i + 1
DrawLine3D(DRAWBOX_TEMP+(VECTOR3_SIZE*0),DRAWBOX_TEMP+(VECTOR3_SIZE*1), addr[9])
DrawLine3D(DRAWBOX_TEMP+(VECTOR3_SIZE*2),DRAWBOX_TEMP+(VECTOR3_SIZE*3), addr[9])
DrawLine3D(DRAWBOX_TEMP+(VECTOR3_SIZE*4),DRAWBOX_TEMP+(VECTOR3_SIZE*5), addr[9])
DrawLine3D(DRAWBOX_TEMP+(VECTOR3_SIZE*6),DRAWBOX_TEMP+(VECTOR3_SIZE*7), addr[9])
DrawLine3D(DRAWBOX_TEMP+(VECTOR3_SIZE*1),DRAWBOX_TEMP+(VECTOR3_SIZE*3), addr[9])
DrawLine3D(DRAWBOX_TEMP+(VECTOR3_SIZE*3),DRAWBOX_TEMP+(VECTOR3_SIZE*7), addr[9])
DrawLine3D(DRAWBOX_TEMP+(VECTOR3_SIZE*7),DRAWBOX_TEMP+(VECTOR3_SIZE*5), addr[9])
DrawLine3D(DRAWBOX_TEMP+(VECTOR3_SIZE*5),DRAWBOX_TEMP+(VECTOR3_SIZE*1), addr[9])
DrawLine3D(DRAWBOX_TEMP+(VECTOR3_SIZE*0),DRAWBOX_TEMP+(VECTOR3_SIZE*2), addr[9])
DrawLine3D(DRAWBOX_TEMP+(VECTOR3_SIZE*2),DRAWBOX_TEMP+(VECTOR3_SIZE*6), addr[9])
DrawLine3D(DRAWBOX_TEMP+(VECTOR3_SIZE*6),DRAWBOX_TEMP+(VECTOR3_SIZE*4), addr[9])
DrawLine3D(DRAWBOX_TEMP+(VECTOR3_SIZE*4),DRAWBOX_TEMP+(VECTOR3_SIZE*0), addr[9])
/*
SlideNoteアクター
実際に画面に描画されるスライドノートです
startX 三次元空間でのノートの始点(左右方向) NoteクラスのLaneから計算される
startZ 三次元空間でのノートの始点(奥行) Noteクラスのtimeから計算される
width スライドノートの幅 どうせ1レーンの幅STAGE_SPANXになる
currentZ ノートがプレイ中の時、手前でノートを途切れさせるのに使う 現在のZ
failedCount FAILED_COUNT_THRESHOLD以上になるとミスとなり表示が変わる
*/
const SLIDENOTE_SIZE -> 7
def newSlideNote(addr,startX,startZ,endX,endZ,width,currentZ,failedCount)
addr[0] -> startX
addr[1] -> startZ
addr[2] -> endX
addr[3] -> endZ
addr[4] -> width
addr[5] -> currentZ
addr[6] -> failedCount
def drawSlideNote(addr)
s -> DRAW_SLIDENOTE_TEMP
e -> DRAW_SLIDENOTE_TEMP + VECTOR3_SIZE
ts -> DRAW_SLIDENOTE_TEMP + (VECTOR3_SIZE*2)
te -> DRAW_SLIDENOTE_TEMP + (VECTOR3_SIZE*3)
startZ -> addr[1]
currentZ -> addr[5]
endZ -> addr[3]
newVector3(s,addr[0],0,addr[1])
newVector3(e,addr[2],0,addr[3])
if startZ < currentZ
lerpVector3(s,s,e,(currentZ-startZ*100)/(endZ-startZ))
# 色
color -> ORANGE
if addr[6] > FAILED_COUNT_THRESHOLD
color -> GRAY
# 縦線を描画
DrawLine3D(s,e,color)
copyVector3(s,ts)
copyVector3(e,te)
offsetVector3f(ts,-STAGE_SPANX/2,0,0)
offsetVector3f(te,-STAGE_SPANX/2,0,0)
DrawLine3D(ts,te,color)
offsetVector3f(ts,STAGE_SPANX,0,0)
offsetVector3f(te,STAGE_SPANX,0,0)
DrawLine3D(ts,te,color)
# 横線
newVector3(ts,s[0]-(STAGE_SPANX/2),s[1],s[2])
newVector3(te,s[0]+(STAGE_SPANX/2),s[1],s[2])
DrawLine3D(ts,te,color)
newVector3(ts,e[0]-(STAGE_SPANX/2),e[1],e[2])
newVector3(te,e[0]+(STAGE_SPANX/2),e[1],e[2])
DrawLine3D(ts,te,color)
/*
AirNoteアクター
state: 0でフツウ、1で成功した、2でミスった
*/
const AIRNOTE_SIZE -> 1+10
def newAirNote(addr,X,Y,Z,state)
newBox(addr,X,Y,Z,0,45,45,30,30,30,PURPLE)
addr[10] -> state
def updateAirNote(addr)
addr[3] -> addr[3] + 10
if(addr[10] = 2)
addr[9] -> GRAY
def drawAirNote(addr)
if (addr[10] != 1)
s -> DRAW_AIRNOTE_TEMP
e -> DRAW_AIRNOTE_TEMP + VECTOR3_SIZE
newVector3(s,addr[0],0,addr[2])
if(addr[10] = 0)
DrawLine3D(addr,s,LIGHT_GRAY)
drawBox(addr)
/*
Noteクラス プレイする方の譜面のノート これが直接描画されるわけではなく、SlideNoteやAirNoteに随時変換される
type: 0でスライドノート、1でエアノート、-1でソングエンド
interval: 前のノートから開ける時間 時間は一小節を192とする
startLane: 開始時のレーン番号 左端が0
durationOrY: スライドノート時はノートの長さ、エアノートの場合はY
endLane: スライドノート時のみ使用 終了時のレーン番号
*/
const NOTE_SIZE -> 5
const BAR_DIVISION -> 192 # 一小節を何分割するか
def newNote(addr,type,interval,startLane,durationOrY,endLane)
addr[0] -> type
addr[1] -> interval
addr[2] -> startLane
addr[3] -> durationOrY
addr[4] -> endLane
/*
SoundNoteクラス 鳴らす方の音符
*/
const SOUNDNOTE_SIZE -> 4
def newSoundNote(addr,ch,Z,noteNo,atten,vol)
addr[0] -> ch
addr[1] -> Z
addr[2] -> noteNo
addr[3] -> atten
addr[4] -> vol
##################
# Main ###########
##################
#PlaySound(1000,18,10000)
#PlayNote(55,18,6000)
memory[OUTPUT_CHAR] -> 0x3059
memory[OUTPUT_CHAR] -> 0x3063
memory[OUTPUT_CHAR] -> 0x3054
memory[OUTPUT_CHAR] -> 0x30fc
memory[OUTPUT_CHAR] -> 0x3044
memory[OUTPUT_CHAR] -> 0xff01
#drawBox(15000)
currentX -> 0
currentY -> 0
currentZ -> -STAGE_SPANY*2
TIME -> 0
memory[DISABLE_AUTOREFRESH] -> 1
newVector3(CAMERA_POS,0,100,-360)
newVector3(CAMERA_ROTATE,6,0,0)
newBox(TESTBOX,0,20,0,0,0,0,40,40,40,ORANGE)
newBox(CURSORBOX,0,0,0,0,0,0,STAGE_SPANX,10,20,ORANGE)
loadScore()
loadMusic()
bgColor -> 999999
currentSoundNoteIndex -> 0
currentNoteIndex -> 0
currentSlideNoteIndex -> 0
currentAirNoteIndex -> 0
playingSlideNoteIndex -> 0 #次に控えた、または今演奏しているスライドノート
playingAirNoteIndex -> 0 #次に控えたエアノート
slideNoteOnStageCount -> 0 #ステージ上に存在しているスライドノートの個数
airNoteOnStageCount -> 0 #ステージ上に存在しているエアノートの個数
lastestNoteTime -> 0
loadNewNoteFlag -> 0
songEndZ -> 268435454
scoreReadToEnd -> 0
succeedNoteCount -> 0
failedNoteCount -> 0
comboCount -> 0
maxCombo -> 0
songCursor -> 0
#最初にNoteを6個配置する
i -> 0
while i < 6
n -> SCORE_DATA+(NOTE_SIZE*currentNoteIndex)
if(n[0] = 0) # スライドノートだったら
newSlideNote(SLIDE_NOTES+(SLIDENOTE_SIZE*currentSlideNoteIndex),
0 - (STAGE_WIDTH/2) + (n[2]*STAGE_SPANX) + (STAGE_SPANX/2),
lastestNoteTime + n[1] * STAGE_SPANY / BAR_DIVISION,
0 - (STAGE_WIDTH/2) + (n[4]*STAGE_SPANX) + (STAGE_SPANX/2),
lastestNoteTime + (n[1]+n[3]) * STAGE_SPANY / BAR_DIVISION,
STAGE_SPANX,0,0)
slideNoteOnStageCount -> slideNoteOnStageCount + 1
lastestNoteTime -> lastestNoteTime + n[1] + n[3]
currentSlideNoteIndex -> currentSlideNoteIndex + 1
if(currentSlideNoteIndex = SLIDE_NOTES_LENGTH)
currentSlideNoteIndex -> 0
if(n[0] = 1) # エアノートだったら
newAirNote(AIR_NOTES+(AIRNOTE_SIZE*currentAirNoteIndex),
0 - (STAGE_WIDTH/2) + (n[2]*STAGE_SPANX) + (STAGE_SPANX/2),
n[3],
lastestNoteTime + n[1] * STAGE_SPANY / BAR_DIVISION,
0)
airNoteOnStageCount -> airNoteOnStageCount + 1
currentAirNoteIndex -> currentAirNoteIndex + 1
if(currentAirNoteIndex = SLIDE_NOTES_LENGTH)
currentAirNoteIndex -> 0
currentNoteIndex -> currentNoteIndex + 1
i -> i + 1
isPlaying -> 1
while isPlaying
bgColor -> ColorLerp(0,bgColor,95)
CAMERA_ROTATE[2] -> Lerp(0,CAMERA_ROTATE[2],95)
currentZ -> currentZ + STAGE_SPEED
CAMERA_POS[2] -> currentZ - 360
if(currentZ > songEndZ)
isPlaying -> 0
currentX -> memory[MOUSE_X]-50*160/100
currentY -> HEIGHT - memory[MOUSE_Y]*144/100 - 6
newVector3(CURSORBOX+0,currentX,0,CAMERA_POS[2]+350)
# スライドノート処理
playingSlideNote -> SLIDE_NOTES+(SLIDENOTE_SIZE*playingSlideNoteIndex)
if(playingSlideNote[1] < currentZ)*(currentZ < playingSlideNote[3])
if Abs(Lerp(playingSlideNote[0],playingSlideNote[2],(currentZ-playingSlideNote[1]*100)/(playingSlideNote[3]-playingSlideNote[1])) - currentX) > SLIDE_JUDGE_THRESHOLD
playingSlideNote[6] -> playingSlideNote[6] + 1 #ミス判定を進める
if(slideNoteOnStageCount > 0)*(playingSlideNote[3] < currentZ) # スライドノートをプレイし終わったら
succeed -> playingSlideNote[6] < FAILED_COUNT_THRESHOLD
if succeed # 成功した
comboCount -> comboCount + 1
if comboCount > maxCombo
maxCombo -> comboCount
succeedNoteCount -> succeedNoteCount + 1
#成功エフェクト
bgColor -> 161616
if Neg(succeed)
comboCount -> 0
failedNoteCount -> failedNoteCount + 1
slideNoteOnStageCount -> slideNoteOnStageCount - 1
loadNewNoteFlag -> loadNewNoteFlag + 1
playingSlideNoteIndex -> playingSlideNoteIndex + 1
if(playingSlideNoteIndex = SLIDE_NOTES_LENGTH)
playingSlideNoteIndex -> 0
playingAirNote -> AIR_NOTES+(AIRNOTE_SIZE*playingAirNoteIndex)
if(airNoteOnStageCount > 0)*(playingAirNote[2] < currentZ) #エアノートに当たったら
succeed -> ((currentX-40) < playingAirNote[0])*(playingAirNote[0] < (currentX+40))*((currentY-40) < playingAirNote[1])*(playingAirNote[1] < (currentY+40))
if succeed #成功した
playingAirNote[10] -> 1
comboCount -> comboCount + 1
if comboCount > maxCombo
maxCombo -> comboCount
succeedNoteCount -> succeedNoteCount + 1
#成功エフェクト
bgColor -> currentZ
CAMERA_ROTATE[2] -> Sin(TIME*7) / 3
if Neg(succeed)
playingAirNote[10] -> 2 #ミスった
comboCount -> 0
failedNoteCount -> failedNoteCount + 1
airNoteOnStageCount -> airNoteOnStageCount - 1
loadNewNoteFlag -> loadNewNoteFlag + 1
playingAirNoteIndex -> playingAirNoteIndex + 1
if(playingAirNoteIndex = AIR_NOTES_LENGTH)
playingAirNoteIndex -> 0
while(loadNewNoteFlag > 0)*Neg(scoreReadToEnd)
# 譜面の読み込みを進める
n -> SCORE_DATA+(NOTE_SIZE*currentNoteIndex)
if(n[0] = 0) # スライドノートだったら
newSlideNote(SLIDE_NOTES+(SLIDENOTE_SIZE*currentSlideNoteIndex),
0 - (STAGE_WIDTH/2) + (n[2]*STAGE_SPANX) + (STAGE_SPANX/2),
lastestNoteTime + n[1] * STAGE_SPANY / BAR_DIVISION,
0 - (STAGE_WIDTH/2) + (n[4]*STAGE_SPANX) + (STAGE_SPANX/2),
lastestNoteTime + (n[1]+n[3]) * STAGE_SPANY / BAR_DIVISION,
STAGE_SPANX,0,0)
slideNoteOnStageCount -> slideNoteOnStageCount + 1
lastestNoteTime -> lastestNoteTime + n[1] + n[3]
currentSlideNoteIndex -> currentSlideNoteIndex + 1
if(currentSlideNoteIndex = SLIDE_NOTES_LENGTH)
currentSlideNoteIndex -> 0
if(n[0] = 1) # エアノートだったら
newAirNote(AIR_NOTES+(AIRNOTE_SIZE*currentAirNoteIndex),
0 - (STAGE_WIDTH/2) + (n[2]*STAGE_SPANX) + (STAGE_SPANX/2),
n[3],
lastestNoteTime + n[1] * STAGE_SPANY / BAR_DIVISION,
0)
airNoteOnStageCount -> airNoteOnStageCount + 1
lastestNoteTime -> lastestNoteTime + n[1]
currentAirNoteIndex -> currentAirNoteIndex + 1
if(currentAirNoteIndex = AIR_NOTES_LENGTH)
currentAirNoteIndex -> 0
if(n[0] = -1) # ソングエンドだったら
songEndZ -> lastestNoteTime + n[1] * STAGE_SPANY / BAR_DIVISION + 720
scoreReadToEnd -> 1
currentNoteIndex -> currentNoteIndex + 1
loadNewNoteFlag -> loadNewNoteFlag - 1
playingSlideNote[5] -> currentZ
# ---
Fill(bgColor)
#Plot(50+(Cos(TIME*5)/2),50+(Sin(TIME*3)/2),WHITE)
#memory[TESTBOX+3] -> memory[TESTBOX+3] + 1
#memory[TESTBOX+4] -> memory[TESTBOX+4] + 1
#memory[TESTBOX+5] -> memory[TESTBOX+5] + 1
#TESTBOX[2] -> TESTBOX[2] + 8
#if(currentZ > 0)
# DrawDigits(20,10,currentZ,WHITE)
if isPlaying
DrawDigits(WIDTH-4,10,comboCount,WHITE)
if Neg(isPlaying)
DrawDigits(WIDTH-4,10,maxCombo,WHITE)
DrawDigits(WIDTH-4,16,succeedNoteCount,RED)
DrawDigits(WIDTH-4,22,failedNoteCount,BLUE)
DrawDigits(WIDTH-4,28,succeedNoteCount*100/(succeedNoteCount+failedNoteCount),WHITE)
DrawGrid3D(CAMERA_POS[0],CAMERA_POS[2]+1080,STAGE_SPANX,STAGE_SPANY,STAGE_WIDTH,STAGE_HEIGHT)
i -> 0
while i < SLIDE_NOTES_LENGTH
sn -> SLIDE_NOTES+(SLIDENOTE_SIZE*i)
if(sn[3] > currentZ) #endZ 手前にあるのは描画しない
drawSlideNote(sn)
i -> i + 1
i -> 0
while i < AIR_NOTES_LENGTH
an -> AIR_NOTES+(AIRNOTE_SIZE*i)
if(an[2] > currentZ - STAGE_SPANY) # Z 手前にあるのは描画しない
updateAirNote(an)
drawAirNote(an)
i -> i + 1
drawBox(CURSORBOX)
#drawBox(TESTBOX)
# おとをならす
nextSoundNote -> SONG_DATA + (SOUNDNOTE_SIZE*songCursor)
while (nextSoundNote[1] <= (currentZ+2))*(nextSoundNote[0] >= 0)
PlayNoteChannel(nextSoundNote[2],nextSoundNote[3],6000,nextSoundNote[0])
songCursor -> songCursor + 1
nextSoundNote -> SONG_DATA + (SOUNDNOTE_SIZE*songCursor)
if TIME = 0
PlayNote(75,10,6000)
if TIME = 8
PlayNote(80,10,6000)
if TIME = 16
PlayNote(87,10,6000)
memory[REFRESH] -> 1
TIME -> TIME + 1
#DrawCircle(50,50,10,WHITE)
#memory[50000] -> 0
while 0
Fill(0)
#DrawLine(50+Cos(TIME),50+Sin(TIME),memory[MOUSE_X],memory[MOUSE_Y], 999999)
DrawCircle(50,50,20+(Sin(TIME*8)/10),WHITE)
memory[REFRESH] -> 1
TIME -> TIME + 1
##################
# Database #######
##################
def addNote(type,interval,startLane,durationOrY,endLane)
newNote(SCORE_DATA+(NOTE_SIZE*memory[SCORE_DATA_COUNT]),type,interval,startLane,durationOrY,endLane)
memory[SCORE_DATA_COUNT] -> memory[SCORE_DATA_COUNT] + 1
def loadScore()
# BAR_DIVISIONが192だから16分音符は12、四分音符は48だぜ
memory[SCORE_DATA_COUNT] -> 0
addNote(0,0,2,672,1)
addNote(0,96,0,72,3)
addNote(0,0,3,72,1)
addNote(1,0,1,60,0)
addNote(0,240,3,72,0)
addNote(0,0,0,72,2)
addNote(1,0,2,100,0)
addNote(0,0,2,240,0)
addNote(0,0,0,192,2)
addNote(0,0,1,96,2)
addNote(0,0,1,96,3)
addNote(1,0,3,120,0)
#サビ
addNote(0,384,0,96,2)
addNote(0,96,1,48,3)
addNote(0,48,2,48,0)
addNote(0,48,0,72,2)
addNote(0,0,2,24,1)
addNote(0,0,1,48,3)
addNote(0,0,3,48,2)
addNote(1,0,2,80,0)
addNote(0,96,1,24,1)
addNote(0,24,2,24,2)
addNote(0,24,1,72,1)
addNote(0,0,2,24,2)
addNote(0,0,3,72,2)
addNote(0,0,2,24,0)
addNote(1,0,0,60,0)
addNote(0,144,2,24,2)
addNote(0,0,1,24,1)
addNote(0,0,0,96,2)
addNote(0,0,2,96,3)
addNote(1,0,3,60,0) #エモ地帯
addNote(1,48,2,120,0)
addNote(1,48,0,120,0)
addNote(1,48,1,60,0)
addNote(0,48,1,96,3)
addNote(0,96,3,96,1)
addNote(0,96,3,144,3)
addNote(0,0,3,24,2)
addNote(0,0,2,24,0)
addNote(1,72,1,80,3)
addNote(0,120,2,48,3)
addNote(0,0,3,48,2)
addNote(0,0,2,48,0)
addNote(0,48,1,48,0)
addNote(0,0,0,48,1)
addNote(0,0,1,48,3)
addNote(0,48,3,168,0)
addNote(1,0,0,120,0)
addNote(1,48,2,120,0)
addNote(1,24,3,120,0)
addNote(1,144,1,90,0)
addNote(-1,192,3,100,0)
def addSoundNote(ch,Z,noteNo,atten)
newSoundNote(SONG_DATA+(SOUNDNOTE_SIZE*memory[SONG_DATA_COUNT]),ch,Z,noteNo,atten,6000)
memory[SONG_DATA_COUNT] -> memory[SONG_DATA_COUNT] + 1
def loadMusic()
memory[SONG_DATA_COUNT] -> 0
addSoundNote(0,0,57,8)
addSoundNote(2,0,38,8)
addSoundNote(1,0,42,14)
addSoundNote(0,576,62,8)
addSoundNote(0,1152,69,8)
addSoundNote(0,1440,67,8)
addSoundNote(0,1728,66,8)
addSoundNote(0,2016,67,8)
addSoundNote(1,2304,44,14)
addSoundNote(0,2304,66,8)
addSoundNote(2,2304,37,9)
addSoundNote(0,2736,57,8)
addSoundNote(0,2880,62,8)
addSoundNote(0,3456,66,8)
addSoundNote(1,3456,49,8)
addSoundNote(2,3456,42,9)
addSoundNote(0,3744,64,8)
addSoundNote(0,4032,66,8)
addSoundNote(0,4320,62,16)
addSoundNote(0,4392,64,14)
addSoundNote(0,4464,66,12)
addSoundNote(0,4536,69,11)
addSoundNote(1,4608,55,14)
addSoundNote(2,4608,43,14)
addSoundNote(0,4608,74,11)
addSoundNote(0,4752,72,10)
addSoundNote(0,4896,70,11)
addSoundNote(2,5040,45,14)
addSoundNote(0,5040,69,11)
addSoundNote(1,5040,57,14)
addSoundNote(0,5328,67,11)
addSoundNote(2,5472,38,14)
addSoundNote(1,5472,54,14)
addSoundNote(0,5472,69,9)
addSoundNote(0,6624,62,14)
addSoundNote(0,6696,64,11)
addSoundNote(0,6768,67,11)
addSoundNote(0,6840,70,10)
addSoundNote(0,6912,72,10)
addSoundNote(2,6912,41,14)
addSoundNote(1,6912,53,14)
addSoundNote(0,7056,70,10)
addSoundNote(0,7200,68,11)
addSoundNote(2,7344,43,14)
addSoundNote(0,7344,67,12)
addSoundNote(1,7344,55,14)
addSoundNote(0,7632,65,13)
addSoundNote(1,7776,52,14)
addSoundNote(0,7776,64,9)
addSoundNote(2,7776,36,14)
addSoundNote(0,8496,67,8)
addSoundNote(0,8640,68,8)
addSoundNote(0,8784,67,8)
addSoundNote(0,8928,63,8)
addSoundNote(0,9072,67,8)
addSoundNote(2,9216,43,14)
addSoundNote(1,9216,55,14)
addSoundNote(1,9360,46,8)
addSoundNote(2,9360,43,14)
addSoundNote(1,9504,49,8)
addSoundNote(2,9504,43,14)
addSoundNote(1,9648,55,8)
addSoundNote(2,9648,43,14)
addSoundNote(1,9792,55,14)
addSoundNote(2,9792,43,14)
addSoundNote(2,9936,43,14)
addSoundNote(1,9936,46,8)
addSoundNote(1,10080,49,8)
addSoundNote(2,10080,43,14)
addSoundNote(2,10224,43,14)
addSoundNote(1,10224,55,8)
addSoundNote(0,10368,68,8)
addSoundNote(1,10368,49,14)
addSoundNote(2,10368,37,14)
addSoundNote(1,10512,41,8)
addSoundNote(2,10512,37,14)
addSoundNote(1,10656,44,8)
addSoundNote(2,10656,37,14)
addSoundNote(1,10800,49,8)
addSoundNote(2,10800,37,14)
addSoundNote(1,10944,51,14)
addSoundNote(2,10944,39,14)
addSoundNote(0,10944,70,8)
addSoundNote(2,11088,39,14)
addSoundNote(1,11088,43,8)
addSoundNote(2,11232,39,14)
addSoundNote(1,11232,46,8)
addSoundNote(2,11376,39,14)
addSoundNote(1,11376,51,8)
addSoundNote(0,11664,63,18)
addSoundNote(0,11808,65,18)
addSoundNote(0,11952,67,18)
addSoundNote(0,12096,68,18)
addSoundNote(0,12240,70,18)
addSoundNote(0,12384,72,18)
addSoundNote(0,12528,73,18)
addSoundNote(1,12672,63,18)
addSoundNote(2,12672,39,18)
addSoundNote(0,12672,75,18)
addSoundNote(1,12816,65,18)
addSoundNote(2,12816,41,18)
addSoundNote(0,12816,77,18)
addSoundNote(1,12960,67,18)
addSoundNote(2,12960,43,18)
addSoundNote(0,12960,79,18)
addSoundNote(1,13104,65,18)
addSoundNote(0,13104,77,18)
addSoundNote(2,13104,41,18)
addSoundNote(1,13248,63,17)
addSoundNote(0,13248,75,17)
addSoundNote(2,13248,39,17)
addSoundNote(0,13392,73,16)
addSoundNote(1,13392,61,16)
addSoundNote(2,13392,37,16)
addSoundNote(1,13536,60,16)
addSoundNote(0,13536,72,16)
addSoundNote(2,13536,36,16)
addSoundNote(2,13680,34,15)
addSoundNote(0,13680,70,15)
addSoundNote(1,13680,58,15)
addSoundNote(0,13824,75,10)
addSoundNote(1,13824,44,19)
addSoundNote(2,13824,32,8)
addSoundNote(1,13968,48,19)
addSoundNote(2,13968,44,8)
addSoundNote(1,14112,51,19)
addSoundNote(2,14112,32,8)
addSoundNote(1,14256,44,19)
addSoundNote(2,14256,44,8)
addSoundNote(1,14400,48,19)
addSoundNote(0,14400,80,10)
addSoundNote(2,14400,32,8)
addSoundNote(2,14544,44,8)
addSoundNote(1,14544,51,19)
addSoundNote(2,14688,32,8)
addSoundNote(1,14688,56,19)
addSoundNote(2,14832,44,8)
addSoundNote(1,14832,48,19)
addSoundNote(0,14976,87,11)
addSoundNote(1,14976,56,19)
addSoundNote(2,14976,32,8)
addSoundNote(2,15120,44,8)
addSoundNote(1,15120,48,19)
addSoundNote(0,15264,85,12)
addSoundNote(1,15264,51,19)
addSoundNote(2,15264,32,8)
addSoundNote(2,15408,44,8)
addSoundNote(1,15408,56,19)
addSoundNote(1,15552,51,19)
addSoundNote(0,15552,84,11)
addSoundNote(2,15552,32,8)
addSoundNote(2,15696,44,8)
addSoundNote(1,15696,56,19)
addSoundNote(0,15840,85,12)
addSoundNote(2,15840,32,8)
addSoundNote(1,15840,48,19)
addSoundNote(2,15984,44,8)
addSoundNote(1,15984,51,20)
addSoundNote(0,16128,84,10)
addSoundNote(2,16128,31,9)
addSoundNote(1,16128,53,20)
addSoundNote(2,16272,43,9)
addSoundNote(1,16272,43,21)
addSoundNote(1,16416,46,22)
addSoundNote(2,16416,31,9)
addSoundNote(2,16560,43,9)
addSoundNote(0,16560,77,11)
addSoundNote(1,16560,49,22)
addSoundNote(2,16704,31,9)
addSoundNote(0,16704,80,9)
addSoundNote(1,16704,43,22)
addSoundNote(2,16848,43,9)
addSoundNote(1,16848,55,22)
addSoundNote(2,16992,31,9)
addSoundNote(1,16992,43,21)
addSoundNote(1,17136,53,20)
addSoundNote(2,17136,43,9)
addSoundNote(1,17280,52,20)
addSoundNote(2,17280,36,9)
addSoundNote(1,17424,48,20)
addSoundNote(2,17424,48,9)
addSoundNote(1,17568,43,20)
addSoundNote(2,17568,36,9)
addSoundNote(1,17712,48,19)
addSoundNote(2,17712,48,9)
addSoundNote(0,17856,80,14)
addSoundNote(1,17856,43,19)
addSoundNote(2,17856,36,9)
addSoundNote(2,18000,48,9)
addSoundNote(0,18000,82,13)
addSoundNote(1,18000,52,19)
addSoundNote(1,18144,46,20)
addSoundNote(0,18144,84,12)
addSoundNote(2,18144,36,9)
addSoundNote(2,18288,48,9)
addSoundNote(1,18288,48,20)
addSoundNote(0,18288,85,11)
addSoundNote(1,18432,44,19)
addSoundNote(2,18432,29,9)
addSoundNote(0,18432,84,9)
addSoundNote(1,18576,48,21)
addSoundNote(2,18576,41,9)
addSoundNote(2,18720,29,9)
addSoundNote(1,18720,56,21)
addSoundNote(2,18864,41,9)
addSoundNote(1,18864,48,21)
addSoundNote(0,18864,75,14)
addSoundNote(0,19008,80,9)
addSoundNote(2,19008,29,9)
addSoundNote(1,19008,44,21)
addSoundNote(2,19152,41,9)
addSoundNote(1,19152,56,21)
addSoundNote(2,19296,29,9)
addSoundNote(1,19296,44,21)
addSoundNote(2,19440,41,9)
addSoundNote(1,19440,53,21)
addSoundNote(1,19584,56,21)
addSoundNote(2,19584,29,9)
addSoundNote(1,19728,48,19)
addSoundNote(2,19728,41,9)
addSoundNote(2,19872,29,9)
addSoundNote(1,19872,44,18)
addSoundNote(2,20016,41,9)
addSoundNote(1,20016,48,18)
addSoundNote(1,20160,56,17)
addSoundNote(2,20160,29,9)
addSoundNote(1,20304,48,17)
addSoundNote(2,20304,41,9)
addSoundNote(1,20448,52,17)
addSoundNote(2,20448,28,9)
addSoundNote(0,20448,80,12)
addSoundNote(0,20592,79,11)
addSoundNote(2,20592,40,9)
addSoundNote(1,20592,51,17)
addSoundNote(1,20736,42,17)
addSoundNote(0,20736,78,10)
addSoundNote(2,20736,27,9)
addSoundNote(1,20880,51,18)
addSoundNote(2,20880,39,9)
addSoundNote(1,21024,42,18)
addSoundNote(2,21024,27,9)
addSoundNote(1,21168,46,18)
addSoundNote(2,21168,39,9)
addSoundNote(2,21312,27,9)
addSoundNote(0,21312,89,8)
addSoundNote(1,21312,51,18)
addSoundNote(2,21456,39,9)
addSoundNote(1,21456,46,19)
addSoundNote(1,21600,42,19)
addSoundNote(2,21600,27,9)
addSoundNote(1,21744,46,19)
addSoundNote(2,21744,39,9)
addSoundNote(1,21888,51,18)
addSoundNote(0,21888,87,11)
addSoundNote(2,21888,32,9)
addSoundNote(2,22032,44,9)
addSoundNote(1,22032,44,19)
addSoundNote(1,22176,41,20)
addSoundNote(0,22176,85,10)
addSoundNote(2,22176,32,9)
addSoundNote(2,22320,44,9)
addSoundNote(1,22320,44,20)
addSoundNote(0,22464,84,10)
addSoundNote(1,22464,51,18)
addSoundNote(2,22464,32,9)
addSoundNote(2,22608,44,9)
addSoundNote(1,22608,44,17)
addSoundNote(2,22752,32,9)
addSoundNote(1,22752,51,17)
addSoundNote(0,22752,85,10)
addSoundNote(2,22896,44,9)
addSoundNote(1,22896,52,17)
addSoundNote(2,23040,37,9)
addSoundNote(0,23040,87,10)
addSoundNote(1,23040,53,16)
addSoundNote(2,23184,49,9)
addSoundNote(1,23184,48,18)
addSoundNote(0,23328,80,16)
addSoundNote(2,23328,37,9)
addSoundNote(1,23328,44,19)
addSoundNote(2,23472,49,9)
addSoundNote(0,23472,80,12)
addSoundNote(1,23472,48,20)
addSoundNote(2,23616,37,9)
addSoundNote(1,23616,53,20)
addSoundNote(1,23760,48,21)
addSoundNote(0,23760,77,9)
addSoundNote(2,23760,49,9)
addSoundNote(2,23904,37,9)
addSoundNote(1,23904,53,21)
addSoundNote(2,24048,49,9)
addSoundNote(1,24048,44,21)
addSoundNote(0,24048,82,10)
addSoundNote(2,24192,39,9)
addSoundNote(1,24192,55,21)
addSoundNote(2,24336,51,9)
addSoundNote(1,24336,51,21)
addSoundNote(1,24480,43,21)
addSoundNote(2,24480,39,9)
addSoundNote(2,24624,51,9)
addSoundNote(1,24624,46,20)
addSoundNote(2,24768,39,9)
addSoundNote(1,24768,55,19)
addSoundNote(2,24912,51,9)
addSoundNote(1,24912,51,19)
addSoundNote(1,25056,43,19)
addSoundNote(2,25056,39,9)
addSoundNote(0,25056,84,13)
addSoundNote(1,25200,46,18)
addSoundNote(2,25200,51,9)
addSoundNote(0,25200,85,12)
addSoundNote(0,25344,87,8)
addSoundNote(2,25344,32,9)
addSoundNote(1,25344,48,18)
addSoundNote(1,25488,44,18)
addSoundNote(2,25488,44,9)
addSoundNote(1,25632,48,17)
addSoundNote(2,25632,32,9)
addSoundNote(0,25632,80,14)
addSoundNote(2,25776,44,9)
addSoundNote(0,25776,80,8)
addSoundNote(1,25776,51,18)
addSoundNote(1,25920,44,19)
addSoundNote(2,25920,32,9)
addSoundNote(0,26064,77,13)
addSoundNote(2,26064,44,9)
addSoundNote(1,26064,48,19)
addSoundNote(2,26208,32,9)
addSoundNote(1,26208,51,19)
addSoundNote(0,26352,82,12)
addSoundNote(2,26352,44,9)
addSoundNote(1,26352,44,19)
addSoundNote(2,26496,34,9)
addSoundNote(1,26496,51,19)
addSoundNote(2,26640,46,9)
addSoundNote(1,26640,43,19)
addSoundNote(0,26640,84,12)
addSoundNote(0,26784,82,11)
addSoundNote(2,26784,34,9)
addSoundNote(1,26784,46,19)
addSoundNote(1,26928,45,19)
addSoundNote(0,26928,81,10)
addSoundNote(2,26928,33,8)
addSoundNote(1,27072,42,18)
addSoundNote(2,27216,45,9)
addSoundNote(1,27216,50,18)
addSoundNote(1,27360,42,18)
addSoundNote(0,27360,77,19)
addSoundNote(2,27360,33,9)
addSoundNote(0,27504,79,15)
addSoundNote(1,27504,45,18)
addSoundNote(2,27504,45,9)
addSoundNote(2,27648,37,9)
addSoundNote(1,27648,41,18)
addSoundNote(0,27648,80,14)
addSoundNote(1,27792,49,18)
addSoundNote(0,27792,79,13)
addSoundNote(2,27792,49,9)
addSoundNote(1,27936,56,17)
addSoundNote(2,27936,37,9)
addSoundNote(0,27936,77,12)
addSoundNote(1,28080,49,17)
addSoundNote(2,28080,49,9)
addSoundNote(0,28080,80,10)
addSoundNote(1,28224,41,17)
addSoundNote(2,28224,37,9)
addSoundNote(1,28368,56,17)
addSoundNote(2,28368,49,9)
addSoundNote(2,28512,37,9)
addSoundNote(1,28512,44,17)
addSoundNote(0,28512,80,19)
addSoundNote(2,28656,49,8)
addSoundNote(1,28656,49,17)
addSoundNote(0,28656,80,17)
addSoundNote(1,28800,43,17)
addSoundNote(2,28800,39,9)
addSoundNote(0,28800,82,14)
addSoundNote(1,28944,51,17)
addSoundNote(2,28944,51,9)
addSoundNote(0,28944,80,12)
addSoundNote(1,29088,58,17)
addSoundNote(0,29088,79,11)
addSoundNote(2,29088,39,9)
addSoundNote(0,29232,82,10)
addSoundNote(1,29232,51,17)
addSoundNote(2,29232,51,9)
addSoundNote(1,29376,43,17)
addSoundNote(2,29376,39,9)
addSoundNote(2,29520,51,9)
addSoundNote(1,29520,58,18)
addSoundNote(2,29664,39,9)
addSoundNote(1,29664,51,17)
addSoundNote(0,29664,82,14)
addSoundNote(2,29808,51,8)
addSoundNote(1,29808,46,17)
addSoundNote(0,29808,82,12)
addSoundNote(0,29952,84,11)
addSoundNote(1,29952,44,17)
addSoundNote(2,29952,41,9)
addSoundNote(2,30096,53,9)
addSoundNote(1,30096,48,17)
addSoundNote(0,30240,80,17)
addSoundNote(2,30240,41,9)
addSoundNote(1,30240,53,16)
addSoundNote(0,30384,82,10)
addSoundNote(1,30384,48,16)
addSoundNote(2,30384,53,9)
addSoundNote(2,30528,41,9)
addSoundNote(1,30528,44,15)
addSoundNote(1,30672,53,14)
addSoundNote(2,30672,53,9)
addSoundNote(0,30672,83,14)
addSoundNote(1,30816,44,14)
addSoundNote(2,30816,41,9)
addSoundNote(2,30960,43,8)
addSoundNote(0,30960,84,12)
addSoundNote(1,30960,49,12)
addSoundNote(0,31248,85,18)
addSoundNote(1,31248,49,12)
addSoundNote(2,31248,43,8)
addSoundNote(1,31392,49,15)
addSoundNote(0,31392,84,19)
addSoundNote(2,31392,43,14)
addSoundNote(0,31680,82,18)
addSoundNote(0,31824,80,16)
addSoundNote(0,31968,79,14)
addSoundNote(0,32112,82,12)
addSoundNote(2,32256,32,8)
addSoundNote(1,32256,51,8)
addSoundNote(0,32256,82,10)
addSoundNote(0,32544,80,8)
addSoundNote(-1,7488,92,8)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment