Welcome, Guest. Please login or register.


Author Topic: MIDI to BASIC (Read 8459 times)

Offline ergoGnomik

  • EP lover
  • *
  • Posts: 938
  • Country: hu
  • Stray cat from Commodore alley
  • OS:
  • Windows NT 10.0 Windows NT 10.0
  • Browser:
  • Chrome 79.0.3945.131 Chrome 79.0.3945.131
    • View Profile
Re: MIDI to BASIC
« Reply #15 on: 2020.January.20. 12:28:49 »
Köszi, nagyjából értem...
A bájtok legfelső bitje mindig jelző bit, a tárolt érték kiszámításában nem játszik szerepet. Ha az értéke 1, akkor az adott bájt feldolgozása után még nem értünk az érték beolvasásának végére. Ha az értéke 0, akkor az adott bájt feldolgozása után elértük az érték beolvasásának végét.

Valami hasonló algoritmust lehet elképzelni:
  • Nullázzuk az értéket tároló változót. (pl.: LET VALUE = 0)
  • Beolvassuk a soronkövetkező bájtot. (pl.: beolvassuk a MIDIBYTE nevű változóba)
  • Ha nagyobb az értéke 127-nél, akkor a tárolt értéket megszorozzuk 128-cal és hozzáadjuk az alsó hét bit értékét. (pl.: LET VALUE = VALUE * 128 + MIDIBYTE - 128)
  • Ha kisebb az értéke 128-nál, akor a tárolt értéket megszorozzuk 128-cal és hozzáadjuk az alsó hét bit értékét. (pl.: LET VALUE = VALUE * 128 + MIDIBYTE)
  • Ha nagyobb az értéke 127-nél akkor folytatjuk a 2. ponttól.
  • Kész.

Offline ergoGnomik

  • EP lover
  • *
  • Posts: 938
  • Country: hu
  • Stray cat from Commodore alley
  • OS:
  • Windows NT 10.0 Windows NT 10.0
  • Browser:
  • Chrome 79.0.3945.131 Chrome 79.0.3945.131
    • View Profile
Re: MIDI to BASIC
« Reply #16 on: 2020.February.06. 13:33:14 »
Olvastam a Videoton TVC témában, hogy sikeresen megoldottad a MIDI->TVC BASIC konverziót. Akkor sikerült használni a legutóbb általam javasolt módszert, vagy külső segítséget vontál be?

Offline szipucsu

  • EP addict
  • *
  • Posts: 8517
  • Country: hu
  • OS:
  • Windows NT 10.0 Windows NT 10.0
  • Browser:
  • Chrome 79.0.3945.130 Chrome 79.0.3945.130
    • View Profile
    • Webnyelv.hu - Tanuljunk nyelveket!
Re: MIDI to BASIC
« Reply #17 on: 2020.February.06. 18:43:48 »
sikerült használni a legutóbb általam javasolt módszert, vagy külső segítséget vontál be?
Még mindig csak az egy bájttal leírható hanghosszúságokkal ügyködtem. Még nem próbáltam ki a módszered, de már nagyon érik. Még csak azon morfondíroztam, hogy akár nagyobb 127-nél, akár kisebb 128-nál az a bizonyos érték, akkor is meg kell szorozni a tárolt értéket 128-cal, és hozzá kell adni az alsó 7 bájt értékét, mindkettőhöz ezt írtad. Csak az előbbi esetben ki kell vonni belőle 128-at, az utóbbi esetben nem. Majd megpróbálom nemsokára bevinni ezt a programba, ha meg nem megy, majd írok megint ide.
100 SOUND SOURCE 3,STYLE 16,LEFT 16,RIGHT 64,SYNC 2
110 SOUND SOURCE 2,STYLE 128,PITCH 25.2,SYNC 2
120 SOUND PITCH 25,SYNC 2
Videos

Offline ergoGnomik

  • EP lover
  • *
  • Posts: 938
  • Country: hu
  • Stray cat from Commodore alley
  • OS:
  • Windows 7/Server 2008 R2 Windows 7/Server 2008 R2
  • Browser:
  • Firefox 52.0 Firefox 52.0
    • View Profile
