使用timidity,ffmpeg和bash以编程方式将多个midi文件转换为wave

时间:2014-05-20 19:53:01

标签: bash file-io scripting ffmpeg midi

我正在尝试构建一个脚本,如标题所示,但我对Bash有些不熟悉,其他在线资源只是如此有用。

#! /bin/bash
function inout  #Create Function inout
{
    output[0]=" " #Initialize variables
    input[0]=" "
    count=1
    while [ "$count" -lt  10 ]; #Start loop to get all filenames
    do
        echo "Grabbing filename"             #User feedback

        input=$(ls | grep 0$count | grep MID | sed 's/ /\\ /g') #Grab filename
        #Replace ' ' character with '\ '
        output=$(echo $input | tr 'MID' 'mp3')
        #set output filename
        echo $count #Output variables for testing
        echo $input
        echo $output
        let count+=1 #Increment counter

        echo "converting $input to $output." #User feedback
        foo="timidity $input -Ow -o - | ffmpeg -i - -acodec libmp3lame -ab 320k $output"
        echo $foo
        #The last two lines are for the purpose of testing the full output
        #I can get the program to run if I copy and paste the output from above
        #but if I run it directly with the script it fails

    done
}

inout

我试图找出为什么我不能从脚本内部运行它,以及为什么我必须复制/粘贴$ foo的输出

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

无法从代码中判断输入文件是如何命名的;我会假设song_02.MID

之类的东西
inout () {
    for input in song_*.MID; do
        output=${input%.MID}.mp3
        timidity "$input" -Ow -o - | ffmpeg -i - -acodec libmp3lame -ab 320k "$output"
    done
}

它们的关键是定义一个匹配输入文件的适当模式,然后使用for循环遍历匹配的文件。

另外,您对tr的使用不正确:该调用会将所有MID替换为m,{{分别为1}}和p;它不会将{3}字符串3的出现替换为MID