Welcome, Guest. Please login or register.


Author Topic: Hanglejátszó fejlesztése (Read 68742 times)

Offline IstvanV

  • EP addict
  • *
  • Posts: 4706
  • OS:
  • Linux Linux
  • Browser:
  • Firefox 58.0 Firefox 58.0
    • View Profile
Re: Hanglejátszó fejlesztése
« Reply #165 on: 2018.November.14. 11:36:49 »
Hogyan lehetne azt elegánsan megcsinálni, hogy pontosan változtassam a hangmagasságot? Csak NOP-ok beszúrásával a két port írás között? Vagy van elegánsabb megoldás is?

Ez a programtól függ, ha a lejátszás közben más is történik, akkor talán érdemesebb lenne megszakítással időzíteni, egyébként jó lehet a NOP-os megoldás is. Még az is kérdés lehet, hogy fontos-e a 4 MHz-esnél gyorsabb gépeken is a helyes magasság.

Offline ergoGnomik

  • EP lover
  • *
  • Posts: 703
  • Country: hu
  • Stray cat from Commodore alley
  • OS:
  • Windows NT 10.0 Windows NT 10.0
  • Browser:
  • Firefox 63.0 Firefox 63.0
    • View Profile
Re: Hanglejátszó fejlesztése
« Reply #166 on: 2018.November.14. 11:39:19 »
Hogyan lehetne azt elegánsan megcsinálni, hogy pontosan változtassam a hangmagasságot? Csak NOP-ok beszúrásával a két port írás között? Vagy van elegánsabb megoldás is?

Pl. lenne egy rövid (pl. 1mp hosszú) vonós / zongora stb. sample-m, és abból akarnék dallamot összerakni.
Először is nyilván időzítő megszakításból kell játszani a hangot. Másodszor ha normális eredményt akarsz, akkor célszerű úgy csinálni, mint a hullámtábla szintézises hangkeltőknél szokás: a lejátszani kívánt hangmagasságokhoz legyen külön mintád, természetesen a mintavételi sebesség és a sávszélesség szerint szűrve. Harmadszor lehet próbálkozni a fázisgyűjtő oszcillátorhoz hasonló technikával, természetesen csökkenő hangminőség mellett: a mintákat úgy lépteted, hogy futtatsz mondjuk egy 8 bites additív számlálót, és csak akkor lépsz új mintára, ha ez a frissítéskor túlcsordult.

Offline Povi

  • EP addict
  • *
  • Posts: 1689
  • Country: hu
  • OS:
  • Windows NT 10.0 Windows NT 10.0
  • Browser:
  • Chrome 70.0.3538.77 Chrome 70.0.3538.77
    • View Profile
    • http://povi.fw.hu
Re: Hanglejátszó fejlesztése
« Reply #167 on: 2018.November.14. 14:05:25 »
még egy kérdés:
ha két szólamot akarok összekeverni, akkor az működik, ha átlagolom a két sample byte értéket?
*** Speicherplatz zu klein

Offline ergoGnomik

  • EP lover
  • *
  • Posts: 703
  • Country: hu
  • Stray cat from Commodore alley
  • OS:
  • Windows NT 10.0 Windows NT 10.0
  • Browser:
  • Firefox 63.0 Firefox 63.0
    • View Profile
Re: Hanglejátszó fejlesztése
« Reply #168 on: 2018.November.14. 14:11:46 »
még egy kérdés:
ha két szólamot akarok összekeverni, akkor az működik, ha átlagolom a két sample byte értéket?
Igen, de azt is megteheted, hogy az István-féle csatorna trükkel két független digitális hangot játszol le.

Offline Povi

  • EP addict
  • *
  • Posts: 1689
  • Country: hu
  • OS:
  • Windows NT 10.0 Windows NT 10.0
  • Browser:
  • Chrome 70.0.3538.77 Chrome 70.0.3538.77
    • View Profile
    • http://povi.fw.hu
Re: Hanglejátszó fejlesztése
« Reply #169 on: 2018.November.14. 14:34:23 »
Igen, de azt is megteheted, hogy az István-féle csatorna trükkel két független digitális hangot játszol le.
sőt, jobb jutott eszembe: 2 csatorna esetén lehet sztereó, és nem kell foglalkozni a keveréssel :-)
*** Speicherplatz zu klein

Offline Povi

  • EP addict
  • *
  • Posts: 1689
  • Country: hu
  • OS:
  • Windows NT 10.0 Windows NT 10.0
  • Browser:
  • Chrome 70.0.3538.77 Chrome 70.0.3538.77
    • View Profile
    • http://povi.fw.hu