Re: MIDI to BASIC
« Reply #18 on: 2020.February.06. 21:46:48 »
Még csak azon morfondíroztam, hogy ...
Jól van, látom figyelsz! :smt023

Offline szipucsu

  • EP addict
  • *
  • Posts: 8517
  • Country: hu
  • OS:
  • Windows 7/Server 2008 R2 Windows 7/Server 2008 R2
  • Browser:
  • Firefox 72.0 Firefox 72.0
    • View Profile
    • Webnyelv.hu - Tanuljunk nyelveket!
Re: MIDI to BASIC
« Reply #19 on: 2020.February.06. 22:22:38 »
Jól van, látom figyelsz! :smt023
Figyelek, csak iszonyat nehezen fogja fel az agyam ezeket a bináris dolgokat. Pedig amúgy biztos tök egyszerű. A négyszínű karakteres módnál is ez volt. Még mindig nem teljesen értem, hogy ha a jelzőbiten kívül mindegyik bit értéke nulla, akkor hogy lesz abból 128, hiszen a jelzőbit az csak jelez. De mindegy, nem is fontos, a lényeg, hogy működjön majd a programban a cucc! :D
100 SOUND SOURCE 3,STYLE 16,LEFT 16,RIGHT 64,SYNC 2
110 SOUND SOURCE 2,STYLE 128,PITCH 25.2,SYNC 2
120 SOUND PITCH 25,SYNC 2
Videos

Offline ergoGnomik

  • EP lover
  • *
  • Posts: 938
  • Country: hu
  • Stray cat from Commodore alley
  • OS:
  • Windows 7/Server 2008 R2 Windows 7/Server 2008 R2
  • Browser:
  • Opera 12.18 Opera 12.18
    • View Profile
Re: MIDI to BASIC
« Reply #20 on: 2020.February.07. 06:05:05 »
Egyébként lehet még egyszerűsíteni rajta. ;)

Offline szipucsu

  • EP addict
  • *
  • Posts: 8517
  • Country: hu
  • OS:
  • Windows NT 10.0 Windows NT 10.0
  • Browser:
  • Chrome 79.0.3945.130 Chrome 79.0.3945.130
    • View Profile
    • Webnyelv.hu - Tanuljunk nyelveket!
Re: MIDI to BASIC
« Reply #21 on: 2020.February.07. 11:14:59 »
Egyébként lehet még egyszerűsíteni rajta. ;)
Ha kisebb 128-nál a bájt értéke, akkor egyszerűen csak fogjuk a bájtot és az értéke annyi marad, amennyi, és nem kell megszorozni meg hozzáadni. Ezt csinálta eddig is. Ha meg nagyobb 127-nél, akkor meghívhat egy eljárást, pl. DEF BONYODALOM, és ott elbánik a felső matematikát igénylő, rendkívül bonyolult, több bájtos virtuális objektumokkal. Most pont nem tudom kipróbálni, mert másik gépről vagyok, azért csak szövegelek.
100 SOUND SOURCE 3,STYLE 16,LEFT 16,RIGHT 64,SYNC 2
110 SOUND SOURCE 2,STYLE 128,PITCH 25.2,SYNC 2
120 SOUND PITCH 25,SYNC 2
Videos

Offline szipucsu

  • EP addict
  • *
  • Posts: 8517
  • Country: hu
  • OS:
  • Windows 7/Server 2008 R2 Windows 7/Server 2008 R2
  • Browser:
  • Firefox 72.0 Firefox 72.0
    • View Profile
    • Webnyelv.hu - Tanuljunk nyelveket!
Re: MIDI to BASIC
« Reply #22 on: 2020.February.10. 10:03:50 »
Jól van, látom figyelsz! :smt023
Na, megpróbáltam megvalósítani. Eddig jutottam. A VALUE helyett HOSSZ nevű változót használok, és a C$ változó tárolja a midi fájlból kiolvasott hanghossz első (legtöbb esetben egyben utolsó) bájtját:

