readViaLen.m
上传用户:abcwxk
上传日期:2016-05-20
资源大小:434k
文件大小:1k
源码类别:

midi

开发平台:

Visual C++

  1. % ------------------------------------------------------------------------------------------------
  2. function [value, len] = readViaLen(via)
  3. % description
  4. %     输入变长量开始的4字节数据,求出真实值value和变长量的长度len
  5. %     变长量,前n-1个元素最高位都为1,最后一个元素最高位为0,找到len
  6. %     剪去每个元素的最高位,乘以各自权值,输出value
  7. % 参考Borg.com+Midi+Specification.pdf
  8. %     Page154 - 157: viariable length quantities
  9. %     c routines
  10. % unsigned long ReadVarLen()
  11. % { register unsigned long value; register unsigned char c;
  12. % if ( (value = getc(infile)) & 0x80 ) 
  13. % { value &= 0x7F; 
  14. % do { value = (value << 7) + ((c = getc(infile)) & 0x7F); } 
  15. % while (c & 0x80); 
  16. % } 
  17. % return(value);}
  18. %     2008.9.22 17:06
  19. len = 1;
  20. value = 0;
  21. for i=1:4
  22.     temp = bitand(via(i), 128) % 1000 0000b 128oct
  23.     if temp
  24.         % 最高位为1
  25.         value = (double(value) + double(bitand(via(i), 127))  ) * 2^7; % 0111 1111b 127oct
  26.         len = len + 1;
  27.     else
  28.         value = double(value) + double(via(i));
  29.         break
  30.     end
  31. end
  32. return;