Paste Search Dynamic
Recent pastes
Midi MusicBox
  1. #                  Designed by
  2. #                    _____                _            
  3. #                   |  __               | |          
  4. #                   | |  | |  __ _  _ __ | | __  _  _
  5. #                   | |  | | / _` || '__|| |/ /| | | |
  6. #                   | |__| || (_| || |   |   < | |_| |
  7. #                   |_____/  __,_||_|   |_|_ __, |
  8. #                                                __/ |
  9. #                                                |___/
  10. #                                
  11. #                        https://steamcommunity.com/id/dark80dark/
  12. # Code - Asummonster
  13. @name Midi MusicBox
  14. @inputs [A B C D E F G H EGP ProgressBar DHDD]:wirelink  Reset  [EGPEntity Ent ToWorld]:entity DHDD_Data:array
  15. @outputs Play Sheets2Play:array Buffer:table Speed_Multiply SongsCount Duration Page Buttons:table Privacy PageTotal Spinning:angle Spin LastTiming Shuffle Repeat DHDD_toWrite:array DHDD_AllowWrite FileList:table DHDD_Dump:array Owners:table
  16. @persist LoadingComplete NotifyPipeline:table DSGroup:string Radio_Enabled Scroll_StopOn Speed_Multiply SongsCount OwnersCount OwnerInfo:string OnPageNames:table Duration Page PageTotal LastSelected_Page DHDD_Cache:array First FLASHMODE MOD_MENU FLASHMODEFIRST FileListTemp:array Shuffle DHDD_Data:array Repeat LastSelected:string LastSelectedPos:vector2 Notes:table Path:string Sheets:string LastTiming Instruments:array CurrInstr Privacy Buffer:table Tempo FileList:table Buttons:table ButtonsSongs:table Volume PlayStat DHDD_Dump:array Owners:table
  17. if (first() | dupefinished()) {
  18.     Scroll_StopOn = 30
  19.     EGP:egpClear()
  20.     EGP:egpBox(1, vec2(256), vec2(512))
  21.     EGP:egpColor(1, vec(40))
  22.     EGP:egpText(2, "Loading...", vec2(256))
  23.     EGP:egpAlign(2, 1, 1)
  24.     EGP:egpSize(2, 65)
  25.     EGP:egpText(3, "Please wait", vec2(256, 296))
  26.     EGP:egpAlign(3, 1, 1)
  27.     EGP:egpSize(3, 30)
  28.     EGP:egpText(4, "The more songs the longer loading", vec2(256, 326))
  29.     EGP:egpAlign(4, 1, 1)
  30.     EGP:egpSize(4, 30)
  31.     EGP:egpBox(6, vec2(256, 370), vec2(404, 39))
  32.     EGP:egpColor(6, vec())
  33.     FileList = table()
  34.     First = 0
  35.     DHDD_Cache = DHDD_Data
  36.     Speed_Multiply = DHDD_Data[1488, string]:toNumber()
  37.     SongsCount = DHDD_Data[1489, string]:toNumber()
  38.     OwnersCount = DHDD_Data[1600, string]:toNumber()
  39.     OwnerInfo = DHDD_Data[1600+OwnersCount, string]
  40.     DHDD_toWrite = DHDD_Data
  41.     timer("loadlist", 10)
  42.     runOnFile(1)
  43.     runOnList(1)
  44.     runOnChat(1)
  45. }
  46. if (clkName()=="loadlist") {
  47.     if (EGP:egpPos(255)!=vec2(-1)) {reset()}
  48.     EGP:egpBox(5, vec2(56+((FileList:count()/2)*(400/SongsCount)), 370), vec2(FileList:count()*(400/SongsCount), 35))
  49.     EGP:egpColor(5, vec(120))
  50.     EGP:egpText(7, FileList:count()+"/"+SongsCount, vec2(256, 370))
  51.     EGP:egpAlign(7, 1, 1)
  52.     EGP:egpSize(7, 25)
  53.     EGP:egpColor(7, vec(250,128,0))
  54.     foreach (DHDD_Cell_Address, DHDD_Cell:string = DHDD_Cache) {
  55.         if (DHDD_Cell_Address>SongsCount) {break}
  56.         DHDD_DC = jsonDecode(DHDD_Cell)
  57.         FileName = DHDD_DC["name", string]
  58.         FileName = FileName:replace("_", " ")
  59.         FileName = FileName:replace(".mid", "")
  60.         FileName = FileName:replace(".midi", "")
  61.         FileName = FileName:sub(0, FileName:length()-4)
  62.         FileDuration = DHDD_DC["duration", number]
  63.         DC_Sheets = DHDD_DC["music", string]
  64.         FileList[FileName, table] = table(
  65.             "duration" = FileDuration,
  66.             "music" = DC_Sheets
  67.         )
  68.         Iteration = 1
  69.         DHDD_Cache:remove(DHDD_Cell_Address)
  70.         break
  71.     }
  72.     if (!Iteration) {
  73.         LoadingComplete = 1
  74.     }else {
  75.         timer("loadlist", 0.01*ops())
  76.     }
  77. }
  78. if (LoadingComplete & !First){
  79.     Volume = DHDD_Data[1490, string]:toNumber()
  80.     Privacy = DHDD_Data[1491, string]:toNumber()
  81.     DSGroup = DHDD_Data[1500, string]
  82.     First = 1
  83.     Page = 1
  84.     PageTotal = ceil(FileList:count()/6)
  85.    
  86.     ProgressBar:egpClear()
  87.     ProgressBar:egpDrawTopLeft(1)
  88.     ProgressBar:egpBox(1, vec2(), vec2(512))
  89.     ProgressBar:egpColor(1, vec(100))
  90.    
  91.     function array encodeString(Str:string)
  92.     {
  93.         local Arr = array()
  94.         for (N = 1, Str:length())
  95.         {
  96.             Arr:insertNumber(Arr:count()+1, toByte(Str, N))
  97.         }
  98.         return Arr
  99.     }
  100.     function string decodeString(Arr:array)
  101.     {
  102.         local Str = ""
  103.         for (N = 1, Arr:count())
  104.         {
  105.             Str+=toChar(Arr:number(N))
  106.         }
  107.         return Str
  108.     }
  109.     function string safeStringEncode(Str:string)
  110.     {
  111.         return vonEncode(encodeString(Str))
  112.     }
  113.     function string safeStringDecode(Str:string)
  114.     {
  115.         return decodeString(vonDecode(Str))
  116.     }
  117.     function addToDHDD(Str:string) {
  118.         DHDD_Dump = DHDD_Data
  119.         DHDD_Dump:insertString(DHDD_Dump:count()+1, Str)
  120.         DHDD_AllowWrite=1
  121.         timer("completewriteoperation", 100)
  122.     }
  123.     function writeToAddress(Address, Data:string) {
  124.         DHDD_Dump = DHDD_Data
  125.         DHDD_Dump[Address, string] = Data
  126.         DHDD_AllowWrite=1
  127.         timer("completewriteoperation", 100)
  128.     }
  129.     if (OwnersCount==0) {
  130.         OwnersCount++
  131.         OwnerInfo=safeStringEncode(owner():steamID()+" ; "+owner():name())
  132.         writeToAddress(1600, OwnersCount:toString())
  133.         writeToAddress(1600+OwnersCount, OwnerInfo)
  134.     }
  135.     local OWInfoArr = safeStringDecode(OwnerInfo):explode(" ; ")
  136.     local SID = OWInfoArr:string(1)
  137.     if (SID!=owner():steamID()) {
  138.         OwnersCount++
  139.         OwnerInfo=safeStringEncode(owner():steamID()+" ; "+owner():name())
  140.         writeToAddress(1600, OwnersCount:toString())
  141.         writeToAddress(1600+OwnersCount, OwnerInfo)
  142.     }
  143.     function number getDuration(Str:string) {
  144.         ExplodeResult = Str:explode("n")
  145.         LastLine = ExplodeResult[ExplodeResult:count()-1, string]
  146.         return LastLine:matchFirst("%d*.%d*"):toNumber()
  147.     }
  148.     function clearButtonsByType(Target:string) {
  149.         ButtonsSongs:clear()
  150.     }
  151.     function printOwners() {
  152.         local Buff = ""
  153.         for (Pointer = 1601, 1600+OwnersCount) {
  154.             Buff+=safeStringDecode(DHDD_Data:string(Pointer))+" -> "
  155.         }
  156.         print(Buff)
  157.     }
  158.     function redrawSoundBar() {
  159.         EGP:egpBox(255, vec2(256, 447), vec2(410, 30))
  160.         EGP:egpColor(255, vec(100))
  161.         EGP:egpBox(256, vec2(56+Volume*404/200, 447), vec2(404/100*Volume, 24))
  162.         EGP:egpColor(256, vec(220, 220, 220))
  163.         if(Volume==0){
  164.             EGP:egpText(298,"Muted",vec2(256,445))
  165.             EGP:egpSize(298,25)
  166.             EGP:egpAlign(298,1,1)
  167.         }else{
  168.             EGP:egpRemove(298)
  169.  
  170.         }
  171.     }
  172.     function redrawProgressBar() {
  173.         ProgressBar:egpBox(2, vec2(4), vec2(504 / Duration * LastTiming, 504))
  174.         ProgressBar:egpColor(2, vec(220))
  175.     }
  176.     function visPrivacyStatus() {
  177.         if (Privacy==1) {
  178.             EGP:egpSetText(229, "Privacy Mode")
  179.         }
  180.         else {
  181.             EGP:egpSetText(229,"Public Mode")
  182.         }
  183.     }
  184.     function processNamesScrolling() {
  185.         if (FLASHMODE) {return}
  186.         foreach (ID, Obj:table = OnPageNames) {
  187.             ObjID = ID:toNumber()
  188.             if (Obj["NeedScroll", number]) {
  189.                 if (Obj["CurChar", number]<Obj["StopOn", number]) {
  190.                     Obj["CurChar", number] = Obj["CurChar", number] + 1
  191.                 }else {
  192.                     Obj["CurChar", number] = 0
  193.                 }
  194.                 EGP:egpText(ObjID, Obj["Text", string]:sub(Obj["CurChar", number], Obj["CurChar", number]+Scroll_StopOn), Obj["Pos", vector2])
  195.                 EGP:egpAlign(ObjID, 1, 1)
  196.                 EGP:egpColor(ObjID, vec(255))
  197.                 EGP:egpSize(ObjID, 30)
  198.             }
  199.         }
  200.         timer("processscrolling", 350)
  201.     }
  202.     function string string:readLineR() {
  203.         NL = This:find("n")
  204.         Str = This:sub(1, NL)
  205.         Sheets = This:sub(NL+1, This:length())
  206.         return Str
  207.     }
  208.     function string string:readLine() {
  209.         NL = This:find("n")
  210.         Str = This:sub(1, NL)
  211.         return Str
  212.     }
  213.     function setPlayingNow(Center:vector2) {
  214.         EGP:egpPos(228, Center)    
  215.     }
  216.     function createButton(LeftTopPos:vector2, RightBottomPos:vector2, Center:vector2, Callback:string, Type:string) {
  217.         if (Type=="song") {
  218.             ButtonsSongs[ButtonsSongs:count()+1, table] = table(
  219.                 "LT" = LeftTopPos,
  220.                 "RB" = RightBottomPos,
  221.                 "CB" = Callback,
  222.                 "Center" = Center,
  223.                 "Type" = Type
  224.             )
  225.         }else {
  226.             Buttons[Buttons:count()+1, table] = table(
  227.                 "LT" = LeftTopPos,
  228.                 "RB" = RightBottomPos,
  229.                 "CB" = Callback,
  230.                 "Center" = Center,
  231.                 "Type" = Type
  232.             )
  233.         }
  234.     }
  235.     function radioSend(Event:string, Data:number) {
  236.         dsSend(Event, DSGroup, 2, Data)
  237.     }
  238.     function radioSend(Event:string, Data:table) {
  239.         dsSend(Event, DSGroup, 2, Data)
  240.     }
  241.     function radioSend(Event:string, Data:string) {
  242.         dsSend(Event, DSGroup, 2, Data)
  243.     }
  244.     function wirelink:drawSelector() {
  245.        
  246.         StartFrom = Page*6-5
  247.         IterationCounter = 0
  248.         ObjID=2
  249.         YStart=50
  250.         clearButtonsByType("song")
  251.         OnPageNames:clear()
  252.         stoptimer("processscrolling")
  253.         for (TempID=2, 20) {
  254.             EGP:egpPos(TempID, vec2(1000))
  255.         }
  256.         foreach(Name, Data:table = FileList) {
  257.             IterationCounter++
  258.             if (IterationCounter<StartFrom) {continue}
  259.  
  260.             if (IterationCounter>StartFrom+5) {
  261.                 break
  262.             }
  263.            
  264.             ObjID++
  265.             This:egpBox(ObjID, vec2(256, YStart), vec2(444, 44))
  266.             This:egpColor(ObjID, vec(250,128,0))
  267.            
  268.             ObjID++
  269.             This:egpBox(ObjID, vec2(256, YStart), vec2(440, 40))
  270.             This:egpColor(ObjID, vec(80))
  271.            
  272.             ObjID++
  273.             This:egpText(ObjID, Name, vec2(256, YStart))
  274.             This:egpAlign(ObjID, 1, 1)
  275.             This:egpColor(ObjID, vec(255))
  276.             This:egpSize(ObjID, 30)
  277.             OnPageNames[ObjID:toString(), table] = table(
  278.                 "NeedScroll" = (Name:length()/Scroll_StopOn+2>1),
  279.                 "CurChar" = 0,
  280.                 "StopOn" = Name:length()-Scroll_StopOn+3,
  281.                 "Text" = Name,
  282.                 "Pos" = vec2(256, YStart)
  283.             )
  284.             createButton(vec2(256-(444/2), YStart-(44/2)), vec2(256+(444/2), YStart+(44/2)), vec2(256, YStart), "play||"+Name, "song")
  285.            
  286.             YStart+=50
  287.         }
  288.         processNamesScrolling()
  289.     }
  290.    
  291.     function wirelink:egpInitSelector() {
  292.         This:egpClear()
  293.         This:egpBox(1, vec2(256), vec2(512))
  294.         This:egpColor(1, vec(40))
  295.        
  296.         This:egpRoundedBox(228, vec2(1024), vec2(488, 36))
  297.         This:egpColor(228, vec(200,98,0))
  298.        
  299.        
  300.         #privacy
  301.         This:egpText(229,"", vec2(256, 490))
  302.         This:egpAlign(229,1,1)
  303.         This:egpSize(229,30)
  304.         createButton(vec2(256-90, 480-35), vec2(256+90, 480+35), vec2(256, 480), "privacy||changeprivacy", "controls")
  305.        
  306.         #soundControls
  307.         EGP:egpText(120,httpUrlDecode(""),vec2(256,355))
  308.         EGP:egpAlign(120, 1, 1)
  309.         EGP:egpSize(120,150)
  310.         createButton(vec2(256-35, 380-35), vec2(256+35, 380+35), vec2(256, 380), "playpause||changeplay", "controls")
  311.        
  312.        
  313.         EGP:egpText(121, httpUrlDecode("%E2%86%BB"), vec2(256-75,385))
  314.         EGP:egpAlign(121, 1, 1)
  315.         EGP:egpSize(121, 75)
  316.         createButton(vec2(256-75,385)+vec2(-35), vec2(256-75,385)+vec2(35), vec2(256-75,385), "repeat||", "controls")
  317.        
  318.         EGP:egpBox(156, vec2(256-130,385), vec2(50))
  319.         EGP:egpMaterial(156, "nxrp/icons8_64t/icons8-radio-tower-64.png")
  320.         createButton(vec2(256-130,385)+vec2(-25), vec2(256-130,385)+vec2(25), vec2(256-130,385), "radio||", "controls")
  321.        
  322.        
  323.        
  324.         EGP:egpText(125, httpUrlDecode("%E2%86%98"), vec2(256+75,385))
  325.         EGP:egpAlign(125, 1, 1)
  326.         EGP:egpSize(125, 75)
  327.         EGP:egpAngle(125,7)        
  328.         EGP:egpText(122, httpUrlDecode("%E2%86%97"), vec2(256+75,385))
  329.         EGP:egpAlign(122, 1, 1)
  330.         EGP:egpSize(122, 75)
  331.         createButton(vec2(256+75,385)+vec2(-35), vec2(256+75,385)+vec2(35), vec2(256+75,385), "shuffle||", "controls")
  332.         EGP:egpAngle(122,-7)        
  333.         ##Pages
  334.        
  335.         EGP:egpText(123, httpUrlDecode("%E2%87%A6"), vec2(256-195,365))
  336.         EGP:egpAlign(123, 1, 1)
  337.         EGP:egpSize(123, 75)
  338.         createButton(vec2(256-195,365)+vec2(-35), vec2(256-195,365)+vec2(35), vec2(256-195,365), "page||prev", "controls")
  339.        
  340.        
  341.         EGP:egpText(124, httpUrlDecode("%E2%87%A8"), vec2(256+195,365))
  342.         EGP:egpAlign(124, 1, 1)
  343.         EGP:egpSize(124, 75)
  344.         createButton(vec2(256+195,365)+vec2(-35), vec2(256+195,365)+vec2(35), vec2(256+195,365), "page||next", "controls")
  345.  
  346.  
  347.        
  348.  
  349.        
  350.         This:egpText(257, "-",vec2(25, 447))
  351.         This:egpAlign(257,1,1)
  352.         This:egpSize(257,30)
  353.         createButton(vec2(25-13, 447-13), vec2(25+13, 447+13), vec2(45, 457), "volumechange||hush", "controls")
  354.                
  355.         This:egpText(258, "+",vec2(487, 447))
  356.         This:egpAlign(258,1,1)
  357.         This:egpSize(258,30)
  358.         createButton(vec2(487-13, 447-13), vec2(487+13, 447+13), vec2(487, 447), "volumechange||louder", "controls")
  359.        
  360.         This:egpBox(135, vec2(8, 504), vec2(16))
  361.         This:egpMaterial(135, "icon16/cd_burn.png")
  362.         createButton(vec2(8-8, 504-8), vec2(8+8, 504+8), vec2(8, 504), "flashmode||enable", "controls")
  363.        
  364.        
  365.         ButtonsBackup = Buttons
  366.        
  367.         This:drawSelector()
  368.        
  369.        
  370.         #Cursor
  371.         This:egpCircle(295, vec2(), vec2(7))
  372.         This:egpColor(295, vec(200,98,0))
  373.         This:egpCircle(297, vec2(), vec2(4))
  374.         This:egpColor(297, vec(0, 98, 200))
  375.         This:egpParent(297, 295)
  376.         This:egpParentToCursor(295)
  377.        
  378.         This:egpCircle(296, vec2(), vec2(8))
  379.         This:egpColor(296, vec(40))
  380.        
  381.     }
  382.     Path = "gmodtower/lobby/instruments/piano/"
  383.     Instruments = array(A, B, C, D, E, F, G, H)
  384.     Notes = table(
  385.         "1" = "a1","2" = "a2","3" = "a3","4" = "a4","5" = "a5","6" = "a6","7" = "a7","8" = "a8","9" = "a9","0" = "a10","q" = "a11","w" = "a12","e" = "a13","r" = "a14","t" = "a15","y" = "a16","u" = "a17","i" = "a18","o" = "a19","p" = "a20","a" = "a21","s" = "a22","d" = "a23","f" = "a24","g" = "a25","h" = "a26","j" = "a27","k" = "a28","l" = "a29","z" = "a30","x" = "a31","c" = "a32","v" = "a33","b" = "a34","n" = "a35","m" = "a36",
  386.         "!" = "b1","@" = "b2","$" = "b3","%" = "b4","^" = "b5","*" = "b6","(" = "b7","Q" = "b8","W" = "b9","E" = "b10","T" = "b11","Y" = "b12","I" = "b13","O" = "b14","P" = "b15","S" = "b16","D" = "b17","G" = "b18","H" = "b19","J" = "b20","L" = "b21","Z" = "b22","C" = "b23","V" = "b24","B" = "b25"
  387.     )
  388.     function setAccord(Accord:string) {
  389.        
  390.         for (I=1, Accord:length()) {
  391.             CurrInstr++
  392.             if (CurrInstr==Instruments:count()+1) {CurrInstr=1}
  393.             for (A=1, 8) {
  394.                 NT = Accord:sub(I, I)
  395.                 if (Buffer[CurrInstr, string] == NT) {
  396.                     CurrInstr++
  397.                     if (CurrInstr==Instruments:count()+1) {CurrInstr=1}
  398.                 }
  399.                 else {break}
  400.             }
  401.             if (Notes[Accord:sub(I, I), string] != "") {
  402.                 Instruments[CurrInstr, wirelink]["SampleName", string] = Path + Notes[Accord:sub(I, I), string] + ".wav"
  403.                 Buffer[CurrInstr, string] = Accord:sub(I, I)
  404.             }
  405.         }
  406.     }
  407.     function setVolume(Num) {
  408.         foreach (K, Wire:wirelink = Instruments) {
  409.             Wire["Volume", number] = Num
  410.         }
  411.     }
  412.     function files(Num:number){
  413.         fileLoad("e2synth/"+FileListTemp[Num, string])
  414.     }
  415.     foreach (K, Wire:wirelink = Instruments) {
  416.         Wire["A", number] = 1
  417.     }
  418.     function processPlay() {
  419.         local Pl = Sheets:readLineR()
  420.         local PlNext = Sheets:readLine()
  421.         Gey = Pl:explode(" ")
  422.         Gey2 = PlNext:explode(" ")
  423.         Timing = Gey2[1, string]:toNumber()
  424.         TimingPl = (Timing - LastTiming) * Tempo
  425.         LastTiming = Timing
  426.         Sheet = Gey[2, string]
  427.         setAccord(Sheet)
  428.         timer("2play", TimingPl)
  429.         Play = 1
  430.     }
  431.     function beginPlay(Sheets:string) {
  432.         Tempo = Sheets:readLineR():explode("|TEMPO|")[1, string]:toNumber() / Speed_Multiply * 3.5
  433.         if (!Tempo) {Tempo=1000/Speed_Multiply}
  434.         processPlay()
  435.     }
  436.     function processCallbacks(Callback:string, ButtonPos:vector2) {
  437.         #print(Callback)
  438.         CMDS = Callback:explode("||")
  439.         Cmd = CMDS:string(1)
  440.         Args = CMDS:string(2)
  441.         if (FLASHMODE) {
  442.             if (EGPEntity!=owner()) {return}
  443.             switch (Cmd) {
  444.                 case "reboot_normal",
  445.                     reset()
  446.                 break
  447.                 case "boost",
  448.                     if (Args=="plus") {
  449.                         Speed_Multiply+=0.05
  450.                     }elseif (Args=="minus") {
  451.                         Speed_Multiply-=0.05
  452.                     }
  453.                     EGP:egpText(11, "Boost "+Speed_Multiply, vec2(256, 370))
  454.                     writeToAddress(1488, Speed_Multiply:toString())
  455.                 break
  456.             }
  457.         }else {
  458.             switch (Cmd) {
  459.                 case "play",
  460.                     if (Privacy==1 & EGPEntity!=owner()) {return}
  461.                     setPlayingNow(ButtonPos)
  462.                     PlayStat = 1
  463.                     EGP:egpText(120,httpUrlDecode("%E2%8F%B8"),vec2(256,355))
  464.                     Music = FileList[Args, table]["music", string]
  465.                     Duration = FileList[Args, table]["duration", number]
  466.                     LastSelected = Music
  467.                     LastSelectedPos = ButtonPos
  468.                     LastSelected_Page = Page
  469.                     EGP:egpColor(123, vec(255))
  470.                     EGP:egpColor(124, vec(255))
  471.                     radioSend("play", table(
  472.                         "music" = Music,
  473.                         "duration" = Duration,
  474.                         "volume" = Volume,
  475.                         "speed" = Speed_Multiply
  476.                     ))
  477.                     beginPlay(Music)
  478.                 break
  479.                 case "volumechange",
  480.                     if (Privacy==1 & EGPEntity!=owner()) {return}
  481.                     if (Args=="louder") {
  482.                         if (Volume<100) {
  483.                             Volume+=10
  484.                         }
  485.                     }elseif (Args=="hush") {
  486.                         if (Volume>0) {
  487.                             Volume-=10
  488.                         }
  489.                     }
  490.                     writeToAddress(1490, Volume:toString())
  491.                     setVolume(Volume/100)
  492.                     redrawSoundBar()
  493.                     radioSend("volume", Volume)
  494.                 break
  495.                 case "privacy",
  496.                     if (EGPEntity==owner()) {
  497.                         Privacy = !Privacy
  498.                         writeToAddress(1491, Privacy:toString())
  499.                         visPrivacyStatus()
  500.                     }
  501.                 break
  502.                 case "playpause",
  503.                     if (Privacy==1 & EGPEntity!=owner()) {return}
  504.                     PlayStat = !PlayStat
  505.                     if (!PlayStat) {
  506.                         EGP:egpText(120,httpUrlDecode("%E2%96%B6"),vec2(260,370))
  507.                         stoptimer("2play")
  508.                     }else {
  509.                         EGP:egpText(120,httpUrlDecode("%E2%8F%B8"),vec2(256,355))
  510.                         timer("2play", TimingPl)
  511.                     }
  512.                     radioSend("pause", PlayStat)
  513.                 break
  514.                 case "shuffle",
  515.                     if (Privacy==1 & EGPEntity!=owner()) {return}
  516.                     Shuffle = !Shuffle
  517.                     if (Shuffle) {
  518.                         EGP:egpColor(122, vec(200,98,0))
  519.                         EGP:egpColor(125, vec(150,58,0))
  520.                         if (Repeat) {
  521.                             Repeat = !Repeat
  522.                             EGP:egpColor(121, vec(255))
  523.                         }
  524.                     }else {
  525.                         EGP:egpColor(122, vec(255))
  526.                         EGP:egpColor(125, vec(125))
  527.                     }
  528.                 break
  529.                 case "repeat",
  530.                     if (Privacy==1 & EGPEntity!=owner()) {return}
  531.                     Repeat = !Repeat
  532.                     if (Repeat) {
  533.                         EGP:egpColor(121, vec(200,98,0))
  534.                         if (Shuffle) {
  535.                             Shuffle = !Shuffle
  536.                             EGP:egpColor(122, vec(255))
  537.                             EGP:egpColor(125, vec(125))
  538.                         }
  539.                     }else {
  540.                         EGP:egpColor(121, vec(255))
  541.                     }
  542.                 break
  543.                 case "page",
  544.                     if (Privacy==1 & EGPEntity!=owner()) {return}
  545.                     if (Args=="prev" & Page>1) {
  546.                         Page-=1
  547.                     }elseif (Args=="next" & (Page+1<=PageTotal)) {
  548.                         Page+=1
  549.                     }
  550.                     if (!LastSelected | LastTiming==0) {
  551.                         LastSelectedPos = vec2(1024)
  552.                         LastSelected_Page = Page
  553.                     }
  554.                     if (Page==LastSelected_Page) {
  555.                         setPlayingNow(LastSelectedPos)
  556.                         EGP:egpColor(123, vec(255))
  557.                         EGP:egpColor(124, vec(255))
  558.                     }elseif (Page>LastSelected_Page) {
  559.                         EGP:egpColor(123, vec(200,98,0))
  560.                         EGP:egpColor(124, vec(255))
  561.                         setPlayingNow(vec2(1024))
  562.                     }elseif (Page<LastSelected_Page) {
  563.                         EGP:egpColor(124, vec(200,98,0))
  564.                         EGP:egpColor(123, vec(255))
  565.                         setPlayingNow(vec2(1024))
  566.                     }
  567.                     EGP:drawSelector()
  568.                 break
  569.                 case "flashmode",
  570.                     if (EGPEntity!=owner()) {return}
  571.                     FLASHMODE = 1
  572.                 break
  573.                 case "radio",
  574.                     if (Privacy==1 & EGPEntity!=owner()) {return}
  575.                     Radio_Enabled=!Radio_Enabled
  576.                     if (Radio_Enabled) {
  577.                         dsJoinGroup(DSGroup)
  578.                         dsSetScope(2)
  579.                         runOnSignal("play", 2, 1)
  580.                         runOnSignal("volume", 2, 1)
  581.                         runOnSignal("pause", 2, 1)
  582.                         EGP:egpColor(156, vec(200,98,0))
  583.                     }else {
  584.                         dsLeaveGroup(DSGroup)
  585.                         dsSetScope(0)
  586.                         runOnSignal("play", 2, 0)
  587.                         runOnSignal("volume", 2, 0)
  588.                         runOnSignal("pause", 2, 0)
  589.                         EGP:egpColor(156, vec(255))
  590.                     }
  591.                 break
  592.             }
  593.         }
  594.     }
  595.     function processTouch(Cursor:vector2) {
  596.         for (I = 1, Buttons:count()) {
  597.             ButtonObj=Buttons[I, table]
  598.             if (inrange(Cursor, ButtonObj["LT", vector2], ButtonObj["RB", vector2])) {
  599.                 processCallbacks(ButtonObj["CB", string], ButtonObj["Center", vector2])
  600.                 break
  601.                 return
  602.             }
  603.         }
  604.         for (I = 1, ButtonsSongs:count()) {
  605.             ButtonObj=ButtonsSongs[I, table]
  606.             if (inrange(Cursor, ButtonObj["LT", vector2], ButtonObj["RB", vector2])) {
  607.                 processCallbacks(ButtonObj["CB", string], ButtonObj["Center", vector2])
  608.                 break
  609.             }
  610.         }
  611.     }
  612.     if (!FLASHMODE) {
  613.         EGP:egpInitSelector()
  614.         redrawSoundBar()
  615.         visPrivacyStatus()
  616.     }
  617. }
  618. if (FLASHMODE & !FLASHMODEFIRST) {
  619.     stoptimer("processscrolling")
  620.     Buttons:clear()
  621.     ButtonsSongs:clear()
  622.    
  623.     FLASHMODEFIRST = 1
  624.     print("FLASHMODE ENABLED")
  625.    
  626.     EGP:egpClear()
  627.     EGP:egpBox(1, vec2(256), vec2(512))
  628.     EGP:egpColor(1, vec(0, 91, 124))
  629.     EGP:egpText(2, "FLASH MODE", vec2(256, 170))
  630.     EGP:egpSize(2, 50)
  631.     EGP:egpAlign(2, 1, 1)
  632.    
  633.     EGP:egpText(3, "Press the button below for load in normal mode", vec2(256, 210))
  634.     EGP:egpAlign(3, 1, 1)
  635.     EGP:egpSize(3, 25)
  636.    
  637.     EGP:egpBox(4, vec2(256), vec2(140, 55))
  638.     EGP:egpColor(4, vec(213, 209, 202))
  639.    
  640.     EGP:egpText(5, "Reload", vec2(256))
  641.     EGP:egpAlign(5, 1, 1)
  642.     EGP:egpColor(5, vec(1, 188, 198))
  643.     EGP:egpSize(5, 40)
  644.     createButton(vec2(256)-vec2(70, 26), vec2(256)+vec2(70, 26), vec2(256), "reboot_normal", "controls")
  645.    
  646.     EGP:egpBox(10, vec2(256, 355), vec2(274, 89))
  647.     EGP:egpBox(9, vec2(256, 355), vec2(270, 85))
  648.     EGP:egpColor(9, vec(0, 91, 124))
  649.    
  650.     EGP:egpText(6, "Overclocking", vec2(256, 330))
  651.     EGP:egpAlign(6, 1, 1)
  652.     EGP:egpColor(6, vec(1, 188, 198))
  653.     EGP:egpSize(6, 30)
  654.     EGP:egpText(11, "Boost "+Speed_Multiply, vec2(256, 370))
  655.     EGP:egpAlign(11, 1, 1)
  656.     EGP:egpColor(11, vec(188, 1, 198))
  657.     EGP:egpSize(11, 30)
  658.    
  659.     EGP:egpBox(7, vec2(140, 330), vec2(40))
  660.     EGP:egpMaterial(7, "icon16/cancel.png")
  661.     createButton(vec2(140, 330)-vec2(20), vec2(140, 330)+vec2(20), vec2(140, 330), "boost||minus", "controls")
  662.    
  663.    
  664.     EGP:egpBox(8, vec2(372, 330), vec2(40))
  665.     EGP:egpMaterial(8, "icon16/add.png")
  666.     createButton(vec2(372, 330)-vec2(20), vec2(372, 330)+vec2(20), vec2(372, 330), "boost||plus", "controls")
  667.    
  668.    
  669.    
  670.     ProgressBar:egpClear()
  671.     ProgressBar:egpBox(1, vec2(), vec2(512))
  672.     ProgressBar:egpMaterial(1, "phoenix_storms/stripes_dimage.png")
  673.    
  674.    
  675.     stoptimer("2play")
  676.     fileList("e2synth/")
  677. }
  678. switch (clkName()) {
  679.     case "2play",
  680.         if (!FLASHMODE) {
  681.             processPlay()
  682.         }
  683.     break
  684.     case "completewriteoperation",
  685.         DHDD_toWrite = DHDD_Dump
  686.         timer("closestream", 100)
  687.     break
  688.     case "showchat",
  689.         hideChat(0)
  690.     break
  691.     case "closestream",
  692.         DHDD_AllowWrite = 0
  693.     break
  694.     case "processscrolling",
  695.         processNamesScrolling()
  696.     break
  697. }
  698. if (fileListClk()) {
  699.     FileListTemp = fileReadList()
  700.     print(_HUD_PRINTCONSOLE, "|| Type !flash <index> for flash additional midi to DHDD")
  701.     for (ID=1, FileListTemp:count()) {
  702.         FileName = FileListTemp:string(ID)
  703.         print(_HUD_PRINTCONSOLE, "|| ["+ID+"] :: "+FileName)
  704.         #print(FileName, ID)
  705.     }
  706. }
  707. if (chatClk() & FLASHMODE) {
  708.     CMD = lastSaid():explode(" ")
  709.     switch (CMD:string(1)) {
  710.         case "!flash",
  711.             hideChat(1)
  712.             print(lastSaid())
  713.             timer("showchat", 100)
  714.             files(CMD[2, string]:toNumber())
  715.         break
  716.         case "clear",
  717.             AllowWrite = 1
  718.             Clear = 1
  719.         break
  720.     }
  721. }
  722. if (fileClk()) {
  723.     File=fileRead()
  724.     print(fileName(), getDuration(File))
  725.     print("Files count ", SongsCount, SongsCount+1)
  726.     writeToAddress(1489, (SongsCount+1):toString())
  727.     addToDHDD(jsonEncode(table(
  728.         "name" = fileName():sub(9),
  729.         "duration" = getDuration(File),
  730.         "music" = File
  731.     )))
  732. }
  733. if (Reset && Ent==owner()) {reset()}
  734. if (changed(EGPEntity) & EGPEntity & First) {
  735.     CursorPos = EGP:egpCursor(EGPEntity)
  736.     #print(CursorPos)
  737.     processTouch(CursorPos)
  738. }
  739.  
  740. if (dsClk()) {
  741.     switch (dsClkName()) {
  742.         case "play",
  743.             DSData = dsGetTable()
  744.             Music = DSData["music", string]
  745.             Duration = DSData["duration", number]
  746.             Volume = DSData["volume", number]
  747.             Speed_Multiply = DSData["speed", number]
  748.             LastSelected = Music
  749.             PlayStat=1
  750.             EGP:egpText(120,httpUrlDecode("%E2%8F%B8"),vec2(256,355))
  751.             beginPlay(Music)
  752.             setVolume(Volume)
  753.             redrawSoundBar()
  754.         break
  755.         case "volume",
  756.             Volume = dsGetNumber()
  757.             setVolume(Volume)
  758.             redrawSoundBar()
  759.         break
  760.         case "pause",
  761.             PlayStat = dsGetNumber()
  762.             if (!PlayStat) {
  763.                 EGP:egpText(120,httpUrlDecode("%E2%96%B6"),vec2(260,370))
  764.                 stoptimer("2play")
  765.             }else {
  766.                 EGP:egpText(120,httpUrlDecode("%E2%8F%B8"),vec2(256,355))
  767.                 timer("2play", TimingPl)
  768.             }
  769.         break
  770.     }
  771. }
  772.  
  773. if(PlayStat & !FLASHMODE){
  774.     ProgressBar:egpBox(2, vec2(4), vec2(504 / Duration * LastTiming, 504))
  775.     ProgressBar:egpColor(2, vec(220))
  776.     Spin+=10
  777.     Spinning=ToWorld:toWorld(ang(0,-90,Spin))
  778. }
  779. if (FLASHMODE) {
  780.     timer("gimbal", 10)
  781.     Play = 1
  782.     Spin-=10
  783.     Spinning=ToWorld:toWorld(ang(Spin,Spin,Spin))
  784. }
  785. if (LastTiming==0 & !FLASHMODE) {
  786.     if (Repeat) {
  787.         PlayStat = 1
  788.         radioSend("play", table(
  789.             "music" = Music,
  790.             "duration" = Duration,
  791.             "volume" = Volume,
  792.             "speed" = Speed_Multiply
  793.         ))
  794.         beginPlay(LastSelected)
  795.     }
  796.     elseif (Shuffle) {
  797.         RandInt = randint(FileList:count())
  798.         IterationPointer = 0
  799.         foreach (Name, File:table = FileList) {
  800.             IterationPointer++
  801.             if (IterationPointer==RandInt) {
  802.                 PlayStat = 1
  803.                 EGP:egpText(120,httpUrlDecode("%E2%8F%B8"),vec2(256,355))
  804.                 Music = File["music", string]
  805.                 Duration = File["duration", number]
  806.                 LastSelected = Music
  807.                 beginPlay(Music)
  808.             }
  809.         }
  810.     }else {
  811.         EGP:egpPos(228, vec2(10000))
  812.         PlayStat = 0
  813.         EGP:egpText(120,httpUrlDecode("%E2%96%B6"),vec2(260,370))
  814.     }
  815. }
  816. if (chatClk() & lastSaid()=="!secstats") {printOwners()}
Parsed in 0.043 seconds