Code: [Select]
555     LET HOSSZ=0
560     IF C$>CHR$(127) THEN LET HOSSZ=HOSSZ*128+ORD(C$)-128
565     IF C$<CHR$(128) THEN LET HOSSZ=HOSSZ*128+ORD(C$)
566     IF C$>CHR$(127) THEN
570       GET #1:C2$
571       IF C2$>CHR$(127) THEN LET HOSSZ=HOSSZ*128+ORD(C2$)-128
572       IF C2$<CHR$(128) THEN LET HOSSZ=HOSSZ*128+ORD(C2$)
573       IF C2$>CHR$(127) THEN
574         GET #1:C3$
575         IF C3$>CHR$(127) THEN LET HOSSZ=HOSSZ*128+ORD(C3$)-128
576         IF C3$<CHR$(128) THEN LET HOSSZ=HOSSZ*128+ORD(C3$)
577         IF C3$>CHR$(127) THEN
578           GET #1:C4$
579           IF C4$>CHR$(127) THEN LET HOSSZ=HOSSZ*128+ORD(C4$)-128
580           IF C4$<CHR$(128) THEN LET HOSSZ=HOSSZ*128+ORD(C4$)
581           IF C4$>CHR$(127) THEN PRINT "Nem normális ilyen hosszú hang!":STOP
582         END IF
583       END IF
584     END IF

És itt elvileg örülünk, hogy megvan a HOSSZ változóban a hang hossza. Jól gondolom?

UI: Kipróbáltam, látszólag működik, igen hosszú hangokkal is jól működik, de extrém hosszú hangokkal már nem kísérleteztem.
« Last Edit: 2020.February.10. 10:28:44 by szipucsu »
100 SOUND SOURCE 3,STYLE 16,LEFT 16,RIGHT 64,SYNC 2
110 SOUND SOURCE 2,STYLE 128,PITCH 25.2,SYNC 2
120 SOUND PITCH 25,SYNC 2
Videos

Offline ergoGnomik

  • EP lover
  • *
  • Posts: 938
  • Country: hu
  • Stray cat from Commodore alley
  • OS:
  • Windows 7/Server 2008 R2 Windows 7/Server 2008 R2
  • Browser:
  • Opera 12.18 Opera 12.18
    • View Profile
Re: MIDI to BASIC
« Reply #23 on: 2020.February.10. 17:14:33 »
Én inkább valami ilyesmire gondoltam:
Code: [Select]
1000 DEF MIDIERTEK(CSAT,MAXHOSSZ,REF HIBA)
 1010   LET HOSSZ=0
 1020   LET HIBA=0
 1030   DO
 1040     GET #CSAT:C$
 1050     IF LEN(C$)=0 THEN
 1060       LET HIBA=1
 1070       EXIT DO
 1080     END IF
 1090     LET M=ORD(C$)
 1100     LET HOSSZ=HOSSZ*128+(M BAND 127)
 1110     LET MAXHOSSZ=MAXHOSSZ-1
 1120     IF MAXHOSSZ<0 THEN
 1130       LET HIBA=2
 1140       EXIT DO
 1150     END IF
 1160   LOOP WHILE M BAND 128
 1170   LET MIDIERTEK=HOSSZ
 1180 END DEF
A MAXHOSSZ körüli részben nem vagyok biztos, azt ki kellene próbálni, hogy rendben korlátozza-e a beolvasási hosszat. Mondjuk kettőt állítasz be korlátnak, és beolvastatsz egy tudottan három bájt hosszú értéket. Ha jól csináltam, akkor hibával tér vissza. Ugyan így ellenőrizni kellene, hogy három bájt hosszúságú érték három maximális hosszal beolvasásra kerül-e.

Offline szipucsu

  • EP addict
  • *
  • Posts: 8517
  • Country: hu
  • OS:
  • Windows 7/Server 2008 R2 Windows 7/Server 2008 R2
  • Browser:
  • Firefox 72.0 Firefox 72.0
    • View Profile
    • Webnyelv.hu - Tanuljunk nyelveket!
Re: MIDI to BASIC
« Reply #24 on: 2020.February.10. 17:43:36 »
Én inkább valami ilyesmire gondoltam:
Most másik gépről vagyok, innen nem tudom kipróbálni, de majd otthonról megnézem.
Amúgy, a következő nem lenne jó? Fejből írtam kicsit sietve Word-ben, sorszámok nélkül:

LET HOSSZ=0
FOR J=1 TO 4
GET C$
IF C$>CHR$(127) THEN LET HOSSZ=HOSSZ*128+ORD(C$)-128
IF C$<CHR$(128) THEN LET HOSSZ=HOSSZ*128+ORD(C$):EXIT FOR
NEXT

Ugyanaz lenne, mint amit legutóbb írtam, csak kicsit rövidebben, ha nem néztem el semmit.
Most belekutyulódtam, hogy melyik IF-es sor végére kell az EXIT FOR, de az eredeti program szerint az elsőnél van jó helyen, de az én logikám szerint a második végére kéne. (Bár én lehet, nem teljesen értem a módszert.)
« Last Edit: 2020.February.10. 21:01:52 by szipucsu »
100 SOUND SOURCE 3,STYLE 16,LEFT 16,RIGHT 64,SYNC 2
110 SOUND SOURCE 2,STYLE 128,PITCH 25.2,SYNC 2
120 SOUND PITCH 25,SYNC 2
Videos

Offline szipucsu

  • EP addict
  • *
  • Posts: 8517
  • Country: hu
  • OS:
  • Windows 7/Server 2008 R2 Windows 7/Server 2008 R2
  • Browser:
  • Firefox 72.0 Firefox 72.0
    • View Profile
    • Webnyelv.hu - Tanuljunk nyelveket!
Re: MIDI to BASIC
« Reply #25 on: 2020.February.10. 21:55:00 »
Még brutálisabban egyszerűsítettem rajta:
Szóval LET HOSSZ=0 meg GET #1:C$ volt a programban előbb már, azt kicsit nézegette más okok miatt, hogy mi van bennük, és utána:

Code: [Select]
560 IF C$>CHR$(127) THEN LET HOSSZ=HOSSZ*128+ORD(C$)-128:GET #1:C$:GOTO 560
565 IF C$<CHR$(128) THEN LET HOSSZ=HOSSZ*128+ORD(C$)

Ez így jó is lesz, jó rövid így. De majd megnézem a te módszered is!

100 SOUND SOURCE 3,STYLE 16,LEFT 16,RIGHT 64,SYNC 2
110 SOUND SOURCE 2,STYLE 128,PITCH 25.2,SYNC 2
120 SOUND PITCH 25,SYNC 2
Videos

Offline ergoGnomik

  • EP lover
  • *
  • Posts: 938
  • Country: hu
  • Stray cat from Commodore alley
  • OS:
  • Windows 7/Server 2008 R2 Windows 7/Server 2008 R2
  • Browser:
  • Firefox 52.0 Firefox 52.0
    • View Profile
Re: MIDI to BASIC
« Reply #26 on: 2020.February.10. 22:17:36 »
Az 565-ben az IF feleslegesnek tűnik. Sőt, talán így is lehetne írni:
Code: [Select]
560 LET HOSSZ=HOSSZ*128+ORD(C$)
565 IF C$>CHR$(127) THEN LET HOSSZ=HOSSZ-128:GET #1:C$:GOTO 560
Aztán persze kérdés, hogy melyik lesz a hatékonyabb.

Egyébként azon gondolkodom, hogy ez már pont úgy néz ki, mintha egy általatok lekicsinyelt más BASIC nyelvjárásban lenne megírva. Semmi IS-BASIC-re jellemző elegancia és strukturáltság.

Offline szipucsu

  • EP addict
  • *
  • Posts: 8517
  • Country: hu
  • OS:
  • Windows 7/Server 2008 R2 Windows 7/Server 2008 R2
  • Browser:
  • Firefox 72.0 Firefox 72.0
    • View Profile
    • Webnyelv.hu - Tanuljunk nyelveket!
