Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

607 lines
27KB

  1. # singer.rb -- singer.ins -> singer.scm -> singer.rb -*- snd-ruby -*-
  2. # Translator: Michael Scholz <mi-scholz@users.sourceforge.net>
  3. # Created: Sat Apr 23 13:07:53 CEST 2005
  4. # Changed: Mon Nov 22 13:36:42 CET 2010
  5. # Commentary:
  6. #
  7. # Perry Cook's physical model of the vocal tract as described in:
  8. #
  9. # Cook, Perry R. "Synthesis of the Singing Voice Using a Physically
  10. # Parameterized Model of the Human Vocal Tract"
  11. # Published in the Proceedings of the International Computer Music Conference, Ohio 1989
  12. # and as Stanford University Department of Music Technical Report Stan-M-57, August 1989.
  13. #
  14. # -- "Identification of Control Parameters in an Articulatory Vocal
  15. # Tract Model, with Applications to the Synthesis of Singing,"
  16. # Ph.D. Thesis, Stanford University Department of Music Technical
  17. # Report
  18. #
  19. # -- "SPASM, a Real-time Vocal Tract Physical Model Controller; and
  20. # Singer, the Companion Software Synthesis System", Computer Music
  21. # Journal, vol 17 no 1 Spring 1993.
  22. #
  23. # This code is a translation of Perry Cook's singer implementation originally in C.
  24. # Apparently all Perry's data is aimed at srate=22050.
  25. #
  26. # Code:
  27. def singer(start, amp, data)
  28. # data is a list of lists very similar to the sequence of synthesize
  29. # calls in Perry's original implementation.
  30. # Each imbedded list has the form: dur shape glot pitch glotamp
  31. # noiseamps vibramt.
  32. # See below for examples.
  33. setup = data.first
  34. durs = data.map do |val| val[0] end
  35. dur = 0.0
  36. durs.each do |val| dur += val end
  37. dur -= samples2seconds(1)
  38. beg = start
  39. begs = [start] + durs.map do |val| beg += val end
  40. beg_samps = begs.map do |val| seconds2samples(val) end
  41. change_times = (beg_samps + [beg_samps.last]).to_vct
  42. shps = data.map do |val| val[1] end
  43. glts = data.map do |val| val[2] end
  44. pfun = [0.0, 0.8 * setup[3]]
  45. data.zip(begs[1..-1]) do |dat, b| pfun.push(b - start, Float(dat[3])) end
  46. gfun = [0.0, 0.0]
  47. data.zip(begs[1..-1]) do |dat, b| gfun.push(b - start, Float(dat[4])) end
  48. nfun = [0.0, Float(setup[5])]
  49. data.zip(begs[1..-1]) do |dat, b| nfun.push(b - start, Float(dat[5])) end
  50. vfun = [0.0, Float(setup[6])]
  51. data.zip(begs[1..-1]) do |dat, b| vfun.push(b - start, Float(dat[6])) end
  52. noiseamps = Vct.new(data.length) do |i| Float(data[i][5]) end
  53. frq_env = make_env(:envelope, pfun, :duration, dur)
  54. vib_env = make_env(:envelope, vfun, :duration, dur)
  55. vib_osc = make_oscil(:frequency, 6.0)
  56. glot_env = make_env(:envelope, gfun, :duration, dur)
  57. noise_env = make_env(:envelope, nfun, :duration, dur)
  58. ran_vib = make_rand_interp(:frequency, 10, :amplitude, 0.02)
  59. #
  60. tractlength = 9 # length of vocal tract
  61. shape_data = Vct.new(shps.length * (tractlength + 8))
  62. glot_datai = Vct.new(2 * glts.length)
  63. glot_datar = Vct.new(2 * glts.length)
  64. shps.each_with_index do |shp, i|
  65. shp[1..-1].each_with_index do |val, j| shape_data[j + i] = val end
  66. end
  67. ii = 0
  68. glts.each do |glt|
  69. glot_datai[ii] = 0.0
  70. glot_datai[ii + 1] = glt[0]
  71. glot_datar[ii] = glt[1]
  72. glot_datar[ii + 1] = glt[2]
  73. ii += 2
  74. end
  75. table_size = 1000 # size of glottis wave-table
  76. noseposition = 3
  77. noselength = 6
  78. nose_ring_time = 1000 # naso pharynx response decay time
  79. one_over_two_pi = 1.0 / TWO_PI
  80. two_pi_over_table_size = TWO_PI / table_size
  81. table_size_over_sampling_rate = table_size / mus_srate
  82. dpole = 0.998
  83. dgain = 1.0 - dpole
  84. tong_hump_pole = 0.998
  85. tong_hump_gain = 1.0 - tong_hump_pole
  86. tong_tip_pole = 0.998
  87. tong_tip_gain = 1.0 - tong_tip_pole
  88. glot_table = Vct.new(table_size + 1)
  89. glot_table2 = Vct.new(table_size + 1)
  90. gn_table = Vct.new(table_size + 1)
  91. gn_gain = 0.0
  92. gn_out = 0.0
  93. gn_del = Vct.new(4)
  94. gn_coeffs = Vct.new(4)
  95. sines = Vct.new(200)
  96. cosines = Vct.new(200)
  97. table_increment = 0.0
  98. table_location = 0.0
  99. glot_refl_gain = 0.7
  100. pitch = 400.0
  101. vibr_amt = 0.0
  102. last_lip_in = 0.0 # for lip reflection/transmission filter
  103. last_lip_out = 0.0
  104. last_lip_refl = 0.0
  105. lip_refl_gain = -0.45
  106. noise_gain = 0.0 # for vocal tract noise generator
  107. noise_input = 0.0
  108. noise_output = 0.0
  109. noise_c = Vct.new(4) # net coefficients on delayed outputs
  110. noise_pos = 0
  111. fnoiseamp = 0.0
  112. inz1 = 0.0
  113. inz2 = 0.0
  114. outz = Vct.new(4) # delayed versions of input and output
  115. # nasal tract acoustic tube structure
  116. nose_coeffs = vct(0.0, -0.29, -0.22, 0.0, 0.24, 0.3571)
  117. nose1 = Vct.new(noselength)
  118. nose2 = Vct.new(noselength)
  119. velum_pos = 0.0
  120. alpha = Vct.new(4)
  121. nose_last_minus_refl = 0.0
  122. nose_last_plus_refl = 0.0
  123. nose_last_output = 0.0
  124. nose_filt = 0.0
  125. nose_filt1 = 0.0
  126. time_nose_closed = 1000 # this is a hack used to determine if we
  127. # need to calculate the nasal acoustics
  128. # vocal tract acoustic tube structure
  129. radii = Vct.new(tractlength + 8)
  130. # the radii array contains the vocal tract section radii
  131. # (tractlength-1 of them), then glottal reflection gain then lip
  132. # reflection gain, then noise position, then noise gain, then noise
  133. # pole angle, then noise pole radius, then noise pole angle2, then
  134. # noise pole radius2, then velum opening radius
  135. 8.times do |i| radii[i] = 1.0 end
  136. radii[8] = 0.7
  137. radii[9] = -0.5
  138. coeffs = Vct.new(tractlength)
  139. dline1 = Vct.new(tractlength)
  140. dline2 = Vct.new(tractlength)
  141. # throat radiation low-pass filter
  142. lt = Vct.new(2)
  143. ltcoeff = 0.9995
  144. ltgain = 0.05 # a low order iir filter
  145. lip_radius = 0.0
  146. s_glot = 0.0
  147. s_glot_mix = 0.0
  148. s_noise = 0.0
  149. last_tract_plus = 0.0
  150. initial_noise_position = 0.0
  151. formant_shift = 1.0
  152. target_radii = Vct.new(tractlength + 8)
  153. 8.times do |i| target_radii[i] = 1.0 end
  154. target_radii[8] = 0.7
  155. target_radii[9] = -0.5
  156. radii_poles = Vct.new(tractlength + 8, dpole)
  157. radii_poles[2] = tong_hump_pole
  158. radii_poles[3] = tong_hump_pole
  159. radii_poles[4] = tong_hump_pole
  160. radii_poles[5] = tong_tip_pole
  161. radii_pole_gains = Vct.new(tractlength + 8, dgain)
  162. radii_pole_gains[2] = tong_hump_gain
  163. radii_pole_gains[3] = tong_hump_gain
  164. radii_pole_gains[4] = tong_hump_gain
  165. radii_pole_gains[5] = tong_tip_gain
  166. change_radii = 0
  167. glotsamp = 0.0
  168. delta = 0.0
  169. temp_arr = Vct.new(tractlength + 1)
  170. new_glot = 1
  171. first_glot = 1
  172. new_tract = 1
  173. first_tract = 1
  174. offset = -1
  175. next_offset = seconds2samples(start)
  176. last_sfd = -1
  177. last_gfd = -1
  178. run_instrument(start, dur) do |i|
  179. if i == next_offset
  180. # time to check for new tract shapes, glottal pulse shapes etc.
  181. offset += 1
  182. fnoiseamp = noiseamps[offset]
  183. if last_sfd == -1
  184. last_sfd = 0
  185. else
  186. new_sfd = last_sfd + tractlength + 8
  187. kk = new_sfd
  188. last_sfd.upto(new_sfd - 1) do |j|
  189. if (shape_data[j] - shape_data[kk]).abs > 0.001 then new_tract = 1 end
  190. kk += 1
  191. end
  192. last_sfd = new_sfd
  193. end
  194. if last_gfd == -1
  195. last_gfd = 0
  196. else
  197. last_gfd += 2
  198. end
  199. next_offset = change_times[offset + 1].to_i
  200. end
  201. if new_tract.nonzero?
  202. jj = last_sfd - 1
  203. target_radii.map! do |val| shape_data[jj += 1] end
  204. if first_tract == 1
  205. radii.map_with_index! do |val, j| target_radii[j] end
  206. end
  207. change_radii = 0
  208. initial_noise_position = radii[tractlength + 1]
  209. target_radii.zip(radii) do |t, r|
  210. if (t - r).abs > 0.001 then change_radii = 1 end
  211. end
  212. end
  213. if first_tract == 1 or change_radii.nonzero?
  214. if new_tract.zero?
  215. radii.map_with_index! do |val, j|
  216. val * radii_poles[j] + target_radii[j] * radii_pole_gains[j]
  217. end
  218. end
  219. # set tract shape
  220. temp_arr[0] = 1.0
  221. 1.upto(temp_arr.length - 1) do |j|
  222. temp_arr[j] = radii[j - 1] * radii[j - 1]
  223. if temp_arr[j].zero? then temp_arr[j] = 1e-10 end
  224. end
  225. 1.upto(tractlength - 1) do |j|
  226. coeffs[j] = (temp_arr[j - 1] - temp_arr[j]) / (temp_arr[j - 1] + temp_arr[j])
  227. end
  228. glot_refl_gain = radii[tractlength - 1]
  229. lip_refl_gain = radii[tractlength]
  230. noise_pos = radii[tractlength + 1].to_i
  231. noise_gain = radii[tractlength + 2]
  232. # fricative noise generator (set noise angle and radius)
  233. noise_angle = hz2radians(radii[tractlength + 3])
  234. noise_radius = radii[tractlength + 4]
  235. noise_a = -2.0 * cos(noise_angle / formant_shift) * noise_radius
  236. noise_b = noise_radius * noise_radius
  237. noise_angle2 = hz2radians(radii[tractlength + 5])
  238. noise_radius2 = radii[tractlength + 6]
  239. noise_a2 = -2.0 * cos(noise_angle2 / formant_shift) * noise_radius2
  240. noise_b2 = noise_radius2 * noise_radius2
  241. noise_c[0] = noise_a + noise_a2
  242. noise_c[1] = noise_b + noise_b2 + noise_a * noise_a2
  243. noise_c[2] = noise_a2 * noise_b + noise_b2 * noise_a
  244. noise_c[3] = noise_b2 * noise_b
  245. lip_radius = radii[tractlength - 2]
  246. velum_pos = radii[tractlength + 7]
  247. leftradius = radii[noseposition - 2]
  248. velumradius = velum_pos
  249. rightradius = radii[noseposition - 1]
  250. # nasal tract (set nasal shape)
  251. temp = [rightradius - velumradius, 0.0].max
  252. alpha[1] = leftradius * leftradius
  253. alpha[2] = temp * temp
  254. alpha[3] = velumradius * velumradius
  255. temp1 = 2.0 / (alpha[1] + alpha[2] + alpha[3])
  256. alpha[1] *= temp1
  257. alpha[2] *= temp1
  258. alpha[3] *= temp1
  259. end
  260. if new_tract.nonzero?
  261. new_tract = 0
  262. first_tract = 0
  263. if s_noise < 1.0 or fnoiseamp < 0.0001
  264. target_radii[tractlength + 1] = initial_noise_position
  265. end
  266. end
  267. if new_glot.nonzero?
  268. if first_glot.zero?
  269. glot_table2.map_with_index! do |val, j| glot_table[j] end
  270. end
  271. harms = glot_datai[last_gfd + 1].to_i
  272. a = glot_datar[last_gfd]
  273. b = glot_datar[last_gfd + 1]
  274. a2 = TWO_PI * a
  275. b2 = TWO_PI * b
  276. sines.fill(0.0)
  277. cosines.fill(0.0)
  278. if a != b
  279. temp = one_over_two_pi / (b - a)
  280. temp1 = 1.0 - cos(a2)
  281. sines[1] = (cos(a2) + (sin(a2) - sin(b2)) * temp) * temp1 * one_over_two_pi
  282. cosines[1] = (-sin(a2) + (cos(a2) - cos(b2)) * temp) * temp1 * one_over_two_pi
  283. end
  284. sines[1] = sines[1] + (0.75 + -cos(a2) + cos(2.0 * a2) * 0.25) * one_over_two_pi
  285. cosines[1] = cosines[1] + (sin(a2) - sin(2.0 * a2) * 0.25) * one_over_two_pi - a * 0.5
  286. ka1 = a2
  287. ka2 = 2 * a2
  288. ka3 = 3 * a2
  289. 2.upto(harms) do |k|
  290. if b != a
  291. temp = one_over_two_pi / ((b - a) * k)
  292. sines[k] = (cos(ka2) + (sin(ka2) - sin(k * b2)) * temp) * (temp1 / k)
  293. cosines[k] = (-sin(ka2) + (cos(ka2) - cos(k * b2)) * temp) * (temp1 / k)
  294. end
  295. sines[k] = sines[k] + ((1.0 - cos(ka2)) / k) + \
  296. ((cos(ka1) - 1.0) * 0.5) / (k - 1) + \
  297. ((cos(ka3) - 1.0) * 0.5) / (k + 1)
  298. sines[k] *= one_over_two_pi
  299. cosines[k] = cosines[k] + sin(ka2) / k - (sin(ka1) * 0.5) / (k - 1) - (sin(ka3) * 0.5) / (k + 1)
  300. cosines[k] *= one_over_two_pi
  301. ka1 += a2
  302. ka2 += a2
  303. ka3 += a2
  304. end
  305. glot_table.fill(0.0)
  306. x = 0.0
  307. glot_table.length.times do |j|
  308. 1.upto(harms) do |k|
  309. glot_table[j] = glot_table[j] + cosines[k] * cos(k * x) + sines[k] * sin(k * x)
  310. end
  311. x += two_pi_over_table_size
  312. end
  313. s_glot_mix = 1.0
  314. delta = 1.0 / (next_offset - i)
  315. if first_glot.nonzero?
  316. glot_table2.map_with_index! do |val, j| glot_table[j] end
  317. first_glot = 0
  318. end
  319. new_glot = 0
  320. end
  321. s_glot_mix -= delta
  322. s_glot = env(glot_env)
  323. s_noise = env(noise_env)
  324. pitch = env(frq_env)
  325. vibr_amt = env(vib_env)
  326. table_increment = pitch *
  327. (1.0 + vibr_amt * oscil(vib_osc) + rand_interp(ran_vib)) *
  328. table_size_over_sampling_rate
  329. last_lip_out = last_lip_in + last_tract_plus
  330. last_lip_refl = (last_lip_in + last_tract_plus) * lip_refl_gain
  331. last_lip_in = last_tract_plus
  332. # next glot tick
  333. glotsamp = dline2[1] * glot_refl_gain
  334. if table_increment.nonzero?
  335. table_location += table_increment
  336. if table_location >= table_size then table_location -= table_size end
  337. int_loc = table_location.floor
  338. table1 = glot_table[int_loc]
  339. table2 = glot_table2[int_loc]
  340. glotsamp = glotsamp + s_glot * (table1 + s_glot_mix * (table2 - table1))
  341. # glot noise tick
  342. if gn_table[int_loc].nonzero? and gn_gain.nonzero?
  343. gn_out = gn_gain * s_glot * (1.0 - random(2.0)) -
  344. gn_coeffs[3] * gn_del[3] -
  345. gn_coeffs[2] * gn_del[2] -
  346. gn_coeffs[1] * gn_del[1] -
  347. gn_coeffs[0] * gn_del[0]
  348. 3.downto(1) do |j| gn_del[j] = gn_del[j - 1] end
  349. gn_del[0] = gn_out
  350. end
  351. glotsamp = glotsamp + gn_out * gn_table[int_loc]
  352. end
  353. # next tract tick
  354. lt[0] = dline1[2] + dline2[2]
  355. dline2[1] = dline2[2] + coeffs[1] * (glotsamp - dline2[2])
  356. temp = glotsamp + (dline2[1] - dline2[2])
  357. 2.upto(noseposition - 1) do |j|
  358. dline2[j] = dline2[j + 1] + coeffs[j] * (dline1[j - 1] - dline2[j + 1])
  359. dline1[j - 1], temp = temp, dline1[j - 1] + (dline2[j] - dline2[j + 1])
  360. end
  361. jj = noseposition
  362. # next nasal tick
  363. plussamp = dline1[jj - 1]
  364. minussamp = dline2[jj + 1]
  365. nose_reftemp = 0.0
  366. if velum_pos.zero? and time_nose_closed >= nose_ring_time
  367. # nasal tick
  368. nose_reftemp = alpha[1] * plussamp + alpha[2] * minussamp + alpha[3] * nose2[1]
  369. nose_last_minus_refl = nose_reftemp - plussamp
  370. nose_last_plus_refl = nose_reftemp - minussamp
  371. else
  372. if velum_pos.nonzero?
  373. time_nose_closed = 0
  374. else
  375. time_nose_closed += 1
  376. end
  377. nose_reftemp = alpha[1] * plussamp + alpha[2] * minussamp + alpha[3] * nose2[1]
  378. plus_in = velum_pos * (nose_reftemp - nose2[1])
  379. nose_last_minus_refl = nose_reftemp - plussamp
  380. nose_last_plus_refl = nose_reftemp - minussamp
  381. nose_reftemp = nose_coeffs[1] * (plus_in - nose2[2])
  382. nose2[1] = nose2[2] + nose_reftemp
  383. nose_temp = plus_in + nose_reftemp
  384. 2.upto(noselength - 2) do |j|
  385. nose_reftemp = nose_coeffs[j] * (nose1[j - 1] - nose2[j + 1])
  386. nose2[j] = nose2[j + 1] + nose_reftemp
  387. nose1[j - 1], nose_temp = nose_temp, nose1[j - 1] + nose_reftemp
  388. end
  389. nose_reftemp = nose_coeffs[noselength - 1] * (nose1[noselength - 2] - nose_last_output * 0.25)
  390. nose2[noselength - 1] = nose_last_output * 0.25 + nose_reftemp
  391. nose1[noselength - 1] = nose1[noselength - 2] + nose_reftemp
  392. nose1[noselength - 2] = nose_temp
  393. nose_filt1, nose_filt = nose_filt, nose1[noselength - 1]
  394. nose_last_output = (nose_filt + nose_filt1) * 0.5
  395. end
  396. dline2[jj] = nose_last_minus_refl
  397. dline1[jj - 1], temp = temp, nose_last_plus_refl
  398. (noseposition + 1).upto(tractlength - 2) do |j|
  399. dline2[j] = dline2[j + 1] + coeffs[j] * (dline1[j - 1] - dline2[j + 1])
  400. dline1[j - 1], temp = temp, dline1[j - 1] + (dline2[j] - dline2[j + 1])
  401. end
  402. dline2[tractlength - 1] = last_lip_refl +
  403. coeffs[tractlength - 1] * (dline1[tractlength - 2] - last_lip_refl)
  404. dline1[tractlength - 1] = dline1[tractlength - 2] + (dline2[tractlength - 1] - last_lip_refl)
  405. dline1[tractlength - 2] = temp
  406. if noise_gain.nonzero?
  407. noise_input = 1.0 - random(2.0) # a guess
  408. 3.downto(1) do |j|
  409. outz[j] = outz[j - 1]
  410. end
  411. outz[0] = noise_output
  412. noise_output = noise_input - inz2
  413. 4.times do |j|
  414. noise_output = noise_output - noise_c[j] * outz[j]
  415. end
  416. inz2, inz1 = inz1, noise_input
  417. dline1[noise_pos] = dline1[noise_pos] + noise_output * noise_gain * s_noise
  418. end
  419. last_tract_plus = dline1[tractlength - 1] * lip_radius
  420. lt[1] = ltgain * (lt[0] + ltcoeff * lt[1])
  421. amp * (last_lip_out + nose_last_output + lt[1])
  422. end
  423. end
  424. Test_glt = [10, 0.65, 0.65]
  425. Loud_glt = [13, 0.6, 0.6]
  426. Soft_glt = [13, 0.65, 0.73]
  427. Wide4_glt = [18, 0.534, 0.56]
  428. Wide5_glt = [10, 0.65, 0.65]
  429. Greekdefault_glt = [20, 0.65, 0.672472]
  430. Lowbass_glt = [99, 0.5, 0.17737593]
  431. Aa_shp = [8, 0.63110816, 0.94615144, 1.0756062, 0.9254686, 0.9928594, 0.98307705,
  432. 1.4507878, 0.95167005, 0.9, -0.4, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
  433. Hh2_shp = [8, 0.928177, 0.61326, 0.39779, 0.530387, 0.679558, 0.961326, 1.44199,
  434. 1.09392, 0.7, -0.203125, 1.0, 0.0, 554.1667, 0.8, 2000.0, 0.772222, 0.0]
  435. Dhh_shp = [8, 0.828729, 1.45856, 0.9882353, 0.662983, 0.9352941, 1.2529411, 0.40588236,
  436. 1.1740758, 0.7, -0.140625, 7.0, 0.023333002, 3039.613, 0.691692, 1264.1677, 0.404788, 0.0]
  437. Aah_shp = [8, 0.8214024, 0.7839217, 1.0981537, 0.9937591, 0.817757, 1.1907763, 1.3149668,
  438. 1.0705689, 0.7, -0.4, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
  439. Hhh_shp = [8, 0.928177, 0.61326, 0.39779, 0.530387, 0.679558, 0.961326, 1.44199, 1.09392,
  440. 0.7, -0.203125, 1.0, 0.046296295, 554.1667, 0.8, 2000.0, 0.7722222, 0.0]
  441. Ohh_shp = [8, 1.02762, 0.696133, 0.39779, 0.513812, 0.6371682, 1.4070797, 1.80663, 0.5044248,
  442. 0.7, -0.2, 1.0, 0.0, 1000.0, 0.0, 0.0, 0.0, 0.0]
  443. Ah_shp = [8, 0.7162393, 0.6389201, 0.8881412, 0.6060006, 1.293248, 1.4140776, 1.8503952,
  444. 0.8622935, 0.9, -0.4, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
  445. Oo_shp = [8, 0.46043858, 1.0865723, 0.33916336, 0.88724023, 0.9989101, 1.224445, 0.39867023,
  446. 0.506609, 0.9, -0.4, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
  447. Ahh_shp = [8, 0.928177, 0.779006, 0.629834, 0.629834, 1.02762, 1.65746, 1.62431, 0.944751,
  448. 0.7, -0.45, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
  449. Eem_shp = [8, 0.928177, 1.37569, 1.37569, 0.679558, 0.629834, 0.24817872, 0.56896555, 0.662983,
  450. 0.7, -0.403125, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.09677419]
  451. Hoo_shp = [8, 1.32597, 1.29282, 0.39779, 0.530387, 1.32597, 1.34254, 1.78182, 0.46408796,
  452. 0.7, -0.4, 1.0, 0.031045755, 2215.7856, 0.82698005, 1026.6984, 0.96960765, 0.0]
  453. Ooo_shp = [8, 1.32597, 1.29282, 0.39779, 0.530387, 1.32597, 1.34254, 1.78182, 0.464088,
  454. 0.7, -0.4, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
  455. Ee_shp = [8, 1.02, 1.637, 1.67, 1.558, 0.952, 0.501, 0.681, 0.675, 0.9, -0.4, 1.0,
  456. 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
  457. Ih_shp = [8, 0.72092783, 1.2719809, 1.3881364, 0.6532612, 0.7501422, 0.65654784, 0.8194081,
  458. 0.6556785, 0.9, -0.4, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
  459. Ee2_shp = [8, 0.9180887, 1.3481673, 1.3433423, 0.74573994, 0.593326, 0.5647744, 0.6692766,
  460. 0.7419633, 0.7, -0.405254, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
  461. Ihh_shp = [8, 0.7906788, 1.272475, 1.4089537, 0.68072784, 0.62673146, 0.7479623, 0.7506758,
  462. 0.7054355, 0.9, -0.4, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
  463. Open_shp = [8, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 0.7, -0.45,
  464. 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0]
  465. Thh_shp = [8, 0.828729, 1.45856, 0.9882353, 0.662983, 0.9352941, 1.2529411, 0.40588236,
  466. 1.1740758, 0.7, -0.140625, 7.0, 0.101764, 3039.613, 0.691692, 1264.1677, 0.404788, 0.0]
  467. Aw_shp = [8, 1.0525645, 0.643587, 0.935229, 0.4901642, 1.0743295, 1.1822895, 1.4161918,
  468. 0.82537806, 0.9, -0.4, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
  469. Eee_shp = [8, 0.928177, 1.37569, 1.37569, 0.679558, 0.629834, 0.646409, 0.56896555, 0.662983,
  470. 0.7, -0.403125, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
  471. Ttp_shp = [8, 0.928177, 0.779006, 0.629834, 0.629834, 1.02762, 0.18584079, 1.62431, 0.944751,
  472. 0.7, -0.45, 6.0, 0.388889, 10514.583, 0.854335, 1315.2043, 0.280428, 0.0]
  473. Aww_shp = [8, 1.02762, 0.696133, 0.563536, 0.513812, 0.977901, 1.37569, 1.80663, 0.712707,
  474. 0.7, -0.2, 1.0, 0.0, 1000.0, 0.0, 0.0, 0.0, 0.0]
  475. Eee2_shp = [8, 0.928177, 1.37569, 1.37569, 0.679558, 0.629834, 0.646409, 0.5117647, 0.662983,
  476. 0.7, -0.203125, 7.3688526, 0.0, 5214.53, 0.975806, 0.0, 0.0, 0.0]
  477. Jjj_shp = [8, 0.928177, 0.779006, 0.629834, 0.629834, 1.02762, 0.1592921, 1.1464338, 0.944751,
  478. 0.7, -0.45, 6.0, 0.098039, 2315.7278, 0.7089554, 3066.7, 0.7983351, 0.0]
  479. Ttt_shp = [8, 0.928177, 0.779006, 0.629834, 0.629834, 1.02762, 0.0, 1.62431, 0.944751,
  480. 0.7, -0.45, 6.0, 0.388889, 10514.583, 0.854335, 1315.2043, 0.280428, 0.0]
  481. Bb2_shp = [8, 1.0, 1.0, 0.46902645, 0.5486725, 0.65486723, 1.079646, 1.3982301, 0.0,
  482. 0.7, -0.2, 8.0, 0.03, 500.0, 0.98, 0.0, 0.0, 0.0]
  483. Eh_shp = [8, 0.7866194, 1.1630946, 1.2335452, 0.93186677, 0.94121367, 0.7586716, 1.3509308,
  484. 0.8279036, 0.9, -0.4, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
  485. Kkp_shp = [8, 0.8214024, 0.7839217, 1.0981537, 0.1592921, 1.061947, 1.1907763, 1.3149668,
  486. 1.0705689, 0.7, -0.4, 4.0, 0.4, 2000.0, 0.93, 0.0, 0.0, 0.0]
  487. Pipe1_shp = [8, 1.0, 1.0, 1.0, 0.7, 0.7, 0.7, 0.7, 0.7, 0.0, 0.0, 1.0, 0.0, 100.0,
  488. 0.0, 0.0, 0.0, 0.0]
  489. Tzz_shp = [8, 0.828729, 1.45856, 0.9882353, 0.662983, 0.9352941, 1.2529411, 0.40588236,
  490. 1.1740758, 0.7, -0.140625, 7.0, 0.101764, 3039.613, 0.691692, 1264.1677, 0.404788, 0.0]
  491. Bbb_shp = [8, 1.0, 1.0, 0.46902645, 0.5486725, 0.65486723, 1.079646, 1.3982301, 0.0,
  492. 0.7, -0.2, 8.0, 0.03, 500.0, 0.98, 0.0, 0.0, 0.0]
  493. Ehh_shp = [8, 0.682, 1.554, 1.581, 1.367, 1.315, 1.579, 0.843, 1.476, 0.7, -0.24507,
  494. 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
  495. Kk2_shp = [8, 0.82140243, 0.7839217, 1.0981537, 0.0, 1.061947, 1.1907763, 1.3149668,
  496. 1.0705689, 0.7, -0.4, 5.0, 0.01, 2000.0, 0.93, 0.0, 0.0, 0.0]
  497. PpP_shp = [8, 1.0, 1.0, 0.3362832, 0.49557513, 0.7079646, 1.2389379, 1.1327434, 0.29203534,
  498. 0.7, -0.2, 8.0, 0.040740736, 0.0, 0.89649165, 2082.2144, 0.8713607, 0.0]
  499. Uhh_shp = [8, 0.928177, 0.61326, 0.39779, 0.530387, 0.679558, 0.961326, 1.44199, 1.09392,
  500. 0.7, -0.203125, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
  501. Big_shp = [8, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0]
  502. Euu_shp = [8, 0.9285748, 1.3756071, 1.3747121, 0.6794088, 0.60398144, 0.43471563,
  503. 0.8356653, 0.7158814, 0.7, -0.403122, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
  504. Kkk_shp = [8, 0.8214024, 0.7839217, 1.0981537, 0.0, 1.061947, 1.1907763, 1.3149668, 1.0705689,
  505. 0.7, -0.4, 4.0, 0.09444445, 2000.0, 0.93, 0.0, 0.0, 0.0]
  506. Ppp_shp = [8, 1.0, 1.0, 0.3362832, 0.49557513, 0.7079646, 1.2389379, 1.1327434, 0.0,
  507. 0.7, -0.2, 8.0, 0.05, 500.0, 0.98, 0.0, 0.0, 0.0]
  508. Uu_shp = [8, 0.45291674, 1.0539645, 0.39576897, 0.8116293, 1.0510263, 1.1789232, 0.47529656,
  509. 0.62563825, 0.9, -0.4, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
  510. Fff_shp = [8, 0.93787295, 0.70496833, 0.8969878, 0.60815966, 0.9375178, 0.7412625, 1.1285298,
  511. 0.2665695, 0.7, -0.202603, 8.0, 0.10341219, 8236.909, 0.945306, 79.28094, 0.498648, 0.0]
  512. Ll2_shp = [8, 0.928177, 0.779006, 0.71772796, 0.807417, 1.02762, 1.65746, 0.36206907,
  513. 0.86510503, 0.7, -0.258055, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.20806663]
  514. Uuu_shp = [8, 0.55, 0.943094, 1.035, 0.434071, 1.14681, 1.487, 0.555, 0.656, 0.9, -0.4,
  515. 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
  516. Lll_shp = [8, 0.928177, 0.779006, 0.7330638, 0.8156748, 1.02762, 1.65746, 0.3620689, 0.944751,
  517. 0.7, -0.103125, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.21774194]
  518. Rolledr_shp = [8, 0.3365169, 0.9244819, 1.0542682, 0.4485168, 1.0597233, 0.054845095,
  519. 0.66896766, 0.8336522, 0.9, -0.4, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
  520. Vvv_shp = [8, 0.9400966, 0.6775904, 0.88759726, 0.59890866, 0.9485658, 0.737778, 1.1542239,
  521. 0.23893797, 0.7, -0.2, 8.0, 0.5, 8500.0, 0.95, 0.0, 0.5, 0.0]
  522. Rolledrc_shp = [8, 0.928177, 0.779006, 0.629834, 0.629834, 1.02762, 0.0, 1.62431, 0.944751,
  523. 0.7, -0.45, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
  524. Mmm_shp = [8, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.7, -0.2,
  525. 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.503268]
  526. Rolledro_shp = [8, 0.928177, 0.779006, 0.629834, 0.629834, 1.02762, 0.42477876, 1.62431,
  527. 0.944751, 0.7, -0.45, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
  528. Breath_shp = [8, 0.928177, 0.779006, 0.629834, 0.629834, 1.02762, 1.65746, 1.62431, 0.944751,
  529. 0.7, -0.45, 1.0, 0.018518519, 2588.6013, 0.90612125, 812.6343, 0.9814815, 0.0]
  530. Moo_shp = [8, 1.32597, 1.29282, 0.39779, 0.530387, 1.32597, 1.34254, 1.78182, 0.0,
  531. 0.7, -0.4, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.30645162]
  532. Rr2_shp = [8, 0.3365169, 0.9244819, 1.0542682, 0.4485168, 1.0597233, 0.71856207,
  533. 0.66896766, 0.7274576, 0.9, -0.4, 1.0, 0.0, 0.0, 0.0, 0.0, 32.000004, 0.0]
  534. Chh_shp = [8, 0.928177, 0.779006, 0.629834, 0.629834, 1.02762, 0.1592921, 1.1464338,
  535. 0.944751, 0.7, -0.45, 6.0, 0.098039, 2315.7278, 0.7089554, 3066.7, 0.7983351, 0.0]
  536. Gg2_shp = [8, 0.8214024, 0.4122405, 0.40788835, 0.0, 0.8495575, 0.7129002, 0.7308959,
  537. 0.7785335, 0.7, -0.4, 4.0, 0.05, 2000.0, 0.9, 0.0, 0.0, 0.0]
  538. Nng_shp = [8, 1.0, 1.0, 1.0333333, 0.0, 1.0, 0.99999994, 0.9568965, 1.3189656,
  539. 0.7, -0.2, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0]
  540. Rrr_shp = [8, 0.3365169, 0.9244819, 1.0542682, 0.4485168, 1.0597233, 0.71856207,
  541. 0.66896766, 0.7274576, 0.9, -0.4, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
  542. Wsp_shp = [8, 0.928177, 0.779006, 0.629834, 0.629834, 1.02762, 1.65746, 1.62431,
  543. 0.944751, 0.7, -0.45, 1.0, 0.018518519, 0.0, 0.97, 0.0, 0.0, 0.0]
  544. Ggg_shp = [8, 0.8214024, 0.7839217, 1.0981537, 0.0, 0.8495575, 0.7129002, 0.7308959,
  545. 0.7785335, 0.7, -0.4, 4.0, 0.05, 2000.0, 0.9, 0.0, 0.0, 0.0]
  546. Nnn_shp = [8, 1.0, 1.0, 1.0, 1.4579439, 1.0, 0.0, 0.9568965, 1.3189656,
  547. 0.7, -0.2, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.503268]
  548. Sh2_shp = [8, 0.828729, 1.45856, 0.9882353, 0.662983, 0.9352941, 1.2529411, 0.40588236,
  549. 0.9882353, 0.7, -0.140625, 7.0, 0.0, 2451.5984, 0.928097, 2957.0518, 0.883636, 0.0]
  550. Xx2_shp = [8, 0.928177, 1.37569, 1.37569, 0.8495575, 0.3451327, 0.646409, 0.56896555, 0.662983,
  551. 0.7, -0.403125, 5.0, 0.022222, 2102.0833, 0.805556, 1735.4166, 0.759259, 0.0]
  552. Dd2_shp = [8, 0.928177, 0.779006, 0.629834, 0.629834, 1.02762, 0.0, 0.72165513, 0.5996184,
  553. 0.7, -0.45, 6.0, 0.02, 4851.6665, 0.953704, 2500.0, 0.966296, 0.0]
  554. Ggg1_shp = [8, 0.8214024, 0.7839217, 1.0981537, 0.18584079, 1.061947, 1.1907763,
  555. 1.3149668, 1.0705689, 0.7, -0.4, 4.0, 0.4, 2000.0, 0.9, 0.0, 0.0, 0.0]
  556. Noisahh_shp = [8, 0.928177, 0.779006, 0.629834, 0.629834, 1.02762, 1.65746, 1.62431, 0.944751,
  557. 0.7, -0.45, 1.0, 0.005, 0.0, 0.787037, 3777.0835, 0.759259, 0.0]
  558. Shh_shp = [8, 0.828729, 1.45856, 0.9882353, 0.662983, 0.9352941, 1.2529411, 0.40588236,
  559. 0.9882353, 0.7, -0.140625, 7.0, 0.023333, 2451.5984, 0.9280972, 2957.0518, 0.88363576, 0.0]
  560. Xxx_shp = [8, 0.928177, 1.37569, 1.37569, 0.3451327, 0.6371682, 0.646409, 0.56896555, 0.662983,
  561. 0.7, -0.403125, 4.0, 0.022222219, 2102.0833, 0.8055556, 612.5, 0.7592593, 0.0]
  562. Ddd_shp = [8, 0.928177, 0.779006, 0.629834, 0.629834, 1.02762, 0.0, 0.72165513, 0.5996184,
  563. 0.7, -0.45, 6.0, 0.02, 4851.6665, 0.953704, 2500.0, 0.966296, 0.0]
  564. Gxx_shp = [8, 0.928177, 1.37569, 1.37569, 0.3451327, 0.6371682, 0.646409, 0.56896555, 0.662983,
  565. 0.7, -0.403125, 4.0, 0.022222, 2102.0833, 0.805556, 612.5, 0.759259, 0.0]
  566. None_shp = [8, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
  567. Sss_shp = [8, 0.928177, 1.3588235, 1.3588235, 0.679558, 0.61764705, 0.63529414, 0.31764707,
  568. 0.65294117, 0.7, -0.103125, 7.0, 0.105292, 1500.0, 0.916452, 4943.75, 0.97222227, 0.0]
  569. Zzz_shp = [8, 0.928177, 1.3588235, 1.3588235, 0.679558, 0.61764705, 0.63529414, 0.31764707,
  570. 0.65294117, 0.7, -0.103125, 7.0, 0.016, 1500.0, 0.9257112, 4943.75, 0.925926, 0.0]
  571. =begin
  572. with_sound do
  573. singer(0, 0.1, [
  574. [0.4, Ehh_shp, Test_glt, 523.0, 0.8, 0.0, 0.01],
  575. [0.6, Oo_shp, Test_glt, 523.0, 0.7, 0.1, 0.01]])
  576. end
  577. =end
  578. =begin
  579. with_sound do
  580. singer(0.2, 0.1,[
  581. [0.05, Ehh_shp, Test_glt, 523.0, 0.8, 0.0, 0.01],
  582. [0.15, Ehh_shp, Test_glt, 523.0, 0.8, 0.0, 0.01],
  583. [0.05, Kkk_shp, Test_glt, 523.0, 0.0, 0.0, 0.01],
  584. [0.05, Kkk_shp, Test_glt, 523.0, 0.0, 0.0, 0.01],
  585. [0.02, Kkp_shp, Test_glt, 523.0, 0.0, 1.0, 0.01],
  586. [0.08, Kkp_shp, Test_glt, 523.0, 0.0, 0.2, 0.01],
  587. [0.05, Ooo_shp, Test_glt, 523.0, 0.8, 0.0, 0.01],
  588. [0.15, Ooo_shp, Test_glt, 523.0, 0.8, 0.0, 0.01],
  589. [0.05, Eee_shp, Test_glt, 523.0, 0.8, 0.0, 0.01],
  590. [0.15, Eee_shp, Test_glt, 523.0, 0.8, 0.0, 0.01],
  591. [0.05, Ehh_shp, Test_glt, 523.0, 0.8, 0.0, 0.01],
  592. [0.15, Ehh_shp, Test_glt, 523.0, 0.8, 0.0, 0.01],
  593. [0.05, Mmm_shp, Test_glt, 523.0, 0.8, 0.0, 0.01],
  594. [0.15, Mmm_shp, Test_glt, 523.0, 0.8, 0.0, 0.01],
  595. [0.10, Mmm_shp, Test_glt, 523.0, 0.0, 0.0, 0.01]])
  596. end
  597. =end
  598. # singer.rb ends here