{{ ┌──────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ Autor: Ingo Kripahle │ │ Copyright (c) 2010 Ingo Kripahle │ │ See end of file for terms of use. │ │ Die Nutzungsbedingungen befinden sich am Ende der Datei │ └──────────────────────────────────────────────────────────────────────────────────────────────────────┘ Informationen : hive-project.de Kontakt : drohne235@googlemail.com System : TriOS Name : StarTracker Chip : Regnatix Typ : Programm Version : 1 Subversion : 1 Funktion : HSS-Player mit LCARS-Oberfläche, Wiedergabe von allen Moduldateien im gleichen Verzeichnis Installation : Folgende Dateien müssen in das Verzeichnis mit den HSS-Dateien kopiert werden: stplay.bin Regnatix-Code, Startdatei stint.bel Bellatrix-Code des Players Komponenten : Bellatrix-Code basiert auf einer Idee und dem Testprogramm "lcars_xga_test" von Rayman. Infos zum Programm von Rayman: http://forums.parallax.com/forums/default.aspx?f=25&m=257204&p=1&ord=a http://rayslogic.com/ Assimilation zum Multiprop-Code: drohne235 Regnatix-Code stplay.spin Regnatix-Code Bellatrix-Code stint.spin Bellatrix-Code Bellatrix-Code stkeyb.spin Bellatrix-Code stvga.spin COG's : 1 Cog Logbuch : 31.01.2009 - aus play.spin eine erste lauffähige version mit startreck-interface erstellt 01.02.2009 - tastenfunktionen 08.08.2009 - anpassung an module welche endflag setzen (player bieb dabei hängen) - ursache: sync wartet obwohl player gestopt hat 01.12.2011 - anpassung an trios - jetzt verwendung einer std.-ios - funktioniert jetzt auch im unterverzeichnis - kosmetische änderungen Kommandoliste : Notizen : }} OBJ ios: "reg-ios" CON _CLKMODE = XTAL1 + PLL16X _XINFREQ = 5_000_000 OS_TIBLEN = 64 'größe des inputbuffers 'definition der interfaceelemente title = 0 footer = 1 button1 = 2 button2 = 3 button3 = 4 button4 = 5 button5 = 6 button6 = 7 button7 = 8 button8 = 9 button9 = 10 corner_topleft = 11 corner_topright = 12 corner_bottomLeft = 13 endcap_med_left = 14 endcap_med_right = 15 endcap_small_left = 16 endcap_small_right = 17 CON 'BELLATRIX-FUNKTIONEN -------------------------------------------------------------------------- ' einzeichen-steuercodes #$0, BEL_CMD 'esc-code für zweizeichen-steuersequenzen BEL_CLS BEL_HOME BEL_POS1 BEL_CURON BEL_CUROFF BEL_SCRLUP BEL_SCRLDOWN BEL_BS BEL_TAB ' zweizeichen-steuersequenzen ' [BEL_CMD][...] #$1, BEL_KEY_STAT BEL_KEY_CODE BEL_SCRCMD 'esc-code für dreizeichen-sequenzen BEL_KEY_SPEC BEL_SCR_LOGO BEL_SCR_CHAR BEL_BLKTRANS #$57, BMGR_LOAD BMGR_WSCR BMGR_DSCR BMGR_GETCOLOR BMGR_SETCOLOR BMGR_GETRESX BMGR_GETRESY BMGR_GETCOLS BMGR_GETROWS BMGR_GETCOGS BMGR_GETSPEC BMGR_GETVER BMGR_REBOOT ' dreizeichen-steuersequenzen ' [BEL_CMD][BEL_SCRCMD][...] #$1, BEL_SETCUR BEL_SETX BEL_SETY BEL_GETX BEL_GETY BEL_SETCOL BEL_SLINE BEL_ELINE BEL_SINIT BEL_TABSET VAR long lcnt 'zeiger für dateiliste byte fn[12] 'puffer für dateinamen byte gcol 'grundfarbe byte cmdstat 'aktuelles kommandobutton byte cmdreload byte cmdnext byte cmdps PUB main | wflag wflag := ios.start 'ios initialisieren ios.belload(string("stint.bel")) 'grafiktreiber laden ios.admsetsyssnd(0) scr_sline(0) frame1 'interface zeichnen cmdstat := 0 cmdps := 0 cmdreload := 0 cmdnext := 0 command repeat playint 'playliste abspielen repeat ios.hss_stop if ios.keystat > 0 command while cmdps 'warten solange stopmodus PUB playint | fnadr,len,fcnt,i 'alle songs auf der sd-card abspielen ios.curhome ios.sddir 'kommando: verzeichnis öffnen startlist 'zum listenanfang fcnt := 0 'zähler für dateianzahl repeat while (fnadr := ios.sdnext) 'dateiliste einlesen if str_find(fnadr,@ext1) printmcnt(++fcnt) wrfn(fnadr) startlist 'zum listenanfang if fcnt repeat i from 0 to fcnt-1 'dateiliste abspielen rdfn(@fn) playsong(@fn) if cmdnext==0 AND cmdps==0 AND cmdreload==0 'ausblenden nur bei playliste fadeout else cmdnext := 0 ios.hss_stop if cmdreload cmdreload := 0 quit if cmdps quit PUB str_find(string1, string2) : buffer | counter 'sys: string suchen repeat strsize(string1--) if(byte[++string1] == byte[string2]) repeat counter from 0 to (strsize(string2) - 1) if(byte[string1][counter] <> byte[string2][counter]) buffer~~ ifnot(buffer~) return string1 PUB playsong(stradr) | n,i,note,okt,vol,fx,ins,rep,cc1,cc2,cc3,cc4,eflag 'spielt einen song ab printsong(stradr) ios.hss_stop ios.hss_playfile(stradr) cc1 := 0 cc2 := 0 cc3 := 0 cc4 := 0 repeat sync 'synchronisation mit beat rep := ios.hss_intreg(ios#iRepeat) 'loopzähler auslesen eflag := ios.hss_intreg(ios#iEndFlag) 'endflag abfragen printrep(rep) 'zähler auf screen aktualisieren if ios.keystat > 0 'tasteneingabe? command repeat i from 1 to 4 'schleife für die vier kanäle note := ios.hss_intreg(i*5+ios#iNote) okt := ios.hss_intreg(i*5+ios#iOktave) vol := ios.hss_intreg(i*5+ios#iVolume) fx := ios.hss_intreg(i*5+ios#iEffekt) ins := ios.hss_intreg(i*5+ios#iInstrument) printchan(33,2+i,note,okt,vol,fx,ins) '---------------------------------------- if note > 0 'bei note bargraph triggern case i 1: cc1 := 1 2: cc2 := 1 3: cc3 := 1 4: cc4 := 1 '---------------------------------------- case i 'numerischen pegelwert ausgeben 1: ios.printhex(cc1,2) 2: ios.printhex(cc2,2) 3: ios.printhex(cc3,2) 4: ios.printhex(cc4,2) if rep == 3 cc1 := 10 cc2 := 10 cc3 := 10 cc4 := 10 bar(8,5 ,button1,0,cc1) 'bargraphen zeichen bar(8,8 ,button2,1,cc2) bar(8,11,button3,2,cc3) bar(8,14,button4,3,cc4) if cc1 < 10 'pegel absenken cc1++ if cc2 < 10 cc2++ if cc3 < 10 cc3++ if cc4 < 10 cc4++ until rep == 3 OR cmdnext OR cmdreload OR cmdps OR eflag == 1 'drei loops, endflag oder kommandos brechen ab PUB command | k 'tastatur abfragen k := ios.key case k 4: if cmdstat > 0 'pfeil hoch cmdstat-- else cmdstat := 3 5: if cmdstat < 3 'pfeil runter cmdstat++ else cmdstat := 0 13: case cmdstat 'eingabetaste 0: if cmdps == 1 cmdps := 0 else cmdps := 1 1: cmdreload := 1 2: cmdnext := 1 3: ios.printcls ios.hss_stop 'hss-player stoppen ios.ram_wrbyte(ios#sysmod,0,ios#SIFLAG)'screeninit für cli aktivieren ios.admsetsyssnd(1) 'systemklänge wieder anschalten ios.sddmact(ios#DM_ROOT) 'suche in root ios.belreset 'systemgrafiktreiber laden ios.stop 'programm beenden case cmdstat 'led-buttons neu zeichen 0: button(8,22,13,button6,1,0,0) button(8,25,13,button7,2,0,0) button(8,28,13,button8,2,0,0) button(8,31,13,button9,2,0,0) 1: button(8,22,13,button6,2,0,0) button(8,25,13,button7,1,0,0) button(8,28,13,button8,2,0,0) button(8,31,13,button9,2,0,0) 2: button(8,22,13,button6,2,0,0) button(8,25,13,button7,2,0,0) button(8,28,13,button8,1,0,0) button(8,31,13,button9,2,0,0) 3: button(8,22,13,button6,2,0,0) button(8,25,13,button7,2,0,0) button(8,28,13,button8,2,0,0) button(8,31,13,button9,1,0,0) PUB sync 'synchronisation mit beat repeat until ios.hss_intreg(ios#iRowFlag) == 0 or ios.hss_intreg(ios#iEndFlag) == 1 repeat until ios.hss_intreg(ios#iRowFlag) == 1 or ios.hss_intreg(ios#iEndFlag) == 1 PUB fadeout | i 'song langsam ausblenden repeat i from 0 to 15 ios.hss_vol(15 - i) if ios.keystat > 0 command waitcnt(cnt + 60_000_000) waitcnt(cnt + 30_000_000) PUB wrfn(stradr) | len,i 'kopiert dateinamen bei lcnt in eram len := strsize(stradr) repeat i from 0 to len-1 ios.ram_wrbyte(ios#usrmod,byte[stradr][i],lcnt++) ios.ram_wrbyte(ios#usrmod,0,lcnt++) PUB rdfn(stradr) | i,n 'liest dateinamen bei lcnt aus eram, lcnt wird dabei erhöht i := 0 repeat n := ios.ram_rdbyte(ios#usrmod,lcnt++) byte[stradr][i++] := n while n <> 0 PUB startlist 'zeiger auf listenanfang (dateinamen) lcnt := 0 PUB printnote(n) 'nummer --> notenzeichen 'C1,C#1,D1,D#1,E1,F1,F#1,G1,G#1,A1,A#1,H1 case n 0: ios.printq(string("▶ ")) 1: ios.printq(string("C ")) 2: ios.printq(string("C• ")) 3: ios.printq(string("D ")) 4: ios.printq(string("D• ")) 5: ios.printq(string("E ")) 6: ios.printq(string("F ")) 7: ios.printq(string("F• ")) 8: ios.printq(string("G ")) 9: ios.printq(string("G• ")) 10: ios.printq(string("A ")) 11: ios.printq(string("A• ")) 12: ios.printq(string("H ")) PUB printmcnt(n) 'ausgabe der anzahl printat(25,13,0,string("Anzahl Dateien : ")) ios.printdec(n) PUB printsong(stradr) 'ausgabe des songnamens printat(25,14,0, string("PlaySong : ")) printat(42,14,0,string(" ")) printat(42,14,0,stradr) dtext(button5,string("____________________")) dtext(button5,stradr) PUB printrep(rep) 'ausgabe der loops printat(25,15,0,string("Repeat : ")) printatdec(42,15,0,rep) PUB printeflag(eflag) 'ausgabe EndFlag printat(25,16,0,string("EndFlag : ")) printatdec(42,16,0,eflag) { PUB printdeb(deb) 'ausgabe debug-marke printat(25,17,0,string("Mark : ")) printatdec(42,17,0,deb) } PUB at(x,y,color) 'cursorposition und farbe setzen ios.cursetx(x) ios.cursety(y) ios.setcolor(color) PUB printat(x,y,color,strptr) 'string bei position mit farbe ausgeben at(x,y,color) ios.print(strptr) PUB printatdec(x,y,color,wert) 'zahl bei position mit farbe ausgeben ios.cursetx(x) ios.cursety(y) ios.setcolor(color) ios.printdec(wert) PUB frame1 | i,sline 'hauptframe zeichnen ios.curoff ios.printcls gcol := 0 sline := 24 ' 64 x 48 - 32,24 dtext(title,string("STARTRACKER ",95," LOADING ...")) 'text in button rendern top(8,sline) 'initiale ladezeile zeichnen ton1 dtext(footer,string("DROHNE235 ",95," 2009 ")) 'restliche buttons rendern dtext(button1,string("ENGINE A ")) dtext(button2,string("ENGINE B ")) dtext(button3,string("ENGINE C ")) dtext(button4,string("ENGINE D ")) dtext(button5,string(" DATEI ")) dtext(button6,string("PLAY ",95," STOP")) dtext(button7,string("RELOAD ")) dtext(button8,string("NEXT SONG ")) dtext(button9,string("QUIT ")) repeat (sline / 2) - 1 'ladezeile nach oben verschieben ios.scrollup waitcnt(cnt + 1_000_000) top(8,2) 'kopfzeile zeichnen ton1 dtext(title,string("STARTRACKER ",95," HIVE-PROJEKT")) repeat i from 0 to 10 'pegel zeichnen 'x,y,nButton,color,pegel bar(8,5 ,button1,0,i) bar(8,8 ,button2,1,i) bar(8,11,button3,2,i) bar(8,14,button4,3,i) ios.sfx_fire($f1,0) waitcnt(cnt + 4_000_000) log2(24,5) 'x,y,len,nButton,col1,col2,col3 'orange=0,blue=1,past=2,purple=3,weiß=4,magenta=5 button(8,22,13,button6,2,0,0) button(8,25,13,button7,2,0,0) button(8,28,13,button8,2,0,0) button(8,31,13,button9,2,0,0) info(25,22,15,button5,0,1) bottom(8,36) PUB info(x,y,len,nButton,col1,col2) 'infobereich zeichnen bmap(endcap_med_left,x,y,1,2,col1) box(x+1,y,2,2,col1,false,false,false) box(x+13,y,len-13,2,col1,false,false,false) bmap(nButton,x+4,y,8,2,col2) bmap(endcap_med_right,x+len,y,1,2,col1) PUB log1(x,y) 'einen vollen logbereich zeichnen 'left,top,width,height,clr,bBottomBreak,bRightBreak,bTrimRight 'top bmap(corner_topleft,x,y,6,2,1) box(x+6,y,8,1,1,false,true,false) box(x+14,y,5,1,2,false,true,false) box(x+19,y,11,1,0,false,true,false) 'middle box(x,y+2,4,1,1,true,false,false) box(x,y+3,4,4,3,true,false,false) box(x,y+7,4,2,0,true,false,false) box(x,y+9,4,5,2,true,false,false) 'box(x,y+4,4,1,1,false,false,false) 'bottom bmap(corner_bottomleft,x,y+14,6,2,1) box(x+6,y+15,3,1,1,false,true,false) box(x+9,y+15,12,1,0,false,true,false) box(x+21,y+15,4,1,2,false,true,false) box(x+25,y+15,5,1,1,false,true,false) PUB log2(x,y) 'einen halben logbereich zeichnen 'left,top,width,height,clr,bBottomBreak,bRightBreak,bTrimRight 'mitte box(x,y,4,1,1,true,false,false) box(x,y+1,4,4,3,true,false,false) box(x,y+5,4,2,0,true,false,false) box(x,y+7,4,5,2,true,false,false) 'box(x,y+4,4,1,1,false,false,false) 'unten bmap(corner_bottomleft,x,y+12,6,2,1) box(x+6,y+13,3,1,1,false,true,false) box(x+9,y+13,12,1,0,false,true,false) box(x+21,y+13,4,1,2,false,true,false) box(x+25,y+13,5,1,1,false,true,false) PUB button(x,y,len,nButton,col1,col2,col3) 'zeichnet schaltfläche box(x,y,1,2,col1,false,false,false) box(x+2,y,len-2,2,col2,false,false,false) bmap(nButton,x+2,y,8,2,col2) bmap(endcap_med_right,x+len,y,1,2,col2) PUB top(x,y) 'zeichnet kopfzeile bmap(title,x+15,y,21,2,gcol) box(x+2,y,12,2,2,false,false,false) box(x+34,y,12,2,2,false,false,false) bmap(endcap_med_left,x,y,1,2,1) bmap(endcap_med_right,x+47,y,1,2,1) PUB bottom(x,y) 'zeichnet kopfzeile bmap(footer,x+2,y,15,2,gcol) box(x+14,y,32,2,2,false,false,false) bmap(endcap_med_left,x,y,1,2,1) bmap(endcap_med_right,x+47,y,1,2,1) PUB bar(x,y,nButton,color,pegel) 'zeichnet einen bargraf bmap(endcap_med_left,x,y,1,2,color) bmap(nButton,x+2,y,pegel,2,gcol) box(x+2+pegel,y,x+4-pegel,2,color,false,false,false) PUB ton1 'ultimativerstartrecksound repeat 4 ios.sfx_fire($f1,0) waitcnt(cnt + 4_000_000) CON 'INTERFACEROUTINEN PUB bmap(nBitmap,xPos,yPos,xSize,ySize,clr) 'screen: 1bit-bitmap zeichnen {{ nBitmap: 0: title 1: footer 2: button1 3: button2 4: button3 5: button4 6: button5 7: corner_topleft 8: corner_topright 9: corner_bottomLeft 10: endcap_med_left 11: endcap_med_right 12: endcap_small_left 13: endcap_small_right }} ios.bus_putchar2(0) ios.bus_putchar2(10) ios.bus_putchar2(nBitmap) ios.bus_putchar2(xPos) ios.bus_putchar2(yPos) ios.bus_putchar2(xSize) ios.bus_putchar2(ySize) ios.bus_putchar2(clr) PUB box(pleft,ptop,pwidth,pheight,pclr,bBottomBreak,bRightBreak,bTrimRight) 'screen: farbige box zeichnen 'blue=1 'purple=3 'orange=0 'red=2 ios.bus_putchar2(0) ios.bus_putchar2(11) ios.bus_putchar2(pleft) ios.bus_putchar2(ptop) ios.bus_putchar2(pwidth) ios.bus_putchar2(pheight) ios.bus_putchar2(pclr) ios.bus_putchar2(bBottomBreak) ios.bus_putchar2(bRightBreak) ios.bus_putchar2(bTrimRight) PUB dtext(nButton,stradr) | nLen 'screen: text in button zeichnen {{Nur Großbuchstaben!}} nLen := strsize(stradr) ios.bus_putchar2(0) ios.bus_putchar2(12) ios.bus_putchar2(nButton) ios.bus_putchar2(nLen) repeat nLen ios.bus_putchar2(byte[stradr++]) PRI printchan(x,y,note,okt,vol,fx,ins) ios.bus_putchar2(0) ios.bus_putchar2(13) ios.bus_putchar2(x) ios.bus_putchar2(y) ios.bus_putchar2(note) ios.bus_putchar2(okt) ios.bus_putchar2(vol) ios.bus_putchar2(fx) ios.bus_putchar2(ins) PUB printctrl(c) 'screen: präfix für steuersequenzen {{printctrl(c) - screen: steuerzeichen von $100 bis $1FF wird an terminal gesendet}} ios.bus_putchar2(BEL_CMD) 'kommandosequenz einleiten ios.bus_putchar2(BEL_SCRCMD) 'code 3 = sonderzeichen senden ios.bus_putchar2(c & $0FF) 'unteres byte senden ' PUB scr_sline(n) 'screen: startzeile scrollbereich setzen {{sline(n) - startzeile scrollbereich setzen}} printctrl(BEL_SLINE) ios.bus_putchar2(n) PUB scr_eline(n) 'screen: endzeile scrollbereich setzen {{sline(n) - endzeile scrollbereich setzen}} printctrl(BEL_ELINE) ios.bus_putchar2(n) DAT ext1 byte ".HSS",0 DAT {{ ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ TERMS OF USE: MIT License │ ├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation │ │files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, │ │modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software│ │is furnished to do so, subject to the following conditions: │ │ │ │The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.│ │ │ │THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE │ │WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR │ │COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, │ │ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ }}