Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将wav文件转换为txt文件_Java_Audio_Wav - Fatal编程技术网

Java 将wav文件转换为txt文件

Java 将wav文件转换为txt文件,java,audio,wav,Java,Audio,Wav,谢谢你阅读这篇文章 我想做的是把一个.wav文件(只有一个短音频)转换成int,每个文件代表一个音频的音调。。。 如果你问我为什么要这样做,是因为我在做一个arduino项目,我想让arduino播放一首歌,为了做到这一点,我需要一个int数组,其中每个int都是一个音调。 所以我想,“如果我编写一个小应用程序,将任何.wav文件转换成txt文件,其中存储代表旋律音符的整数,我只需要将这些值复制到arduino项目代码中”; 所以在这一切之后,也许你会问“你有什么问题?”; 我做的代码,是“工作

谢谢你阅读这篇文章 我想做的是把一个.wav文件(只有一个短音频)转换成int,每个文件代表一个音频的音调。。。 如果你问我为什么要这样做,是因为我在做一个arduino项目,我想让arduino播放一首歌,为了做到这一点,我需要一个int数组,其中每个int都是一个音调。 所以我想,“如果我编写一个小应用程序,将任何.wav文件转换成txt文件,其中存储代表旋律音符的整数,我只需要将这些值复制到arduino项目代码中”; 所以在这一切之后,也许你会问“你有什么问题?”; 我做的代码,是“工作”,唯一的问题是,文本只有“1024”在每一行。。。 所以很明显我有个问题,不,所有的音调都是1024-_-

package WaveToText;

import java.io.*;

/**
*
* @author  Luis Miguel Mejía Suárez
* @project This porject is to convert a wav music files to a int array
*          Which is going to be printed in a txt file to be used for an arduino
* @serial  1.0.1 (05/11/201)
*/

public final class Converter 
{
/**
 * 
 * @Class Here is where is going to be allowed all the code for the application
 * 
 * @Param Text is an .txt file where is going to be stored the ints
 * @Param MyFile is the input of the wav file to be converted
 */

PrintStream Text;
InputStream MyFile;

public Converter () throws FileNotFoundException, IOException
{
        MyFile = new FileInputStream("C:\\Users\\luismiguel\\Dropbox\\ESTUDIO\\PROGRAMAS\\JAVA\\WavToText\\src\\WaveToText\\prueba.wav");
        Text = new PrintStream(new File("Notes.txt"));
}

public void ConvertToTxt() throws IOException
{
    BufferedInputStream in = new BufferedInputStream(MyFile);

    int read;

    byte[] buff = new byte[1024];
    while ((read = in.read(buff)) > 0)
    {
        Text.println(read);
    }
    Text.close();
}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) throws IOException{
    // TODO code application logic here
    Converter Exc = new Converter();
    Exc.ConvertToTxt();        
}
}

此位代码从中的
读取1024字节的数据,然后将读取的字节数分配给
读取
,即1024字节,直到文件结束。然后将
read
打印到文本文件中

您可能希望将
buff
打印到文本文件中,但这将写入1024个字节,而不是您想要的1024个整数

您需要创建一个for循环,以将各个字节打印为int

while ((read = in.read(buff)) > 0)
{
    for (int i = 0; i < buff.length; i++) 
        Text.print((int)buff[i]);
}
while((read=in.read(buff))>0)
{
for(int i=0;i
等待。。。。。很多东西都不在这里。。。。 您不能只是读取字节并将其发送给Arduino,因为正如您所说的,Arduino需要注释编号。Wav文件中的数字首先是包含音频信息的“标题”,然后是表示信号(波形)中离散点的数字。如果你想得到音符,你需要一些音调检测或音乐转录算法。
如果您的音乐是单声道的或接近单声道的,音调检测可能会起作用。对于全乐队歌曲来说,这将是一件麻烦的事
所以
我猜“Arduino部分”将播放单声道音乐,您需要提取特定时刻信号的基频(这称为音调检测,有不同的方法(自相关、amdf、频谱分析))。您还必须保持音符的计时。

提取频率时,有一个公式可以将频率转换为整数,表示钢琴上的音符编号。n=12(log2(f/440))+49,其中n是整数音符数,f是音符的基频。在计算之前,您还应该将从音高识别算法获得的频率量化到最接近的频率(谷歌搜索准确的音符频率)。


然而,我真的建议做更多的研究。在一种乐器不多、鼓不多、歌手不多的音乐中,很难发现音符。

你的一般方法一开始就不太正确。WAV文件存储时域数据;也就是说,信号与时间(例如,440 Hz音调可能是,例如,WAV文件中440 Hz正弦波的采样值)。你对“音调”的概念是频域的;也就是说,信号强度与频率。您需要执行某种类型的频率分析(查找离散FFT)以从WAV文件中的原始波形中提取“旋律”信息,或者需要修改硬件,让Arduino播放原始数字音频,而不是参数化频率。顺便说一下,对于文件格式本身,这里有一个读取数据的好例子。但是,您最好使用一个已经为您完成了这项工作(并且只支持WAV之外的格式)的。另请参见,其中描述了一些与Java Sound API集成的FFT库。无论该方法是否正确,我都在回答中提供了代码的问题。希望能有帮助。我尝试了一些与你(CharlieS)所说的“相似”的东西,我说相似是因为输出文件完全相同,这有很多不同的数字,但没有一个是我所期望的;我想是因为Alexander所说的,所以我要试着这样做。。。我也尝试了音频输入流,但我得到了“UnsupportedAudioFileException”,无论如何,谢谢大家的帮助
while ((read = in.read(buff)) > 0)
{
    for (int i = 0; i < buff.length; i++) 
        Text.print((int)buff[i]);
}