Re: MIDI to BASIC
« Reply #27 on: 2020.February.10. 22:45:38 »
Igen, strukturáltság szempontjából ez így gáz. Délelőtt betettem azt a 20 soros hosszú programrészt. Ott elszörnyedtem, láttam, hogy ez így nagyon sok, és egyszerűsíteni kell rajta, csak ugye fejben először ez volt meg. Így hát egyszerűsítettem, és ez túl jól sikerült. :D Annyira szörnyűnek tűnt az a 20 sor. Áttekinthetőség szempontjából tényleg IF ... END IF lenne elegáns, és mindegyik sorba egy utasítás.
Valamikor a strukturálatlanságnak is van előnye. Pl. TVC-n volt egy sound utasítás, felszökött a hang, és ezt egy sorban meg lehetett oldani egy ciklussal, valami ilyesmi volt:
500 FOR J=3500 TO 4094:SOUND; PITCH J,DURATION 2:NEXT
Olykor zavaró lehet, hogy ha listázok egy bonyolultabb programot, akkor ez három sort elfoglal EP-n, és a képernyőn kevesebb hely marad más dolgoknak. Az IF... END IF hiánya TVC-n meg zavaró lehet, amikor pl. 4 print utasítást akarok a then után tenni, de az már nagyon sok lenne egy sorban, és csak a 4 print miatt kell gosubozni, és még keríteni is kell valami részt a programban, ahova amúgy sose jutna el, csak innen.
100 SOUND SOURCE 3,STYLE 16,LEFT 16,RIGHT 64,SYNC 2
110 SOUND SOURCE 2,STYLE 128,PITCH 25.2,SYNC 2
120 SOUND PITCH 25,SYNC 2
Videos

Offline szipucsu

  • EP addict
  • *
  • Posts: 8517
  • Country: hu
  • OS:
  • Windows 7/Server 2008 R2 Windows 7/Server 2008 R2
  • Browser:
  • Firefox 73.0 Firefox 73.0
    • View Profile
    • Webnyelv.hu - Tanuljunk nyelveket!
Re: MIDI to BASIC
« Reply #28 on: 2020.February.22. 21:55:09 »
ErgoGnomik jóvoltából most már a hosszú hangokat is ki lehet bányászni a midi fájlból. Ennek örömére rögtön át is gyűrtem basicbe a másik topikba is betett Bach muzsikát. Kicsit döcögve szól az elején (lassú a basic), de aztán helyreáll:
* Bach01 bas.ep128s (43.74 kB - downloaded 26 times.)
Ez csak egy szólamú, a basic korlátai miatt.
A midi fájlban sokszor nagyon rövid szünetek vannak a hangok között, ami basicbe konvertálva kicsit fura, és jobb lenne, ha inkább az előző hang szólna tovább a szünet idejére is. Ráadásul olyan rövidek ezek a szünetek, hogy 1-nél rövidebb duration jön ki, de szerencsére ezt felfelé kerekíti, különben a duration 0 percekig is szólna. A tört duration értékek miatt el is csúszhat a ritmus, szóval még lehetne ezen finomítani.
100 SOUND SOURCE 3,STYLE 16,LEFT 16,RIGHT 64,SYNC 2
110 SOUND SOURCE 2,STYLE 128,PITCH 25.2,SYNC 2
120 SOUND PITCH 25,SYNC 2
Videos

Offline szipucsu

  • EP addict
  • *
  • Posts: 8517
  • Country: hu
  • OS:
  • Windows 7/Server 2008 R2 Windows 7/Server 2008 R2
  • Browser:
  • Firefox 73.0 Firefox 73.0
    • View Profile
    • Webnyelv.hu - Tanuljunk nyelveket!
Re: MIDI to BASIC
« Reply #29 on: 2020.February.22. 22:08:51 »
Ez a legutóbbi, a hosszú hangokat is jól kezelő változat:
* mid2bas4.zip (2.89 kB - downloaded 27 times.)
100 SOUND SOURCE 3,STYLE 16,LEFT 16,RIGHT 64,SYNC 2
110 SOUND SOURCE 2,STYLE 128,PITCH 25.2,SYNC 2
120 SOUND PITCH 25,SYNC 2
Videos