@name Pianos @persist [Notes Chars Song]:table SNote [Test Clocks Imagine]:string @model models/fishy/furniture/piano.mdl if( first() ){ # SETUP NOTES #================================ P = "gmodtower/lobby/instruments/piano/" for(I=1,5) { ID = (I-1)*7 Notes["C"+I,string] = P+"a"+(ID+1)+".wav" Notes["D"+I,string] = P+"a"+(ID+2)+".wav" Notes["E"+I,string] = P+"a"+(ID+3)+".wav" Notes["F"+I,string] = P+"a"+(ID+4)+".wav" Notes["G"+I,string] = P+"a"+(ID+5)+".wav" Notes["A"+(I+1),string] = P+"a"+(ID+6)+".wav" Notes["B"+(I+1),string] = P+"a"+(ID+7)+".wav" IB = (I-1)*5 Notes["C"+I+"#",string] = P+"b"+(IB+1)+".wav" Notes["D"+I+"#",string] = P+"b"+(IB+2)+".wav" Notes["F"+I+"#",string] = P+"b"+(IB+3)+".wav" Notes["G"+I+"#",string] = P+"b"+(IB+4)+".wav" Notes["A"+(I+1)+"#",string] = P+"b"+(IB+5)+".wav" } Notes["C6",string] = P+"a36.wav" Chars["/1",string] = "C1" Chars["/2",string] = "D1" Chars["/3",string] = "E1" Chars["/4",string] = "F1" Chars["/5",string] = "G1" Chars["/6",string] = "A2" Chars["/7",string] = "B2" Chars["/8",string] = "C2" Chars["/9",string] = "D2" Chars["/0",string] = "E2" Chars["q",string] = "F2" Chars["w",string] = "G2" Chars["e",string] = "A3" Chars["r",string] = "B3" Chars["t",string] = "C3" Chars["y",string] = "D3" Chars["u",string] = "E3" Chars["i",string] = "F3" Chars["o",string] = "G3" Chars["p",string] = "A4" Chars["a",string] = "B4" Chars["s",string] = "C4" Chars["d",string] = "D4" Chars["f",string] = "E4" Chars["g",string] = "F4" Chars["h",string] = "G4" Chars["j",string] = "A5" Chars["k",string] = "B5" Chars["l",string] = "C5" Chars["z",string] = "D5" Chars["x",string] = "E5" Chars["c",string] = "F5" Chars["v",string] = "G5" Chars["b",string] = "A6" Chars["n",string] = "B6" Chars["m",string] = "C6" Chars["!",string] = "C1#" Chars["@",string] = "D1#" Chars["$",string] = "F1#" Chars["%",string] = "G1#" Chars["^",string] = "A2#" Chars["*",string] = "C2#" Chars["(",string] = "D2#" Chars["Q",string] = "F2#" Chars["W",string] = "G2#" Chars["E",string] = "A3#" Chars["T",string] = "C3#" Chars["Y",string] = "D3#" Chars["I",string] = "F3#" Chars["O",string] = "G3#" Chars["P",string] = "A4#" Chars["S",string] = "C4#" Chars["D",string] = "D4#" Chars["G",string] = "F4#" Chars["H",string] = "G4#" Chars["J",string] = "A5#" Chars["L",string] = "C5#" Chars["Z",string] = "D5#" Chars["C",string] = "F5#" Chars["V",string] = "G5#" Chars["B",string] = "A6#" #================================ function playNote( Note:string ) { soundStop(Note) soundPlay(Note,10,Notes[Note,string]) } function playChord( Chord:string ) { foreach( I,Note:string = Chord:explode(" ") ) { playNote( Note ) } } function table string:formatSong() { local T = table() local S = This:replace(" ","") # Get song name local NS = S:find("$name") local NE = S:find("$",NS+4) T["name",string] = S:sub( NS+5,NE-1 ):trim() # Get bpm local BS = S:find("$bpm") local BE = S:find("$",BS+3) T["bpm",number] = S:sub( BS+4,BE-1 ):trim():toNumber() # Get format local FS = S:find("$format") local FE = S:find("$",FS+6) local Format = S:sub( FS+7,FE-1 ):trim():toNumber() T["format",number] = Format # Get song local SS = S:find("$song") local SE = S:find("$",SS+4) local Notes = S:sub( SS+5,SE-1 ):trim() Notes = Notes:replace(" ","") Notes = Notes:replace("+"," ") local XNotes = Notes:explode(",") if( Format ) { foreach(K,N:string = XNotes) { local Formatted = "" if( N:toNumber() == 0 ) { foreach(I,V:string = XNotes[K,string]:explode(" ") ) { Formatted = Formatted+" "+Chars[V,string] } XNotes[K,string] = Formatted:trim() } } } T["song",array] = XNotes return T } function playSong( S:table ) { Song = S SNote = 1 timer("NextNote",0) } function playSong( S:string ) { playSong( S:formatSong() ) } Test = " $name Test Song $bpm 120 $format 0 $song C3+E3+G3, 1, D3+F3#+A4, 1, C5, 1, C1, 1, C5+E5+G5 " Clocks = " $name Clocks | Coldplay $bpm 200 $format 1 $song D,P,o,D,P,o,D,P, S,P,i,S,P,i,S,P, S,P,i,S,P,i,S,P, s,O,i,s,O,i,s,O " Imagine = " $name Imagine | John Lennon $bpm 132 $format 1 $song /1+/0+w, /8, /w+/0, /8, w+/0, /8, /3+w+r, /8, /4+q+e, /8, q+e, /8, q+e, /8, /4+q+e, 0.5,E, 0.5,r, /1+/0+w, /8, w+/0, /8, w+/0, /8, /3+w+r, /8, /4+q+e, /8, q+e, /8, q+e, /8, /4+q+e, 0.5,E, 0.5,r, /1+/0+w, /8, /w+/0, /8, w+/0, /8, /3+w+r, /8, /4+q+e, /8, q+e, /8, q+e, /8, /4+q+e, 0.5,E, 0.5,r, /1+/0+w, /8, w+/0, /8, w+/0, /8, /3+w+r, /8, /4+q+e, /8, q+e, /8, q+e, /8, /4+q+e, 0.5,E, 0.5,r, /1+/0+w, /8, /w+/0, /8, w+/0, /8, /3+w+r, /8, /4+q+e, /8, q+e, /8, q+e, /8, /4+q+e, 0.5,E, 0.5,r, /1+/0+w, /8, w+/0, /8, w+/0, /8, /3+w+r, /8, /4+q+e, /8, q+e, /8, q+e, /8, q+e, /8, t+e+/4, q, t+e, /4+q, t+e+/3, q, t+e, q+/3, t+e+q+/2, /9, t+e+q, /2+/9, t+e+q+/1, /8, t+e+q, /1+/8, r+y+/5, w, r+y, w, r+y+/5, w, t+u, w, y+i+w, 4, t+e+/4, q, t+e, q, r+w+/5, /9, r+w, /9+/5, t+w+/1, /0, r+w, /0, E+W+/3, /0, y+w, /0, t+e+/4, q, t+e, q, r+w+/5, /9, r+w, /9+/5, t+w+/1, /0, r+w, /0, E+W+/3, /0, y+w, /0, t+w+/4, q, t+w, q, r+w+/5, /9, r+w, /9+/5, t+w+/1, /0, r+w, /0, E+W+/3, /0, y+w, /0, t+e+/4, q, t+e, q, r+w+/5, /9, r+w, /9, /4, t+w+/0+/1, /8, /2, /8, /3, /8, /4, /8, /9, /1+/0+w " playSong( Imagine ) } if( clk("NextNote") ) { local SA = Song["song",array] local BPM = Song["bpm",number] playChord( SA[SNote,string] ) SNote++ if( SA:exists(SNote) ) { if( SA[SNote,string]:toNumber() == 0 ) { timer("NextNote", 60 / BPM * 1000 ) } else { timer("NextNote", 60 / BPM * SA[SNote,string]:toNumber() * 1000 ) SNote++ } } }