cpu51 发表于 2025-1-20 19:45:51

请教以下,音乐播放例程中,这2句这样写,有点不懂。

        play_lenth = ((u16)MusicPoint << 8)        + MusicPoint;   //       怎么算出来整个数组数量。为什么这样写。
        MusicPoint += 44;   //这句怎么理解?


_NCY_ 发表于 2025-1-21 03:46:51

可以参考WAV文件的结构解析,44是从那里面来的来的。
Load Music函数里有这么两句话 :
MusicPoint=Music;
MusicPoint+=44;
这两句,放在一起看MusicPoint就可以知道MusicPoint是Music,正好就是第一个有效PCM数据。WAV数据块就是从Music开始的。后面中断里的字节偏移,也就是基于MusicPoint的
WAV里对这个44要高度敏感

_NCY_ 发表于 2025-1-21 04:18:57

至于那个playlenth的计算同理。
Music~Music四个字节小端序表示数据块大小。
因为Music和Music都是00h,所以就只算了40与41

_NCY_ 发表于 2025-1-21 04:22:44

Music数组里存的是完整的wav文件数据。
就是能直接播放的wav歌曲,把二进制数据取模了而已。

cpu51 发表于 2025-1-23 11:06:01

wnagming 发表于 2025-1-20 20:21
play_lenth = ((u16)MusicPoint

40我懂,一行字节数是40,41是怎么算出来的,这有点不理解。
另外,为什么不直接算出来字节数,给play_lenth赋值?

soma 发表于 2025-1-23 11:32:42

应该和这个有关

cpu51 发表于 2025-1-23 15:24:23

soma 发表于 2025-1-23 11:32
应该和这个有关

明白了,这是转换后在hex代码中,有这个数量数据,我用WAVTOC软件转换出来的数据,就没有这个数量数据。不同软件转换不一样。谢谢您!

zrl 发表于 2025-2-3 15:04:56

cpu51 发表于 2025-1-23 15:24
明白了,这是转换后在hex代码中,有这个数量数据,我用WAVTOC软件转换出来的数据,就没有这个数量数据。 ...
如果是某些带创作人信息,专辑信息,歌曲名称等拓展标签头的wav,这样直接加44是读不准的,应该以data标签及其后面四字节指示的大小确定音频数据的开始和结束(文件末尾可能有歌词)
下面的图片就是一个例子
页: [1]
查看完整版本: 请教以下,音乐播放例程中,这2句这样写,有点不懂。