?login_element?

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. playtext
  2. playwait=$+1
  3.         ld a,1
  4.         dec a
  5.         jr nz,playsetwait
  6. cursampleaddr=$+1
  7.         ld hl,snd_empty
  8.         ld c,(hl)
  9.         inc hl
  10.         ld b,(hl)
  11.         inc hl
  12.         ld (cursampleaddr),hl
  13. curvowellength=$+1
  14.         ld a,6
  15.         dec c ;1: wait after vowel with current sound
  16.         jr z,setwait_playnextletter ;эта процедура обязана установить валидный cursampleaddr
  17.         inc c ;0: end of sample
  18.         jr z,playnextletter ;эта процедура обязана установить валидный cursampleaddr
  19.         call decodesampleframe
  20.         jp playsound
  21.  
  22. playsetwait
  23.         ld (playwait),a
  24.         ret
  25.  
  26. playtonedigit
  27.         sub '0'
  28.         ld l,a
  29.         ld h,0
  30.         add hl,hl
  31.         ld bc,tnotes
  32.         add hl,bc
  33.         ld (curnote),hl
  34.         jr playnextletter
  35. playincvowel
  36.         inc (hl)
  37.         inc (hl)
  38. playdecvowel
  39.         dec (hl)
  40.         jr playnextletter
  41. playlonger
  42.         ld a,2+1
  43. setwait_playnextletter ;эта процедура обязана установить валидный cursampleaddr
  44.         ld (playwait),a
  45. playnextletter ;эта процедура обязана установить валидный cursampleaddr
  46. playtextaddr=$+1
  47.         ld hl,0
  48.         ld a,(hl)
  49.         or a
  50.          jr nz,$+2+3+1
  51.           ld hl,playtextloop
  52.           ld a,(hl)
  53.         inc hl
  54.         ld (playtextaddr),hl
  55.          cp ':'
  56.          jr z,playlonger ;wait 2 frames with current sound
  57.          ld hl,curvowellength
  58.          cp '+'
  59.          jr z,playincvowel
  60.          cp '-'
  61.          jr z,playdecvowel
  62.          cp ' '
  63.          jr nz,$+4
  64.          ld a,'_'
  65.          cp '0'+10
  66.          jr c,playtonedigit
  67.         sub 64
  68.         ld l,a
  69.         ld h,0
  70.         add hl,hl
  71.         ld bc,tsounds
  72.         add hl,bc
  73.         ld c,(hl)
  74.         inc hl
  75.         ld b,(hl) ;bc=sample
  76.         ld (cursampleaddr),bc
  77.         ret
  78.  
  79. decodesampleframe
  80. ;структура фрейма сэмпла (0=конец сэмпла? 1=зацикливание на прошлый фрейм?):
  81.  ;c=
  82. ;1: noiseoff
  83. ;1: tonedivon (иначе работает tonefreq)
  84. ;1: toneoff
  85. ;1: envon (иначе работает vol)
  86. ;4: vol (4 bit, 0 != отключение) или envslow (1 bit) + envtype (3 bit) (envslow также отвечает за быстро/медленно для envtype=9))
  87.  ;b=
  88. ;3: tonediv (2+1 bit, всего 4 варианта используется) или tonefreq (12 bit? реально пока используется только =0)
  89. ;5: noise (5 bit)
  90. curnote=$+1
  91.         ld hl,tnotes+(4*2)
  92.         bit 5,b
  93.         jr z,$+3
  94.          inc hl ;там *4/3
  95.         ld e,(hl)
  96.         ld d,0 ;de=base envfreq
  97.         ld a,b ;noise freq
  98.         ex af,af' ;'
  99.         ld lx,c ;envon+vol
  100.         ld a,b
  101.         rlca
  102.         rlca
  103.         and 3
  104.         add a,2
  105.         ld b,a ;b=shift left ;2..5
  106.         ld l,e
  107.         ld h,d
  108. tonefromenv0
  109.         add hl,hl
  110.         djnz tonefromenv0
  111.          inc hl ;разлив
  112.         bit 6,c ;tonedivon
  113.         jr nz,notonefreq
  114.          ld l,d;0
  115. notonefreq
  116.         ld a,c
  117.         and 7
  118.         add a,8
  119.         ld hx,a ;envtype
  120.          cp 9 ;удар
  121.         jr nz,noenvfreq
  122.          ld de,300 ;?
  123. noenvfreq
  124.         ld a,c ;N?T?????
  125.         rlca   ;?T?????N
  126.         rla
  127.         rla    ;?????N?? CY=T
  128.         rla
  129.         rla    ;???N??T?
  130.          and 0x3f ;all ports IN
  131.          or 0b00101101 ;TODO mix with current mixer value
  132.          ;ld a,0b00101101 ;TN
  133.          ;ld a,0b00111101 ;T-
  134.          ;ld a,0b00101111 ;-N
  135.         bit 3,c
  136.         ret z;jr z,noenvslow
  137.          sla e
  138.          rl d ;на октаву вниз или быстро/медленно для удара
  139. ;noenvslow
  140. ;de=envfreq
  141. ;hl=tonefreq
  142. ;hx=env type
  143. ;lx=volume
  144. ;a=mixer
  145. ;a'=noise freq
  146.         ret
  147.  
  148.  
  149. ;i: --E 0028                                ;u: T-E 0028 (D-3)      
  150.                       ;e: T-E 0028 (G-3)
  151.                       ;a: --C 0050 (D-4)    ;O: T-- (D-2) (vol f)
  152. ;E: T-C 0050 (D-4)    ;A: T-E 0028 (D-4)
  153.  
  154. ;N: --E 0050 (тихая) (1-2 frames)
  155. ;M: T-E 0028 (G-3) (1-2 frames)
  156. ;L: ??? тембр как u?O? (можно тише)
  157. ;l: --E 0028 (1 frame)??? тембр как i (можно тише)
  158.  
  159. ;RR: (T-E --E) 0028 (D-4)
  160.  
  161. ;s: noise=00
  162. ;S: noise=03
  163. ;c: noise=08
  164. ;C: noise=0b
  165. ;f: noise=11
  166. ;F: noise=13 (vol 8,9)
  167. ;x: noise=1d
  168. ;X: noise=1f
  169.  
  170. ;T: noise=05 (vol 7,2)
  171. ;P: noise=11? (vol 7,2?)
  172. ;K: noise=1f? (vol f,c?)
  173.  
  174. ;B: T-- (D-2) (vol f,e)??? тембр как O
  175.  
  176. ;TS: noise=2,1 (vol d,b)
  177.  
  178. playsound
  179. ;hl=freq
  180. ;de=env freq
  181. ;hx=env type
  182. ;lx=volume
  183. ;a=mixer
  184. ;a'=noise freq
  185.         exx
  186.         ld bc,0xfffd
  187.         ld de,0x0902 ;d=B volume, e=B freq
  188.         out (c),e
  189.         exx
  190.         ld bc,0xbffd
  191.         out (c),l      
  192.         exx
  193.         inc e ;B freq HSB
  194.         out (c),e
  195.         exx
  196.         out (c),h
  197.        
  198.         exx
  199.         ld e,7 ;mixer
  200.         out (c),e
  201.         exx
  202.         out (c),a
  203.         exx
  204.         dec e;ld e,6 ;noise freq
  205.         out (c),e
  206.         exx
  207.         ex af,af' ;' ;ld a,hy
  208.         out (c),a
  209.  
  210.         exx
  211.         ;ld d,0x09 ;B volume
  212.         out (c),d ;B volume
  213.         exx
  214.         ld a,lx
  215.         out (c),a
  216.        
  217.         exx
  218.         ld e,0x0b ;env freq
  219.         out (c),e
  220.         exx
  221.         out (c),e
  222.         exx
  223.         inc e ;env freq HSB
  224.         out (c),e
  225.         exx
  226.         out (c),d
  227.        
  228.         ld a,hx
  229.         cp 9 ;удар
  230.         jr z,nocheckcurenv
  231. curenv=$+1
  232.         cp 0
  233.         ret z
  234. nocheckcurenv
  235.         ld (curenv),a
  236.         exx
  237.         inc e ;ld e,0x0d ;env type
  238.         out (c),e
  239.         exx
  240.         out (c),a
  241.         ret
  242.  
  243. ;D-2 = 0x6b0 = 1712 (32*4:3)
  244. ;D-3 = 0x358 = 856 (16*4:3)
  245. ;G-3 = 0x27c = 636 (16:1)
  246. ;D-4 = 0x1ac = 428 (8*4:3)
  247.  
  248. ;Ноты огибающей (0028 = 4-й тон перечисления, 1-й тон назовём 0, чтобы вклинить ноту ре на всякий случай):
  249. ;0: C-3 = 0x003c = 59.875 (от деления 0xef8=3832)
  250. ;1: D-3 = 0x0035 = 53.3
  251. ;2: D#3 = 0x0032 = 50.3
  252. ;3: F-3 = 0x002c = 44.8
  253. ;4: G-3 = 0x0028 = 40.0
  254. ;5: ...
  255. ;из них вычисляются ноты тона (сдвиг влево на N, возможное деление на 3, прибавление разлива)
  256. ;но тон может быть задан явно (для тихой огибающей), огибающая тоже? (для удара)
  257.  
  258. ;TODO или все ноты в 2 октавах, чтобы могло петь?
  259.  
  260.         macro DWNOTE t
  261.         db t
  262.         db (t)*4/3
  263.         endm
  264.  
  265. ;TODO *2 для точности расчёта 4/3?
  266. tnotes
  267.         DWNOTE 60 ;0: C
  268.         DWNOTE 53 ;1: D
  269.         DWNOTE 50 ;2: D#
  270.         DWNOTE 45 ;3: F
  271.         DWNOTE 40 ;4: G
  272.         DWNOTE 38 ;5: G#
  273.         DWNOTE 36 ;6: A
  274.         DWNOTE 32 ;7: H
  275.         DWNOTE 30 ;8: c
  276.         DWNOTE 27 ;9: d
  277.  
  278. ;описатель фонемы - просто указатель на сэмпл
  279. ;тоны и спецсимволы проверять вручную перед этим
  280. ;если потом выяснится, что они все по 2 фрейма или 1+вечный повтор, то можно внести сэмпл (2*2 байта) прямо в описатель
  281.  
  282. tsounds
  283.         dw snd_schwa
  284.         dw snd_A
  285.         dw snd_B
  286.         dw snd_C
  287.         dw snd_D
  288.         dw snd_E
  289.         dw snd_F
  290.         dw snd_G
  291.         dw snd_H
  292.         dw snd_I
  293.         dw snd_J
  294.         dw snd_K
  295.         dw snd_L
  296.         dw snd_M
  297.         dw snd_N
  298.         dw snd_O
  299.         dw snd_P
  300.         dw snd_Q
  301.         dw snd_R
  302.         dw snd_S
  303.         dw snd_T
  304.         dw snd_U
  305.         dw snd_V
  306.         dw snd_W
  307.         dw snd_X
  308.         dw snd_Y
  309.         dw snd_Z
  310.         dw snd_pause
  311.         dw snd_pause
  312.         dw snd_pause
  313.         dw snd_ishort
  314.         dw snd_pause
  315.  
  316.         dw snd_backtick
  317.         dw snd_a
  318.         dw snd_b
  319.         dw snd_c
  320.         dw snd_d
  321.         dw snd_e
  322.         dw snd_f
  323.         dw snd_g
  324.         dw snd_h
  325.         dw snd_i
  326.         dw snd_j
  327.         dw snd_k
  328.         dw snd_l
  329.         dw snd_m
  330.         dw snd_n
  331.         dw snd_o
  332.         dw snd_p
  333.         dw snd_q
  334.         dw snd_r
  335.         dw snd_s
  336.         dw snd_t
  337.         dw snd_u
  338.         dw snd_v
  339.         dw snd_w
  340.         dw snd_x
  341.         dw snd_y
  342.         dw snd_z
  343.         dw snd_pause
  344.         dw snd_hole
  345.         dw snd_pause
  346.         dw snd_pause
  347.         dw snd_pause
  348.  
  349. snd_r ;TODO r - одно колебание
  350. snd_R ;RR: (T-E --E) 0028 (D-4) (8*4:3)
  351.         db 0b11110110, 0b01100000
  352.         db 0b11010110, 0b01100000+16
  353.         ;db 0b11000110, 0b01100000
  354.         ;db 0b11100110, 0b01100000
  355.         ;db 0b11000110, 0b01100000
  356.         db 0
  357.  
  358. snd_Y ;TODO Й в начале слога, английское /j/
  359. snd_y ;Й в конце слога (дольше, чем ', но не имеет длительности гласной)
  360.         db 0b11110110, 0b00000000
  361.         db 0b11110110, 0b00000000
  362.         db 0
  363. snd_I ;не получается мягче, чем i
  364. snd_i ;i: --E 0028
  365.         db 0b11110110, 0b00000000
  366.         db 1
  367.  
  368. snd_E ;E: T-C 0050 (D-4) (8*4:3)
  369.         db 0b11011100, 0b01100000
  370.         db 1
  371.  
  372. snd_ishort ;shoft for diphthongs
  373.         db 0b11110110, 0b00000000
  374.         db 0
  375.  
  376. snd_backtick ;untested
  377.         db 0b01000000+15, 0b00000000
  378.         db 0
  379.  
  380. snd_schwa ;1 фрейм для начала Ы
  381.         db 0b11010110, 0b10000000
  382.         db 0
  383.  
  384. snd_e ;e: T-E 0028 (G-3) (16:1)
  385.         db 0b11010110, 0b10000000
  386.         db 1
  387.  
  388. snd_A ;A: T-E 0028 (D-4) (8*4:3)
  389.         db 0b11010110, 0b01100000
  390.         db 1
  391.  
  392. snd_o
  393. snd_O ;O: T-- (D-2) (vol f) (32*4:3)
  394.         db 0b11000000+15, 0b11100000
  395.         db 1
  396.  
  397. snd_W
  398.         db 0b11010110, 0b10100000
  399.         db 0b11010110, 0b10100000
  400.         db 0
  401. snd_w ;shoft for diphthongs
  402.         db 0b11010110, 0b10100000
  403.         db 0
  404. snd_U
  405. snd_u ;u: T-E 0028 (D-3) (16*4:3)
  406.         db 0b11010110, 0b10100000
  407.         db 1
  408.  
  409. snd_a ;a: --C 0050 (Э, предударное А)
  410.         db 0b11111100, 0b00000000
  411.         db 1
  412.  
  413. snd_p ;TODO p - губно-зубной взрывной
  414. snd_P
  415.         db 0b11011001, 0b11100000+13
  416.         ;db 0b01100000+10, 0b00000000+3
  417.         db 0
  418.  
  419. snd_T ;T: noise=05 (vol 7,2)
  420.         ;db 0b01100000+8, 0b00000000+5
  421.         db 0b01110001, 0b00000000+3;5
  422.         ;db 0b01100000+2, 0b00000000+5
  423.         db 0
  424. snd_t ;untested ;TS: noise=2,1 (vol d,b) ;TODO t - боковой глухой взрывной звук
  425.         db 0b01111001, 0b00000000+0
  426.         ;db 0b01100000+10, 0b00000000+0
  427.         db 0b01100000+8, 0b00000000+0
  428.         db 0
  429.  
  430. snd_K ;K: noise=31? (vol 7,2?)
  431.         db 0b01110001, 0b00000000+31
  432.         ;db 0b01100000+2, 0b00000000+31
  433.         db 0
  434. snd_k
  435.         db 0b01111001, 0b00000000+29
  436.         ;db 0b01100000+9, 0b00000000+29
  437.         ;db 0b01100000+4, 0b00000000+29
  438.         db 0
  439.  
  440. snd_Q ;q - взрывной глухой звук спинкой языка ;untested
  441.         db 0b01100000+7, 0b00000000+11
  442.         db 0b01100000+2, 0b00000000+11
  443.         db 0
  444. snd_q ;q - взрывной звонкий звук спинкой языка ;untested
  445.         db 0b01110110, 0b00000000+11
  446.         db 0b01110110, 0b00000000+11
  447.         db 0
  448.  
  449. ;B: T-- (D-2) (vol f,e)??? тембр как O
  450. snd_B
  451. snd_b
  452.         db 0b11000000+15, 0b11100000
  453.         ;db 0b11000000+13, 0b11100000
  454.         db 0
  455.  
  456. snd_D
  457.         db 0b11000000+15, 0b10100000
  458.         ;db 0b11000000+13, 0b10100000
  459.         db 0
  460. snd_d ;untested
  461.         db 0b11000000+15, 0b10100000
  462.         db 0b01000000+13, 0b10100000+3
  463.         ;db 0b01110100, 0b00000000+0
  464.         db 0
  465.  
  466. snd_G ;untested
  467.         db 0b11000000+15, 0b10100000
  468.         db 0b01010100, 0b00000000+31
  469.         db 0
  470. snd_g ;untested
  471.         db 0b01010100, 0b00000000+29
  472.         db 0b01010100, 0b00000000+29
  473.         db 0
  474.  
  475. snd_V ;v: -NC 0028?
  476.         db 0b01110100, 0b00000000+19
  477.         db 0b01110100, 0b00000000+19
  478.         db 0
  479. snd_v ;v: -NC 0028?
  480.         db 0b01110100, 0b00000000+17
  481.         db 0b01110100, 0b00000000+17
  482.         db 0
  483.  
  484. snd_Z ;untested
  485.         db 0b01110100, 0b00000000+3
  486.         db 0b01110100, 0b00000000+3
  487.         db 0
  488. snd_z ;untested
  489.         db 0b01110100, 0b00000000+0
  490.         db 0b01110100, 0b00000000+0
  491.         db 0
  492.  
  493. snd_J ;untested Ж
  494.         db 0b01110100, 0b00000000+11
  495.         db 0b01110100, 0b00000000+11
  496.         db 0
  497. snd_j ;untested Ж'
  498.         db 0b01110100, 0b00000000+8
  499.         db 0b01110100, 0b00000000+8
  500.         db 0
  501.  
  502. snd_F ;F: noise=13 (vol=8,9?)
  503.         db 0b01100000+8, 0b00000000+19
  504.         db 0b01100000+9, 0b00000000+19
  505.         db 0
  506. snd_f ;f: noise=11 (vol=8,9?)
  507.         db 0b01100000+8, 0b00000000+17
  508.         db 0b01100000+9, 0b00000000+17
  509.         db 0
  510.  
  511. snd_S ;S: noise=03 (vol=8,9?)
  512.         db 0b01100000+8, 0b00000000+3
  513.         db 0b01100000+9, 0b00000000+3
  514.         db 0
  515. snd_s ;s: noise=00 (vol=8,9?)
  516.         db 0b01100000+8, 0b00000000+0
  517.         db 0b01100000+9, 0b00000000+0
  518.         db 0
  519.  
  520. snd_C ;С: noise=0b (vol=8,9?) Ш
  521.         db 0b01100000+8, 0b00000000+11
  522.         db 0b01100000+9, 0b00000000+11
  523.         db 0
  524. snd_c ;с: noise=08 (vol=8,9?) Щ
  525.         db 0b01100000+8, 0b00000000+8
  526.         db 0b01100000+9, 0b00000000+8
  527.         db 0
  528.  
  529. snd_H
  530. snd_X ;X: noise=1f (vol=8,9?)
  531.         db 0b01100000+8, 0b00000000+31
  532.         db 0b01100000+9, 0b00000000+31
  533.         db 0
  534. snd_h
  535. snd_x ;x: noise=1d (vol=8,9?)
  536.         db 0b01100000+8, 0b00000000+29
  537.         db 0b01100000+9, 0b00000000+29
  538.         db 0
  539.  
  540. snd_n
  541. snd_N ;N: --E 0050 (тихая) (1-2 frames)
  542.         db 0b10011110, 0b00000000
  543.         db 0b10011110, 0b00000000
  544.         db 0
  545.  
  546. snd_m ;TODO m - губно-зубной
  547. snd_M ;M: T-E 0028 (G-3) (1-2 frames)??? тембр как u
  548.         db 0b11010110, 0b10100000
  549.         db 0b11010110, 0b10100000
  550.         db 0
  551.  
  552. snd_L ;L: ??? тембр как u?O? (можно тише)
  553.         db 0b11000000+13, 0b11100000
  554.         db 0b11000000+13, 0b11100000
  555.         db 0
  556. snd_l ;l: --E 0028 (1 frame)??? тембр как i (можно тише)
  557.         db 0b10010110, 0b00000000
  558.         db 0b10010110, 0b00000000
  559.         db 0
  560.  
  561. snd_hole ;закрытие перед взрывным
  562.         db 0b11000000+0, 0b00000000+0
  563. snd_empty
  564.         db 0
  565.  
  566. snd_pause ;pause
  567.         db 0b11000000+0, 0b00000000+0
  568.         db 1
  569.