Re: Hanglejátszó fejlesztése
« Reply #170 on: 2018.November.14. 17:27:23 »
primitív rutinom eredménye:

csak egy szólam, NOP-okkal megoldva az időzítés a két out között, sajnos így nem igazán megoldható a két szólam, legalábbis én még nem jöttem rá, hogy kéne :-)

ugye ahhoz az OUT-oknak egyenlő időközönként kéne lennie, de nálam ez most változó, a hangmagasságtól függ, hogy hány NOP lesz a két OUT között

*** Speicherplatz zu klein

Offline endi

  • EP addict
  • *
  • Posts: 6710
  • Country: hu
  • grafikus, játékfejlesztõ, programozás, scifi, tudományok, vallás
  • OS:
  • Windows 7/Server 2008 R2 Windows 7/Server 2008 R2
  • Browser:
  • Chrome 69.0.3497.100 Chrome 69.0.3497.100
    • View Profile
    • Honlapom
Re: Hanglejátszó fejlesztése
« Reply #171 on: 2018.November.14. 17:51:57 »
én úgy csináltam annak idején 2 szólamút, hogy rotáltam egy bájtot (vagy kettőt?) és felépítettem egy táblázatot, amiben egyre "sűrűbb" volt az 1 bit :)
és a rotálással ügye kijött a végén a bit, ami jelezte, hogy léptetni kell a digi hangot.

tehát pl:
00000000
10000000
10001000
10010010
10110010
10110110
11110111
stb
(de lehet hogy 2 bájt kellett mert így 1 bájton valszeg nem lehet túl sok hangmagasságot meghatározni)
A diplomás magyar programozó megcsinált egy pacmant egy év alatt, majd lefikázta a világ legjobb játékait. :D

Offline IstvanV

  • EP addict
  • *
  • Posts: 4706
  • OS:
  • Linux Linux
  • Browser:
  • Firefox 58.0 Firefox 58.0
    • View Profile
Re: Hanglejátszó fejlesztése
« Reply #172 on: 2018.November.14. 18:04:34 »
csak egy szólam, NOP-okkal megoldva az időzítés a két out között, sajnos így nem igazán megoldható a két szólam, legalábbis én még nem jöttem rá, hogy kéne :-)

Fix lejátszási frekvenciával, és az aktuális pozíciót (ami jelenleg DE) tört formátumban tárolva. Ez ugyan rosszabb minőségű, de lehetővé teszi a több szólamú hangot. Itt a DE.H a pozíció, az L pedig a sebesség tört része, két szólamnál használható lenne a DE' és HL', de jobban is lehetne optimalizálni:
Code: ZiLOG Z80 Assembler
  1. l1:     ld      a, (de)
  2.         out     (0ach), a
  3.         dec     bc
  4.         ld      a, b
  5.         or      c
  6.       ; ld      a, d
  7.       ; cp      high SAMPLE_END
  8.         ret     z
  9.         ld      a, h
  10.         add     a, l
  11.         ld      h, a
  12.         jr      c, l2
  13.         nop
  14.         defb    3eh                     ; = LD A, n
  15. l2:     inc     de
  16.         nop
  17.       ; ...
  18.         nop
  19.         jr      l1

A NOP-os módszer továbbfejleszthető lenne 1 ciklus felbontásúra is.
« Last Edit: 2018.November.14. 18:22:04 by IstvanV »

Offline Povi

  • EP addict
  • *
  • Posts: 1689
  • Country: hu
  • OS:
  • Windows NT 10.0 Windows NT 10.0
  • Browser:
  • Chrome 70.0.3538.77 Chrome 70.0.3538.77
    • View Profile
    • http://povi.fw.hu
Re: Hanglejátszó fejlesztése
« Reply #173 on: 2018.November.14. 19:13:07 »
Fix lejátszási frekvenciával, és az aktuális pozíciót (ami jelenleg DE) tört formátumban tárolva. Ez ugyan rosszabb minőségű, de lehetővé teszi a több szólamú hangot. Itt a DE.H a pozíció, az L pedig a sebesség tört része, két szólamnál használható lenne a DE' és HL', de jobban is lehetne optimalizálni:

Na, miután megértettem, mire gondolsz a tört formátum alatt, elkészült ez a verzió is:
Kicsit zajosabb (a tempó nem ugyanaz, arra nem figyeltem most):

szerk: közben azon gondolkozom, vajon javítaná a minőséget, ha a H regisztert nulláznám minden egyes újabb hang lejátszása előtt
« Last Edit: 2018.November.14. 19:16:17 by Povi »
*** Speicherplatz zu klein

