midi_synth.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714
  1. /*
  2. * sound/oss/midi_synth.c
  3. *
  4. * High level midi sequencer manager for dumb MIDI interfaces.
  5. */
  6. /*
  7. * Copyright (C) by Hannu Savolainen 1993-1997
  8. *
  9. * OSS/Free for Linux is distributed under the GNU GENERAL PUBLIC LICENSE (GPL)
  10. * Version 2 (June 1991). See the "COPYING" file distributed with this software
  11. * for more info.
  12. */
  13. /*
  14. * Thomas Sailer : ioctl code reworked (vmalloc/vfree removed)
  15. * Andrew Veliath : fixed running status in MIDI input state machine
  16. */
  17. #define USE_SEQ_MACROS
  18. #define USE_SIMPLE_MACROS
  19. #include "sound_config.h"
  20. #define _MIDI_SYNTH_C_
  21. #include "midi_synth.h"
  22. static int midi2synth[MAX_MIDI_DEV];
  23. static int sysex_state[MAX_MIDI_DEV] =
  24. {0};
  25. static unsigned char prev_out_status[MAX_MIDI_DEV];
  26. #define STORE(cmd) \
  27. { \
  28. int len; \
  29. unsigned char obuf[8]; \
  30. cmd; \
  31. seq_input_event(obuf, len); \
  32. }
  33. #define _seqbuf obuf
  34. #define _seqbufptr 0
  35. #define _SEQ_ADVBUF(x) len=x
  36. void
  37. do_midi_msg(int synthno, unsigned char *msg, int mlen)
  38. {
  39. switch (msg[0] & 0xf0)
  40. {
  41. case 0x90:
  42. if (msg[2] != 0)
  43. {
  44. STORE(SEQ_START_NOTE(synthno, msg[0] & 0x0f, msg[1], msg[2]));
  45. break;
  46. }
  47. msg[2] = 64;
  48. case 0x80:
  49. STORE(SEQ_STOP_NOTE(synthno, msg[0] & 0x0f, msg[1], msg[2]));
  50. break;
  51. case 0xA0:
  52. STORE(SEQ_KEY_PRESSURE(synthno, msg[0] & 0x0f, msg[1], msg[2]));
  53. break;
  54. case 0xB0:
  55. STORE(SEQ_CONTROL(synthno, msg[0] & 0x0f,
  56. msg[1], msg[2]));
  57. break;
  58. case 0xC0:
  59. STORE(SEQ_SET_PATCH(synthno, msg[0] & 0x0f, msg[1]));
  60. break;
  61. case 0xD0:
  62. STORE(SEQ_CHN_PRESSURE(synthno, msg[0] & 0x0f, msg[1]));
  63. break;
  64. case 0xE0:
  65. STORE(SEQ_BENDER(synthno, msg[0] & 0x0f,
  66. (msg[1] & 0x7f) | ((msg[2] & 0x7f) << 7)));
  67. break;
  68. default:
  69. /* printk( "MPU: Unknown midi channel message %02x\n", msg[0]); */
  70. ;
  71. }
  72. }
  73. EXPORT_SYMBOL(do_midi_msg);
  74. static void
  75. midi_outc(int midi_dev, int data)
  76. {
  77. int timeout;
  78. for (timeout = 0; timeout < 3200; timeout++)
  79. if (midi_devs[midi_dev]->outputc(midi_dev, (unsigned char) (data & 0xff)))
  80. {
  81. if (data & 0x80) /*
  82. * Status byte
  83. */
  84. prev_out_status[midi_dev] =
  85. (unsigned char) (data & 0xff); /*
  86. * Store for running status
  87. */
  88. return; /*
  89. * Mission complete
  90. */
  91. }
  92. /*
  93. * Sorry! No space on buffers.
  94. */
  95. printk("Midi send timed out\n");
  96. }
  97. static int
  98. prefix_cmd(int midi_dev, unsigned char status)
  99. {
  100. if ((char *) midi_devs[midi_dev]->prefix_cmd == NULL)
  101. return 1;
  102. return midi_devs[midi_dev]->prefix_cmd(midi_dev, status);
  103. }
  104. static void
  105. midi_synth_input(int orig_dev, unsigned char data)
  106. {
  107. int dev;
  108. struct midi_input_info *inc;
  109. static unsigned char len_tab[] = /* # of data bytes following a status
  110. */
  111. {
  112. 2, /* 8x */
  113. 2, /* 9x */
  114. 2, /* Ax */
  115. 2, /* Bx */
  116. 1, /* Cx */
  117. 1, /* Dx */
  118. 2, /* Ex */
  119. 0 /* Fx */
  120. };
  121. if (orig_dev < 0 || orig_dev > num_midis || midi_devs[orig_dev] == NULL)
  122. return;
  123. if (data == 0xfe) /* Ignore active sensing */
  124. return;
  125. dev = midi2synth[orig_dev];
  126. inc = &midi_devs[orig_dev]->in_info;
  127. switch (inc->m_state)
  128. {
  129. case MST_INIT:
  130. if (data & 0x80) /* MIDI status byte */
  131. {
  132. if ((data & 0xf0) == 0xf0) /* Common message */
  133. {
  134. switch (data)
  135. {
  136. case 0xf0: /* Sysex */
  137. inc->m_state = MST_SYSEX;
  138. break; /* Sysex */
  139. case 0xf1: /* MTC quarter frame */
  140. case 0xf3: /* Song select */
  141. inc->m_state = MST_DATA;
  142. inc->m_ptr = 1;
  143. inc->m_left = 1;
  144. inc->m_buf[0] = data;
  145. break;
  146. case 0xf2: /* Song position pointer */
  147. inc->m_state = MST_DATA;
  148. inc->m_ptr = 1;
  149. inc->m_left = 2;
  150. inc->m_buf[0] = data;
  151. break;
  152. default:
  153. inc->m_buf[0] = data;
  154. inc->m_ptr = 1;
  155. do_midi_msg(dev, inc->m_buf, inc->m_ptr);
  156. inc->m_ptr = 0;
  157. inc->m_left = 0;
  158. }
  159. } else
  160. {
  161. inc->m_state = MST_DATA;
  162. inc->m_ptr = 1;
  163. inc->m_left = len_tab[(data >> 4) - 8];
  164. inc->m_buf[0] = inc->m_prev_status = data;
  165. }
  166. } else if (inc->m_prev_status & 0x80) {
  167. /* Data byte (use running status) */
  168. inc->m_ptr = 2;
  169. inc->m_buf[1] = data;
  170. inc->m_buf[0] = inc->m_prev_status;
  171. inc->m_left = len_tab[(inc->m_buf[0] >> 4) - 8] - 1;
  172. if (inc->m_left > 0)
  173. inc->m_state = MST_DATA; /* Not done yet */
  174. else {
  175. inc->m_state = MST_INIT;
  176. do_midi_msg(dev, inc->m_buf, inc->m_ptr);
  177. inc->m_ptr = 0;
  178. }
  179. }
  180. break; /* MST_INIT */
  181. case MST_DATA:
  182. inc->m_buf[inc->m_ptr++] = data;
  183. if (--inc->m_left <= 0)
  184. {
  185. inc->m_state = MST_INIT;
  186. do_midi_msg(dev, inc->m_buf, inc->m_ptr);
  187. inc->m_ptr = 0;
  188. }
  189. break; /* MST_DATA */
  190. case MST_SYSEX:
  191. if (data == 0xf7) /* Sysex end */
  192. {
  193. inc->m_state = MST_INIT;
  194. inc->m_left = 0;
  195. inc->m_ptr = 0;
  196. }
  197. break; /* MST_SYSEX */
  198. default:
  199. printk("MIDI%d: Unexpected state %d (%02x)\n", orig_dev, inc->m_state, (int) data);
  200. inc->m_state = MST_INIT;
  201. }
  202. }
  203. static void
  204. leave_sysex(int dev)
  205. {
  206. int orig_dev = synth_devs[dev]->midi_dev;
  207. int timeout = 0;
  208. if (!sysex_state[dev])
  209. return;
  210. sysex_state[dev] = 0;
  211. while (!midi_devs[orig_dev]->outputc(orig_dev, 0xf7) &&
  212. timeout < 1000)
  213. timeout++;
  214. sysex_state[dev] = 0;
  215. }
  216. static void
  217. midi_synth_output(int dev)
  218. {
  219. /*
  220. * Currently NOP
  221. */
  222. }
  223. int midi_synth_ioctl(int dev, unsigned int cmd, void __user *arg)
  224. {
  225. /*
  226. * int orig_dev = synth_devs[dev]->midi_dev;
  227. */
  228. switch (cmd) {
  229. case SNDCTL_SYNTH_INFO:
  230. if (__copy_to_user(arg, synth_devs[dev]->info, sizeof(struct synth_info)))
  231. return -EFAULT;
  232. return 0;
  233. case SNDCTL_SYNTH_MEMAVL:
  234. return 0x7fffffff;
  235. default:
  236. return -EINVAL;
  237. }
  238. }
  239. EXPORT_SYMBOL(midi_synth_ioctl);
  240. int
  241. midi_synth_kill_note(int dev, int channel, int note, int velocity)
  242. {
  243. int orig_dev = synth_devs[dev]->midi_dev;
  244. int msg, chn;
  245. if (note < 0 || note > 127)
  246. return 0;
  247. if (channel < 0 || channel > 15)
  248. return 0;
  249. if (velocity < 0)
  250. velocity = 0;
  251. if (velocity > 127)
  252. velocity = 127;
  253. leave_sysex(dev);
  254. msg = prev_out_status[orig_dev] & 0xf0;
  255. chn = prev_out_status[orig_dev] & 0x0f;
  256. if (chn == channel && ((msg == 0x90 && velocity == 64) || msg == 0x80))
  257. { /*
  258. * Use running status
  259. */
  260. if (!prefix_cmd(orig_dev, note))
  261. return 0;
  262. midi_outc(orig_dev, note);
  263. if (msg == 0x90) /*
  264. * Running status = Note on
  265. */
  266. midi_outc(orig_dev, 0); /*
  267. * Note on with velocity 0 == note
  268. * off
  269. */
  270. else
  271. midi_outc(orig_dev, velocity);
  272. } else
  273. {
  274. if (velocity == 64)
  275. {
  276. if (!prefix_cmd(orig_dev, 0x90 | (channel & 0x0f)))
  277. return 0;
  278. midi_outc(orig_dev, 0x90 | (channel & 0x0f)); /*
  279. * Note on
  280. */
  281. midi_outc(orig_dev, note);
  282. midi_outc(orig_dev, 0); /*
  283. * Zero G
  284. */
  285. } else
  286. {
  287. if (!prefix_cmd(orig_dev, 0x80 | (channel & 0x0f)))
  288. return 0;
  289. midi_outc(orig_dev, 0x80 | (channel & 0x0f)); /*
  290. * Note off
  291. */
  292. midi_outc(orig_dev, note);
  293. midi_outc(orig_dev, velocity);
  294. }
  295. }
  296. return 0;
  297. }
  298. EXPORT_SYMBOL(midi_synth_kill_note);
  299. int
  300. midi_synth_set_instr(int dev, int channel, int instr_no)
  301. {
  302. int orig_dev = synth_devs[dev]->midi_dev;
  303. if (instr_no < 0 || instr_no > 127)
  304. instr_no = 0;
  305. if (channel < 0 || channel > 15)
  306. return 0;
  307. leave_sysex(dev);
  308. if (!prefix_cmd(orig_dev, 0xc0 | (channel & 0x0f)))
  309. return 0;
  310. midi_outc(orig_dev, 0xc0 | (channel & 0x0f)); /*
  311. * Program change
  312. */
  313. midi_outc(orig_dev, instr_no);
  314. return 0;
  315. }
  316. EXPORT_SYMBOL(midi_synth_set_instr);
  317. int
  318. midi_synth_start_note(int dev, int channel, int note, int velocity)
  319. {
  320. int orig_dev = synth_devs[dev]->midi_dev;
  321. int msg, chn;
  322. if (note < 0 || note > 127)
  323. return 0;
  324. if (channel < 0 || channel > 15)
  325. return 0;
  326. if (velocity < 0)
  327. velocity = 0;
  328. if (velocity > 127)
  329. velocity = 127;
  330. leave_sysex(dev);
  331. msg = prev_out_status[orig_dev] & 0xf0;
  332. chn = prev_out_status[orig_dev] & 0x0f;
  333. if (chn == channel && msg == 0x90)
  334. { /*
  335. * Use running status
  336. */
  337. if (!prefix_cmd(orig_dev, note))
  338. return 0;
  339. midi_outc(orig_dev, note);
  340. midi_outc(orig_dev, velocity);
  341. } else
  342. {
  343. if (!prefix_cmd(orig_dev, 0x90 | (channel & 0x0f)))
  344. return 0;
  345. midi_outc(orig_dev, 0x90 | (channel & 0x0f)); /*
  346. * Note on
  347. */
  348. midi_outc(orig_dev, note);
  349. midi_outc(orig_dev, velocity);
  350. }
  351. return 0;
  352. }
  353. EXPORT_SYMBOL(midi_synth_start_note);
  354. void
  355. midi_synth_reset(int dev)
  356. {
  357. leave_sysex(dev);
  358. }
  359. EXPORT_SYMBOL(midi_synth_reset);
  360. int
  361. midi_synth_open(int dev, int mode)
  362. {
  363. int orig_dev = synth_devs[dev]->midi_dev;
  364. int err;
  365. struct midi_input_info *inc;
  366. if (orig_dev < 0 || orig_dev > num_midis || midi_devs[orig_dev] == NULL)
  367. return -ENXIO;
  368. midi2synth[orig_dev] = dev;
  369. sysex_state[dev] = 0;
  370. prev_out_status[orig_dev] = 0;
  371. if ((err = midi_devs[orig_dev]->open(orig_dev, mode,
  372. midi_synth_input, midi_synth_output)) < 0)
  373. return err;
  374. inc = &midi_devs[orig_dev]->in_info;
  375. /* save_flags(flags);
  376. cli();
  377. don't know against what irqhandler to protect*/
  378. inc->m_busy = 0;
  379. inc->m_state = MST_INIT;
  380. inc->m_ptr = 0;
  381. inc->m_left = 0;
  382. inc->m_prev_status = 0x00;
  383. /* restore_flags(flags); */
  384. return 1;
  385. }
  386. EXPORT_SYMBOL(midi_synth_open);
  387. void
  388. midi_synth_close(int dev)
  389. {
  390. int orig_dev = synth_devs[dev]->midi_dev;
  391. leave_sysex(dev);
  392. /*
  393. * Shut up the synths by sending just single active sensing message.
  394. */
  395. midi_devs[orig_dev]->outputc(orig_dev, 0xfe);
  396. midi_devs[orig_dev]->close(orig_dev);
  397. }
  398. EXPORT_SYMBOL(midi_synth_close);
  399. void
  400. midi_synth_hw_control(int dev, unsigned char *event)
  401. {
  402. }
  403. EXPORT_SYMBOL(midi_synth_hw_control);
  404. int
  405. midi_synth_load_patch(int dev, int format, const char __user *addr,
  406. int offs, int count, int pmgr_flag)
  407. {
  408. int orig_dev = synth_devs[dev]->midi_dev;
  409. struct sysex_info sysex;
  410. int i;
  411. unsigned long left, src_offs, eox_seen = 0;
  412. int first_byte = 1;
  413. int hdr_size = (unsigned long) &sysex.data[0] - (unsigned long) &sysex;
  414. leave_sysex(dev);
  415. if (!prefix_cmd(orig_dev, 0xf0))
  416. return 0;
  417. if (format != SYSEX_PATCH)
  418. {
  419. /* printk("MIDI Error: Invalid patch format (key) 0x%x\n", format);*/
  420. return -EINVAL;
  421. }
  422. if (count < hdr_size)
  423. {
  424. /* printk("MIDI Error: Patch header too short\n");*/
  425. return -EINVAL;
  426. }
  427. count -= hdr_size;
  428. /*
  429. * Copy the header from user space but ignore the first bytes which have
  430. * been transferred already.
  431. */
  432. if(copy_from_user(&((char *) &sysex)[offs], &(addr)[offs], hdr_size - offs))
  433. return -EFAULT;
  434. if (count < sysex.len)
  435. {
  436. /* printk(KERN_WARNING "MIDI Warning: Sysex record too short (%d<%d)\n", count, (int) sysex.len);*/
  437. sysex.len = count;
  438. }
  439. left = sysex.len;
  440. src_offs = 0;
  441. for (i = 0; i < left && !signal_pending(current); i++)
  442. {
  443. unsigned char data;
  444. get_user(*(unsigned char *) &data, (unsigned char __user *) &((addr)[hdr_size + i]));
  445. eox_seen = (i > 0 && data & 0x80); /* End of sysex */
  446. if (eox_seen && data != 0xf7)
  447. data = 0xf7;
  448. if (i == 0)
  449. {
  450. if (data != 0xf0)
  451. {
  452. printk(KERN_WARNING "midi_synth: Sysex start missing\n");
  453. return -EINVAL;
  454. }
  455. }
  456. while (!midi_devs[orig_dev]->outputc(orig_dev, (unsigned char) (data & 0xff)) &&
  457. !signal_pending(current))
  458. schedule();
  459. if (!first_byte && data & 0x80)
  460. return 0;
  461. first_byte = 0;
  462. }
  463. if (!eox_seen)
  464. midi_outc(orig_dev, 0xf7);
  465. return 0;
  466. }
  467. EXPORT_SYMBOL(midi_synth_load_patch);
  468. void midi_synth_panning(int dev, int channel, int pressure)
  469. {
  470. }
  471. EXPORT_SYMBOL(midi_synth_panning);
  472. void midi_synth_aftertouch(int dev, int channel, int pressure)
  473. {
  474. int orig_dev = synth_devs[dev]->midi_dev;
  475. int msg, chn;
  476. if (pressure < 0 || pressure > 127)
  477. return;
  478. if (channel < 0 || channel > 15)
  479. return;
  480. leave_sysex(dev);
  481. msg = prev_out_status[orig_dev] & 0xf0;
  482. chn = prev_out_status[orig_dev] & 0x0f;
  483. if (msg != 0xd0 || chn != channel) /*
  484. * Test for running status
  485. */
  486. {
  487. if (!prefix_cmd(orig_dev, 0xd0 | (channel & 0x0f)))
  488. return;
  489. midi_outc(orig_dev, 0xd0 | (channel & 0x0f)); /*
  490. * Channel pressure
  491. */
  492. } else if (!prefix_cmd(orig_dev, pressure))
  493. return;
  494. midi_outc(orig_dev, pressure);
  495. }
  496. EXPORT_SYMBOL(midi_synth_aftertouch);
  497. void
  498. midi_synth_controller(int dev, int channel, int ctrl_num, int value)
  499. {
  500. int orig_dev = synth_devs[dev]->midi_dev;
  501. int chn, msg;
  502. if (ctrl_num < 0 || ctrl_num > 127)
  503. return;
  504. if (channel < 0 || channel > 15)
  505. return;
  506. leave_sysex(dev);
  507. msg = prev_out_status[orig_dev] & 0xf0;
  508. chn = prev_out_status[orig_dev] & 0x0f;
  509. if (msg != 0xb0 || chn != channel)
  510. {
  511. if (!prefix_cmd(orig_dev, 0xb0 | (channel & 0x0f)))
  512. return;
  513. midi_outc(orig_dev, 0xb0 | (channel & 0x0f));
  514. } else if (!prefix_cmd(orig_dev, ctrl_num))
  515. return;
  516. midi_outc(orig_dev, ctrl_num);
  517. midi_outc(orig_dev, value & 0x7f);
  518. }
  519. EXPORT_SYMBOL(midi_synth_controller);
  520. void
  521. midi_synth_bender(int dev, int channel, int value)
  522. {
  523. int orig_dev = synth_devs[dev]->midi_dev;
  524. int msg, prev_chn;
  525. if (channel < 0 || channel > 15)
  526. return;
  527. if (value < 0 || value > 16383)
  528. return;
  529. leave_sysex(dev);
  530. msg = prev_out_status[orig_dev] & 0xf0;
  531. prev_chn = prev_out_status[orig_dev] & 0x0f;
  532. if (msg != 0xd0 || prev_chn != channel) /*
  533. * Test for running status
  534. */
  535. {
  536. if (!prefix_cmd(orig_dev, 0xe0 | (channel & 0x0f)))
  537. return;
  538. midi_outc(orig_dev, 0xe0 | (channel & 0x0f));
  539. } else if (!prefix_cmd(orig_dev, value & 0x7f))
  540. return;
  541. midi_outc(orig_dev, value & 0x7f);
  542. midi_outc(orig_dev, (value >> 7) & 0x7f);
  543. }
  544. EXPORT_SYMBOL(midi_synth_bender);
  545. void
  546. midi_synth_setup_voice(int dev, int voice, int channel)
  547. {
  548. }
  549. EXPORT_SYMBOL(midi_synth_setup_voice);
  550. int
  551. midi_synth_send_sysex(int dev, unsigned char *bytes, int len)
  552. {
  553. int orig_dev = synth_devs[dev]->midi_dev;
  554. int i;
  555. for (i = 0; i < len; i++)
  556. {
  557. switch (bytes[i])
  558. {
  559. case 0xf0: /* Start sysex */
  560. if (!prefix_cmd(orig_dev, 0xf0))
  561. return 0;
  562. sysex_state[dev] = 1;
  563. break;
  564. case 0xf7: /* End sysex */
  565. if (!sysex_state[dev]) /* Orphan sysex end */
  566. return 0;
  567. sysex_state[dev] = 0;
  568. break;
  569. default:
  570. if (!sysex_state[dev])
  571. return 0;
  572. if (bytes[i] & 0x80) /* Error. Another message before sysex end */
  573. {
  574. bytes[i] = 0xf7; /* Sysex end */
  575. sysex_state[dev] = 0;
  576. }
  577. }
  578. if (!midi_devs[orig_dev]->outputc(orig_dev, bytes[i]))
  579. {
  580. /*
  581. * Hardware level buffer is full. Abort the sysex message.
  582. */
  583. int timeout = 0;
  584. bytes[i] = 0xf7;
  585. sysex_state[dev] = 0;
  586. while (!midi_devs[orig_dev]->outputc(orig_dev, bytes[i]) &&
  587. timeout < 1000)
  588. timeout++;
  589. }
  590. if (!sysex_state[dev])
  591. return 0;
  592. }
  593. return 0;
  594. }
  595. EXPORT_SYMBOL(midi_synth_send_sysex);