midi_synth.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:14k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

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