Offline Povi

  • EP addict
  • *
  • Posts: 1689
  • Country: hu
  • OS:
  • Windows NT 10.0 Windows NT 10.0
  • Browser:
  • Chrome 70.0.3538.77 Chrome 70.0.3538.77
    • View Profile
    • http://povi.fw.hu
Re: Hanglejátszó fejlesztése
« Reply #174 on: 2018.November.14. 19:18:34 »
Fix lejátszási frekvenciával, és az aktuális pozíciót (ami jelenleg DE) tört formátumban tárolva.
Tetszik a trükk, és mindkét esetben pontosan 87 órajelenként van az OUT. Az javítana-e, ha két NOP-ot kivennénk a végéről, így kvázi növelnénk a sample rate-t kb. 10%-kal. Bár sok értelmét máskülönben meg azért nem látom, mert a második szólam hozzáadásával rögtön le is feleznénk a sample rate-t...
*** Speicherplatz zu klein

Offline IstvanV

  • EP addict
  • *
  • Posts: 4706
  • OS:
  • Linux Linux
  • Browser:
  • Firefox 58.0 Firefox 58.0
    • View Profile
Re: Hanglejátszó fejlesztése
« Reply #175 on: 2018.November.14. 20:21:12 »
Az javítana-e, ha két NOP-ot kivennénk a végéről, így kvázi növelnénk a sample rate-t kb. 10%-kal. Bár sok értelmét máskülönben meg azért nem látom, mert a második szólam hozzáadásával rögtön le is feleznénk a sample rate-t...

A két NOP csak példa, természetesen módosítható a várakozás vagy törölhető. 87 ciklus az 45977 Hz mintavételezési frekvencia 4 MHz-es gépen, két szólamnál is még elfogadható lehet.

Offline Povi

  • EP addict
  • *
  • Posts: 1689
  • Country: hu
  • OS:
  • Windows NT 10.0 Windows NT 10.0
  • Browser:
  • Chrome 70.0.3538.102 Chrome 70.0.3538.102
    • View Profile
    • http://povi.fw.hu
Re: Hanglejátszó fejlesztése
« Reply #176 on: Yesterday at 15:02 »
újabb verzió, még mindig csak 1 szólam, de most 16 bites törtrész használata, hogy pontosabb legyen a frekvencia, a mintavételezés jelenleg 44.444kHz
*** Speicherplatz zu klein

Offline ergoGnomik

  • EP lover
  • *
  • Posts: 703
  • Country: hu
  • Stray cat from Commodore alley
  • OS:
  • Windows NT 6.3 Windows NT 6.3
  • Browser:
  • Firefox 52.0 Firefox 52.0
    • View Profile
Re: Hanglejátszó fejlesztése
« Reply #177 on: Yesterday at 15:39 »
... a mintavételezés jelenleg 44.444kHz
44 megahertz! :shock: Azta!

:ds_icon_cheesygrin: Peace, man!

Offline IstvanV

  • EP addict
  • *
  • Posts: 4706
  • OS:
  • Linux Linux
  • Browser:
  • Firefox 58.0 Firefox 58.0
    • View Profile
Re: Hanglejátszó fejlesztése
« Reply #178 on: Yesterday at 16:48 »
Próbálkozás két szólamra:
Code: ZiLOG Z80 Assembler
  1. ; HL = -duration in samples (30534 Hz)
  2. ; DE = sample address L
  3. ; BC = pitch L
  4. ; DE' = sample address R
  5. ; BC' = pitch R
  6.  
  7. play_sample:
  8.         ld      ix, 0
  9.         exx
  10.         ld      hl, 0
  11.         exx
  12.         defb    0f6h                    ; = OR n
  13. .l1:    inc     h                       ;   4
  14.         ret     z                       ;   9
  15. .l2:    ld      a, (de)                 ;  16
  16.         exx                             ;  20
  17.         out     (0a8h), a               ;  31
  18.         ld      a, (de)                 ;  38
  19.         out     (0ach), a               ;  49
  20.         add     hl, bc                  ;  60
  21.         jr      c, .l3                  ;  72
  22.         nop                             ;  71
  23.         defb    3eh                     ; = LD A, n
  24. .l3:    inc     de                      ;  78
  25.         exx                             ;  82
  26.         add     ix, bc                  ;  97
  27.         jr      c, .l4                  ; 109
  28.         nop                             ; 108
  29.         defb    3eh                     ; 115
  30. .l4:    inc     de                      ; 115
  31.         inc     l                       ; 119
  32.         jr      z, .l1                  ; 131
  33.         nop                             ;  -1
  34.         jp      .l2                     ;   9