txw.c
上传用户:shw771010
上传日期:2022-01-05
资源大小:991k
文件大小:10k
源码类别:

Audio

开发平台:

Unix_Linux

  1. /*
  2. ** Copyright (C) 2002-2009 Erik de Castro Lopo <erikd@mega-nerd.com>
  3. **
  4. ** This program is free software; you can redistribute it and/or modify
  5. ** it under the terms of the GNU Lesser General Public License as published by
  6. ** the Free Software Foundation; either version 2.1 of the License, or
  7. ** (at your option) any later version.
  8. **
  9. ** This program is distributed in the hope that it will be useful,
  10. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. ** GNU Lesser General Public License for more details.
  13. **
  14. ** You should have received a copy of the GNU Lesser General Public License
  15. ** along with this program; if not, write to the Free Software
  16. ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  17. */
  18. /*===========================================================================
  19. ** Yamaha TX16 Sampler Files.
  20. **
  21. ** This header parser was written using information from the SoX source code
  22. ** and trial and error experimentation. The code here however is all original.
  23. */
  24. #include "sfconfig.h"
  25. #include <stdio.h>
  26. #include <fcntl.h>
  27. #include <string.h>
  28. #include <ctype.h>
  29. #include "sndfile.h"
  30. #include "sfendian.h"
  31. #include "common.h"
  32. #if (ENABLE_EXPERIMENTAL_CODE == 0)
  33. int
  34. txw_open (SF_PRIVATE *psf)
  35. { if (psf)
  36. return SFE_UNIMPLEMENTED ;
  37. return 0 ;
  38. } /* txw_open */
  39. #else
  40. /*------------------------------------------------------------------------------
  41. ** Markers.
  42. */
  43. #define TXW_DATA_OFFSET 32
  44. #define TXW_LOOPED   0x49
  45. #define TXW_NO_LOOP   0xC9
  46. /*------------------------------------------------------------------------------
  47. ** Private static functions.
  48. */
  49. static int txw_read_header (SF_PRIVATE *psf) ;
  50. static sf_count_t txw_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len) ;
  51. static sf_count_t txw_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len) ;
  52. static sf_count_t txw_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len) ;
  53. static sf_count_t txw_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len) ;
  54. static sf_count_t txw_seek (SF_PRIVATE *psf, int mode, sf_count_t offset) ;
  55. /*------------------------------------------------------------------------------
  56. ** Public functions.
  57. */
  58. /*
  59.  * ftp://ftp.t0.or.at/pub/sound/tx16w/samples.yamaha
  60.  * ftp://ftp.t0.or.at/pub/sound/tx16w/faq/tx16w.tec
  61.  * http://www.t0.or.at/~mpakesch/tx16w/
  62.  *
  63.  * from tx16w.c sox 12.15: (7-Oct-98) (Mark Lakata and Leigh Smith)
  64.  *  char filetype[6] "LM8953"
  65.  *  nulls[10],
  66.  *  dummy_aeg[6]
  67.  *  format 0x49 = looped, 0xC9 = non-looped
  68.  *  sample_rate 1 = 33 kHz, 2 = 50 kHz, 3 = 16 kHz
  69.  *  atc_length[3] if sample rate 0, [2]&0xfe = 6: 33kHz, 0x10:50, 0xf6: 16,
  70.  * depending on [5] but to heck with it
  71.  *  rpt_length[3] (these are for looped samples, attack and loop lengths)
  72.  *  unused[2]
  73.  */
  74. typedef struct
  75. { unsigned char format, srate, sr2, sr3 ;
  76. unsigned short srhash ;
  77. unsigned int attacklen, repeatlen ;
  78. } TXW_HEADER ;
  79. #define ERROR_666 666
  80. int
  81. txw_open (SF_PRIVATE *psf)
  82. { int error ;
  83. if (psf->file.mode != SFM_READ)
  84. return SFE_UNIMPLEMENTED ;
  85. if ((error = txw_read_header (psf)))
  86. return error ;
  87.   if (psf_fseek (psf, psf->dataoffset, SEEK_SET) != psf->dataoffset)
  88. return SFE_BAD_SEEK ;
  89. psf->read_short = txw_read_s ;
  90. psf->read_int = txw_read_i ;
  91. psf->read_float = txw_read_f ;
  92. psf->read_double = txw_read_d ;
  93. psf->seek = txw_seek ;
  94. return 0 ;
  95. } /* txw_open */
  96. /*------------------------------------------------------------------------------
  97. */
  98. static int
  99. txw_read_header (SF_PRIVATE *psf)
  100. { TXW_HEADER txwh ;
  101. const char *strptr ;
  102. memset (&txwh, 0, sizeof (txwh)) ;
  103. memset (psf->u.cbuf, 0, sizeof (psf->u.cbuf)) ;
  104. psf_binheader_readf (psf, "pb", 0, psf->u.cbuf, 16) ;
  105. if (memcmp (psf->u.cbuf, "LM8953", 16) != 0)
  106. return ERROR_666 ;
  107. psf_log_printf (psf, "Read only : Yamaha TX-16 Sampler (.txw)nLM8953n") ;
  108. /* Jump 6 bytes (dummp_aeg), read format, read sample rate. */
  109. psf_binheader_readf (psf, "j11", 6, &txwh.format, &txwh.srate) ;
  110. /* 8 bytes (atc_length[3], rpt_length[3], unused[2]). */
  111. psf_binheader_readf (psf, "e33j", &txwh.attacklen, &txwh.repeatlen, 2) ;
  112. txwh.sr2 = (txwh.attacklen >> 16) & 0xFE ;
  113. txwh.sr3 = (txwh.repeatlen >> 16) & 0xFE ;
  114. txwh.attacklen &= 0x1FFFF ;
  115. txwh.repeatlen &= 0x1FFFF ;
  116. switch (txwh.format)
  117. { case TXW_LOOPED :
  118. strptr = "looped" ;
  119. break ;
  120. case TXW_NO_LOOP :
  121. strptr = "non-looped" ;
  122. break ;
  123. default :
  124. psf_log_printf (psf, " Format      : 0x%02x => ?????n", txwh.format) ;
  125. return ERROR_666 ;
  126. } ;
  127. psf_log_printf (psf, " Format      : 0x%02X => %sn", txwh.format, strptr) ;
  128. strptr = NULL ;
  129. switch (txwh.srate)
  130. { case 1 :
  131. psf->sf.samplerate = 33333 ;
  132. break ;
  133. case 2 :
  134. psf->sf.samplerate = 50000 ;
  135. break ;
  136. case 3 :
  137. psf->sf.samplerate = 16667 ;
  138. break ;
  139. default :
  140. /* This is ugly and braindead. */
  141. txwh.srhash = ((txwh.sr2 & 0xFE) << 8) | (txwh.sr3 & 0xFE) ;
  142. switch (txwh.srhash)
  143. { case ((0x6 << 8) | 0x52) :
  144. psf->sf.samplerate = 33333 ;
  145. break ;
  146. case ((0x10 << 8) | 0x52) :
  147. psf->sf.samplerate = 50000 ;
  148. break ;
  149. case ((0xF6 << 8) | 0x52) :
  150. psf->sf.samplerate = 166667 ;
  151. break ;
  152. default :
  153. strptr = " Sample Rate : Unknown : forcing to 33333n" ;
  154. psf->sf.samplerate = 33333 ;
  155. break ;
  156. } ;
  157. } ;
  158. if (strptr)
  159. psf_log_printf (psf, strptr) ;
  160. else if (txwh.srhash)
  161. psf_log_printf (psf, " Sample Rate : %d (0x%X) => %dn", txwh.srate, txwh.srhash, psf->sf.samplerate) ;
  162. else
  163. psf_log_printf (psf, " Sample Rate : %d => %dn", txwh.srate, psf->sf.samplerate) ;
  164. if (txwh.format == TXW_LOOPED)
  165. { psf_log_printf (psf, " Attack Len  : %dn", txwh.attacklen) ;
  166. psf_log_printf (psf, " Repeat Len  : %dn", txwh.repeatlen) ;
  167. } ;
  168. psf->dataoffset = TXW_DATA_OFFSET ;
  169. psf->datalength = psf->filelength - TXW_DATA_OFFSET ;
  170. psf->sf.frames = 2 * psf->datalength / 3 ;
  171. if (psf->datalength % 3 == 1)
  172. psf_log_printf (psf, "*** File seems to be truncated, %d extra bytes.n",
  173. (int) (psf->datalength % 3)) ;
  174. if (txwh.attacklen + txwh.repeatlen > psf->sf.frames)
  175. psf_log_printf (psf, "*** File has been truncated.n") ;
  176. psf->sf.format = SF_FORMAT_TXW | SF_FORMAT_PCM_16 ;
  177. psf->sf.channels = 1 ;
  178. psf->sf.sections = 1 ;
  179. psf->sf.seekable = SF_TRUE ;
  180. return 0 ;
  181. } /* txw_read_header */
  182. static sf_count_t
  183. txw_read_s (SF_PRIVATE *psf, short *ptr, sf_count_t len)
  184. { unsigned char *ucptr ;
  185. short sample ;
  186. int k, bufferlen, readcount, count ;
  187. sf_count_t total = 0 ;
  188. bufferlen = sizeof (psf->u.cbuf) / 3 ;
  189. bufferlen -= (bufferlen & 1) ;
  190. while (len > 0)
  191. { readcount = (len >= bufferlen) ? bufferlen : len ;
  192. count = psf_fread (psf->u.cbuf, 3, readcount, psf) ;
  193. ucptr = psf->u.ucbuf ;
  194. for (k = 0 ; k < readcount ; k += 2)
  195. { sample = (ucptr [0] << 8) | (ucptr [1] & 0xF0) ;
  196. ptr [total + k] = sample ;
  197. sample = (ucptr [2] << 8) | ((ucptr [1] & 0xF) << 4) ;
  198. ptr [total + k + 1] = sample ;
  199. ucptr += 3 ;
  200. } ;
  201. total += count ;
  202. len -= readcount ;
  203. } ;
  204. return total ;
  205. } /* txw_read_s */
  206. static sf_count_t
  207. txw_read_i (SF_PRIVATE *psf, int *ptr, sf_count_t len)
  208. { unsigned char *ucptr ;
  209. short sample ;
  210. int k, bufferlen, readcount, count ;
  211. sf_count_t total = 0 ;
  212. bufferlen = sizeof (psf->u.cbuf) / 3 ;
  213. bufferlen -= (bufferlen & 1) ;
  214. while (len > 0)
  215. { readcount = (len >= bufferlen) ? bufferlen : len ;
  216. count = psf_fread (psf->u.cbuf, 3, readcount, psf) ;
  217. ucptr = psf->u.ucbuf ;
  218. for (k = 0 ; k < readcount ; k += 2)
  219. { sample = (ucptr [0] << 8) | (ucptr [1] & 0xF0) ;
  220. ptr [total + k] = sample << 16 ;
  221. sample = (ucptr [2] << 8) | ((ucptr [1] & 0xF) << 4) ;
  222. ptr [total + k + 1] = sample << 16 ;
  223. ucptr += 3 ;
  224. } ;
  225. total += count ;
  226. len -= readcount ;
  227. } ;
  228. return total ;
  229. } /* txw_read_i */
  230. static sf_count_t
  231. txw_read_f (SF_PRIVATE *psf, float *ptr, sf_count_t len)
  232. { unsigned char *ucptr ;
  233. short sample ;
  234. int k, bufferlen, readcount, count ;
  235. sf_count_t total = 0 ;
  236. float normfact ;
  237. if (psf->norm_float == SF_TRUE)
  238. normfact = 1.0 / 0x8000 ;
  239. else
  240. normfact = 1.0 / 0x10 ;
  241. bufferlen = sizeof (psf->u.cbuf) / 3 ;
  242. bufferlen -= (bufferlen & 1) ;
  243. while (len > 0)
  244. { readcount = (len >= bufferlen) ? bufferlen : len ;
  245. count = psf_fread (psf->u.cbuf, 3, readcount, psf) ;
  246. ucptr = psf->u.ucbuf ;
  247. for (k = 0 ; k < readcount ; k += 2)
  248. { sample = (ucptr [0] << 8) | (ucptr [1] & 0xF0) ;
  249. ptr [total + k] = normfact * sample ;
  250. sample = (ucptr [2] << 8) | ((ucptr [1] & 0xF) << 4) ;
  251. ptr [total + k + 1] = normfact * sample ;
  252. ucptr += 3 ;
  253. } ;
  254. total += count ;
  255. len -= readcount ;
  256. } ;
  257. return total ;
  258. } /* txw_read_f */
  259. static sf_count_t
  260. txw_read_d (SF_PRIVATE *psf, double *ptr, sf_count_t len)
  261. { unsigned char *ucptr ;
  262. short sample ;
  263. int k, bufferlen, readcount, count ;
  264. sf_count_t total = 0 ;
  265. double normfact ;
  266. if (psf->norm_double == SF_TRUE)
  267. normfact = 1.0 / 0x8000 ;
  268. else
  269. normfact = 1.0 / 0x10 ;
  270. bufferlen = sizeof (psf->u.cbuf) / 3 ;
  271. bufferlen -= (bufferlen & 1) ;
  272. while (len > 0)
  273. { readcount = (len >= bufferlen) ? bufferlen : len ;
  274. count = psf_fread (psf->u.cbuf, 3, readcount, psf) ;
  275. ucptr = psf->u.ucbuf ;
  276. for (k = 0 ; k < readcount ; k += 2)
  277. { sample = (ucptr [0] << 8) | (ucptr [1] & 0xF0) ;
  278. ptr [total + k] = normfact * sample ;
  279. sample = (ucptr [2] << 8) | ((ucptr [1] & 0xF) << 4) ;
  280. ptr [total + k + 1] = normfact * sample ;
  281. ucptr += 3 ;
  282. } ;
  283. total += count ;
  284. len -= readcount ;
  285. } ;
  286. return total ;
  287. } /* txw_read_d */
  288. static sf_count_t
  289. txw_seek (SF_PRIVATE *psf, int mode, sf_count_t offset)
  290. { if (psf && mode)
  291. return offset ;
  292. return 0 ;
  293. } /* txw_seek */
  294. #endif