サンプルコード

spaudio

フルデュプレックスI/O

iotest.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import spaudio

a = spaudio.SpAudio()

a.setnchannels(2)
a.setsamprate(44100)
a.setbuffersize(2048)

nloop = 500
b = bytearray(4096)

a.open('r')
a.open('w')

for i in range(nloop):
    a.readraw(b)
    a.writeraw(b)

a.close()

フルデュプレックスI/O( with 文を使用; バージョン0.7.15以降)

iotestwith.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Version 0.7.15+ required.

import spaudio

with spaudio.open('rw', nchannels=2, samprate=44100, buffersize=2048) as a:
    nloop = 500
    b = bytearray(4096)

    for i in range(nloop):
        a.readraw(b)
        a.writeraw(b)

読み込みとプロット(Python配列バージョン)

readplot.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import spaudio
import matplotlib.pyplot as plt

a = spaudio.SpAudio()

a.setnchannels(1)
a.setsamprate(8000)

a.open('ro')

b = a.createarray(16000)

nread = a.read(b)
print('nread = %d' % nread)

a.close()

a.open('wo')

nwrite = a.write(b)
print('nwrite = %d' % nwrite)

a.close()

plt.plot(b)
plt.show()

読み込みとプロット(Rawデータバージョン)

readplotraw.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import spaudio
import matplotlib.pyplot as plt

a = spaudio.SpAudio()

a.setnchannels(1)
a.setsamprate(8000)

a.open('ro')

b = a.createrawarray(16000)

nread = a.readraw(b)
print('nread = %d' % nread)

a.close()

a.open('wo')

nwrite = a.writeraw(b)
print('nwrite = %d' % nwrite)

a.close()

plt.plot(b)
plt.show()

読み込みとプロット(NumPy ndarrayバージョン)

readndarray.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt
import spaudio

a = spaudio.SpAudio()

a.setnchannels(1)
a.setsamprate(8000)

a.open('ro')

y = a.createndarray(16000)

nread = a.read(y)
print('nread = %d' % nread)

a.close()

a.open('wo')

nwrite = a.write(y)
print('nwrite = %d' % nwrite)

a.close()

x = np.linspace(0.0, 2.0, 16000)
plt.plot(x, y)
plt.xlim(0.0, 2.0)
plt.xlabel('Time [s]')
plt.ylabel('Amplitude (normalized)')
plt.show()

読み込みとプロット(NumPy ndarrayバージョン; with 文を使用; バージョン0.7.16以降)

readndarray2.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Version 0.7.16+ required.

import numpy as np
import matplotlib.pyplot as plt
import spaudio

with spaudio.open('ro', nchannels=2, samprate=44100) as a:
    y = a.readframes(44100, channelwise=True)
    print('nread = %d' % len(y))

    x = np.linspace(0.0, 1.0, 44100)
    for i in range(a.getnchannels()):
        plt.plot(x, y[:, i])
    plt.xlabel('Time [s]')
    plt.ylabel('Amplitude (normalized)')
    plt.show()

読み込みとプロット(NumPy Raw ndarrayバージョン)

readrawndarray.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt
import spaudio

a = spaudio.SpAudio()

a.setnchannels(1)
a.setsamprate(8000)

a.open('ro')

y = a.createrawndarray(16000)

nread = a.readraw(y)
print('nread = %d' % nread)

a.close()

a.open('wo')

nwrite = a.writeraw(y)
print('nwrite = %d' % nwrite)

a.close()

x = np.linspace(0.0, 2.0, 16000)
plt.plot(x, y)
plt.xlim(0.0, 2.0)
plt.xlabel('Time [s]')
plt.ylabel('Amplitude (raw)')
plt.show()

WAVファイルの再生

playfromwav.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import sys
import wave
import spaudio


def playfromwav(filename):
    with wave.open(filename, 'rb') as wf:
        nchannels = wf.getnchannels()
        samprate = wf.getframerate()
        sampwidth = wf.getsampwidth()
        nframes = wf.getnframes()
        print('nchannels = %d, samprate = %d, sampwidth = %d, nframes = %d'
              % (nchannels, samprate, sampwidth, nframes))

        a = spaudio.SpAudio()

        a.setnchannels(nchannels)
        a.setsamprate(samprate)
        a.setsampwidth(sampwidth)

        b = wf.readframes(nframes)

        a.open('wo')

        nwrite = a.writeraw(b)
        print('nwrite = %d' % nwrite)

        a.close()


if __name__ == '__main__':
    if len(sys.argv) <= 1:
        print('usage: %s filename'
              % os.path.basename(sys.argv[0]), file=sys.stderr)
        quit()

    playfromwav(sys.argv[1])

WAVファイルの再生( with 文を使用; バージョン0.7.15以降)

playfromwav2.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Version 0.7.15+ required.

import os
import sys
import wave
import spaudio


def playfromwav2(filename):
    with wave.open(filename, 'rb') as wf:
        paramstuple = wf.getparams()
        print('nchannels = %d, framerate = %d, sampwidth = %d, nframes = %d'
              % (paramstuple.nchannels, paramstuple.framerate,
                 paramstuple.sampwidth, paramstuple.nframes))

        with spaudio.open('wo', params=paramstuple) as a:
            b = wf.readframes(paramstuple.nframes)
            nwrite = a.writeraw(b)
            print('nwrite = %d' % nwrite)


if __name__ == '__main__':
    if len(sys.argv) <= 1:
        print('usage: %s filename'
              % os.path.basename(sys.argv[0]), file=sys.stderr)
        quit()

    playfromwav2(sys.argv[1])

WAVファイルの再生(コールバックあり)

playfromwavcb.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import sys
import wave
import spaudio


def myaudiocb(audio, cbtype, cbdata, args):
    if cbtype == spaudio.OUTPUT_POSITION_CALLBACK:
        position = cbdata
        samprate = args[0]
        nframes = args[1]
        position_s = float(position) / float(samprate)
        total_s = float(nframes) / float(samprate)
        sys.stdout.write('Time: %.3f / %.3f\r' % (position_s, total_s))
    elif cbtype == spaudio.OUTPUT_BUFFER_CALLBACK:
        buf = cbdata
        # print('OUTPUT_BUFFER_CALLBACK: buffer type = %s, size = %d' % (type(buf), len(buf)))
    return True


def playfromwav(filename):
    with wave.open(filename, 'rb') as wf:
        nchannels = wf.getnchannels()
        samprate = wf.getframerate()
        sampwidth = wf.getsampwidth()
        nframes = wf.getnframes()
        print('nchannels = %d, samprate = %d, sampwidth = %d, nframes = %d'
              % (nchannels, samprate, sampwidth, nframes))

        a = spaudio.SpAudio()

        a.setbuffersize(1024)
        a.setnchannels(nchannels)
        a.setsamprate(samprate)
        a.setsampwidth(sampwidth)

        b = wf.readframes(nframes)

        a.setcallback(spaudio.OUTPUT_POSITION_CALLBACK | spaudio.OUTPUT_BUFFER_CALLBACK,
                      myaudiocb, samprate, nframes)

        a.open('wo')

        nwrite = a.writeraw(b)
        # print('nwrite = %d' % nwrite)

        a.close()


if __name__ == '__main__':
    if len(sys.argv) <= 1:
        print('usage: %s filename'
              % os.path.basename(sys.argv[0]), file=sys.stderr)
        quit()

    playfromwav(sys.argv[1])

WAVファイルの再生(コールバックあり; with 文を使用; バージョン0.7.15以降)

playfromwavcb2.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import sys
import wave
import spaudio


def myaudiocb(audio, cbtype, cbdata, args):
    if cbtype == spaudio.OUTPUT_POSITION_CALLBACK:
        position = cbdata
        samprate = args[0]
        nframes = args[1]
        position_s = float(position) / float(samprate)
        total_s = float(nframes) / float(samprate)
        sys.stdout.write('Time: %.3f / %.3f\r' % (position_s, total_s))
    elif cbtype == spaudio.OUTPUT_BUFFER_CALLBACK:
        buf = cbdata
        # print('OUTPUT_BUFFER_CALLBACK: buffer type = %s, size = %d' % (type(buf), len(buf)))
    return True


def playfromwav2(filename):
    with wave.open(filename, 'rb') as wf:
        paramstuple = wf.getparams()
        print('nchannels = %d, samprate = %d, sampwidth = %d, nframes = %d'
              % (paramstuple.nchannels, paramstuple.framerate,
                 paramstuple.sampwidth, paramstuple.nframes))

        with spaudio.open('wo', params=paramstuple, buffersize=1024,
                          callback=(spaudio.OUTPUT_POSITION_CALLBACK | spaudio.OUTPUT_BUFFER_CALLBACK,
                                    myaudiocb, paramstuple.framerate, paramstuple.nframes)) as a:
            b = wf.readframes(paramstuple.nframes)
            nwrite = a.writeraw(b)


if __name__ == '__main__':
    if len(sys.argv) <= 1:
        print('usage: %s filename'
              % os.path.basename(sys.argv[0]), file=sys.stderr)
        quit()

    playfromwav2(sys.argv[1])

WAVファイルへの録音

rectowav.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
import argparse
import wave
import spaudio


def rectowav(filename, samprate, nchannels, sampwidth, duration):
    with wave.open(filename, 'wb') as wf:
        nframes = round(duration * samprate)
        print('nchannels = %d, samprate = %d, sampwidth = %d, nframes = %d'
              % (nchannels, samprate, sampwidth, nframes))

        a = spaudio.SpAudio()

        a.setnchannels(nchannels)
        a.setsamprate(samprate)
        a.setsampwidth(sampwidth)

        a.open('ro')

        b = a.createrawarray(nframes * nchannels)

        nread = a.readraw(b)
        print('nread = %d' % nread)

        a.close()

        wf.setnchannels(nchannels)
        wf.setframerate(samprate)
        wf.setsampwidth(sampwidth)
        wf.setnframes(nframes)

        wf.writeframes(b)
        print('output file: %s' % filename, file=sys.stderr)


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Record to a wave file')
    parser.add_argument('filename', help='name of output wave file')
    parser.add_argument('-f', '--samprate', type=int,
                        default=8000, help='sampling rate [Hz]')
    parser.add_argument('-c', '--nchannels', type=int,
                        default=1, help='number of channels')
    parser.add_argument('-w', '--sampwidth', type=int,
                        default=2, help='sample width [byte]')
    parser.add_argument('-d', '--duration', type=float,
                        default=2.0, help='recording duration [s]')
    args = parser.parse_args()

    rectowav(args.filename, args.samprate, args.nchannels,
             args.sampwidth, args.duration)

WAVファイルへの録音( with 文を使用; バージョン0.7.15以降)

rectowav2.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Version 0.7.15+ required.

import sys
import argparse
import wave
import spaudio


def rectowav2(filename, samprate, nchannels, sampwidth, duration):
    with wave.open(filename, 'wb') as wf:
        nframes = round(duration * samprate)
        print('nchannels = %d, samprate = %d, sampwidth = %d, nframes = %d'
              % (nchannels, samprate, sampwidth, nframes))

        with spaudio.open('ro', nchannels=nchannels, samprate=samprate,
                          sampbit=(8 * sampwidth)) as a:
            b = a.createrawarray(nframes * nchannels)

            nread = a.readraw(b)
            print('nread = %d' % nread)

            paramstuple = a.getparamstuple(True, nframes)
            wf.setparams(paramstuple)
            wf.writeframes(b)
            print('output file: %s' % filename, file=sys.stderr)


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Record to a wave file')
    parser.add_argument('filename', help='name of output wave file')
    parser.add_argument('-f', '--samprate', type=int,
                        default=8000, help='sampling rate [Hz]')
    parser.add_argument('-c', '--nchannels', type=int,
                        default=1, help='number of channels')
    parser.add_argument('-w', '--sampwidth', type=int,
                        default=2, help='sample width [byte]')
    parser.add_argument('-d', '--duration', type=float,
                        default=2.0, help='recording duration [s]')
    args = parser.parse_args()

    rectowav2(args.filename, args.samprate, args.nchannels,
              args.sampwidth, args.duration)

ブロックごとに読み込み(バージョン0.7.15以降)

blockread.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Version 0.7.15+ required.

import spaudio

blocklen = 8192
nchannels = 2
samprate = 44100
nframes = 88200  # 2.0 [s]

a = spaudio.SpAudio()

a.open('ro', nchannels=nchannels, samprate=samprate)
b = a.createarray(nframes, True)
nloop = ((nframes * nchannels) + blocklen - 1) // blocklen  # ceil

for i in range(nloop):
    nread = a.read(b, offset=(i * blocklen), length=blocklen)
    print('%d: nread = %d' % (i, nread))

a.close()

a.open('wo', nchannels=nchannels, samprate=samprate)

nwrite = a.write(b)
print('nwrite = %d' % nwrite)

a.close()

ブロックごとに書き込み(バージョン0.7.15以降)

blockwrite.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Version 0.7.15+ required.

import spaudio

blocklen = 8192
nchannels = 2
samprate = 44100
nframes = 88200  # 2.0 [s]

a = spaudio.SpAudio()

a.open('ro', nchannels=nchannels, samprate=samprate)
b = a.createarray(nframes, True)

nread = a.read(b)
print('nread = %d' % nread)

a.close()

a.open('wo', nchannels=nchannels, samprate=samprate)
nloop = ((nframes * nchannels) + blocklen - 1) // blocklen  # ceil

for i in range(nloop):
    nwrite = a.write(b, offset=(i * blocklen), length=blocklen)
    print('%d: write = %d' % (i, nwrite))

a.close()

readframes()writeframes() の使用例(バージョン0.7.16以降)

rwframesexample.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Version 0.7.16+ required.

import spaudio

blocklen = 8192
nchannels = 2
samprate = 44100
nframes = 88200  # 2.0 [s]

a = spaudio.SpAudio()

a.open('ro', nchannels=nchannels, samprate=samprate)

b = a.readframes(nframes, arraytype='array')
print('nread = %d' % len(b))

a.close()

a.open('wo', nchannels=nchannels, samprate=samprate)

nwframes = a.writeframes(b)
print('write frames = %d' % nwframes)

a.close()

spplugin

audioread() の使用例(バージョン0.7.16以降)

audioreadexample.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Version 0.7.16+ required.

import os
import sys
import spplugin
import spaudio


def audioreadexample(filename):
    data, samprate, params = spplugin.audioread(filename)
    print('samprate = ' + str(samprate) + ', params =\n' + str(params))

    with spaudio.open('wo', params=params) as a:
        nwframes = a.writeframes(data)
        print('write frames = %d' % nwframes)


if __name__ == '__main__':
    if len(sys.argv) <= 1:
        print('usage: %s filename'
              % os.path.basename(sys.argv[0]), file=sys.stderr)
        quit()

    audioreadexample(sys.argv[1])

audiowrite() の使用例(バージョン0.7.16以降)

audiowriteexample.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Version 0.7.16+ required.

import os
import sys
import spplugin
import spaudio


def audiowriteexample(filename):
    duration = 2.0
    with spaudio.open('ro', nchannels=2, samprate=44100) as a:
        nframes = round(duration * a.getsamprate())
        data = a.readframes(nframes, channelwise=True)
        print('nread = %d' % len(data))

        nwframes = spplugin.audiowrite(filename, data, a.getsamprate())
        print('write frames = %d' % nwframes)


if __name__ == '__main__':
    if len(sys.argv) <= 1:
        print('usage: %s filename'
              % os.path.basename(sys.argv[0]), file=sys.stderr)
        quit()

    audiowriteexample(sys.argv[1])

audioread()audiowrite() の使用例(バージョン0.7.16以降)

audiorwexample.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Version 0.7.16+ required.

import os
import sys
import spplugin


def audiorwexample(ifilename, ofilename):
    data, samprate, params = spplugin.audioread(ifilename)
    print('nread = %d' % len(data))
    print('samprate = ' + str(samprate) + ', params =\n' + str(params))

    if False:
        nwframes = spplugin.audiowrite(ofilename, data, samprate,
                                       sampbit=params['sampbit'])
    else:
        nwframes = spplugin.audiowrite(ofilename, data, params=params)
    print('write frames = %d' % nwframes)

    data2, samprate2, params2 = spplugin.audioread(ofilename)
    print('reload: nread = %d' % len(data2))
    print('reload: samprate = ' + str(samprate2) + ', params =\n' + str(params2))


if __name__ == '__main__':
    if len(sys.argv) <= 2:
        print('usage: %s ifilename ofilename'
              % os.path.basename(sys.argv[0]), file=sys.stderr)
        quit()

    audiorwexample(sys.argv[1], sys.argv[2])

プラグインによる音声ファイルの読み込みと,その内容のプロット

plotfilebyplugin.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import sys
import numpy as np
import matplotlib.pyplot as plt
import spplugin


def plotfilebyplugin(filename):
    with spplugin.open(filename, 'r') as pf:
        print('input plugin: %s (%s)' % (pf.getpluginid(), pf.getplugindesc()))
        print('plugin version: %d.%d' % pf.getpluginversion())

        nchannels = pf.getnchannels()
        samprate = pf.getsamprate()
        sampbit = pf.getsampbit()
        nframes = pf.getnframes()
        duration = nframes / samprate
        print('nchannels = %d, samprate = %d, sampbit = %d, nframes = %d, duration = %.2f'
              % (nchannels, samprate, sampbit, nframes, duration))

        # In version 0.7.16+, y.resize() can be omitted by channelwise=True.
        # y = pf.createndarray(nframes, True, channelwise=True)
        y = pf.createndarray(nframes, True)
        nread = pf.read(y)
        print('nread = %d' % nread)

        y.resize((nframes, nchannels))

        x = np.linspace(0.0, duration, nframes)
        for i in range(nchannels):
            plt.plot(x, y[:, i])
        plt.xlim(0.0, duration)
        plt.xlabel('Time [s]')
        plt.ylabel('Amplitude (normalized)')
        plt.show()


if __name__ == '__main__':
    if len(sys.argv) <= 1:
        print('usage: %s filename'
              % os.path.basename(sys.argv[0]), file=sys.stderr)
        quit()

    plotfilebyplugin(sys.argv[1])

プラグインによる音声ファイルの再生

playfilebyplugin.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Version 0.7.15+ required.

import os
import sys
import spplugin
import spaudio


def playfilebyplugin(filename):
    with spplugin.open(filename, 'r') as pf:
        print('input plugin: %s (%s)' % (pf.getpluginid(), pf.getplugindesc()))
        print('plugin version: %d.%d' % pf.getpluginversion())

        nchannels = pf.getnchannels()
        samprate = pf.getsamprate()
        sampbit = pf.getsampbit()
        nframes = pf.getnframes()
        print('nchannels = %d, samprate = %d, sampbit = %d, nframes = %d'
              % (nchannels, samprate, sampbit, nframes))

        filetype = pf.getfiletype()
        filedesc = pf.getfiledesc()
        filefilter = pf.getfilefilter()
        if filetype:
            print('filetype = %s %s'
                  % (filetype, '(' + filedesc +
                     ('; ' + filefilter if filefilter else '') + ')' if filedesc else ''))
        songinfo = pf.getsonginfo()
        if songinfo:
            print('songinfo = ' + str(songinfo))

        with spaudio.open('wo', nchannels=nchannels, samprate=samprate,
                          sampbit=sampbit) as a:
            b = a.createarray(nframes, True)
            nread = pf.read(b)
            print('nread = %d' % nread)

            nwrite = a.write(b)
            print('nwrite = %d' % nwrite)


if __name__ == '__main__':
    if len(sys.argv) <= 1:
        print('usage: %s filename'
              % os.path.basename(sys.argv[0]), file=sys.stderr)
        quit()

    playfilebyplugin(sys.argv[1])

プラグインによるRawファイルの再生

playrawbyplugin.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Version 0.7.15+ required.

import argparse
import spplugin
import spaudio


def playrawbyplugin(filename, samprate, nchannels, sampbit, filetype):
    with spplugin.open(filename, 'r', pluginname='input_raw', samprate=samprate,
                       nchannels=nchannels, sampbit=sampbit, filetype=filetype) as pf:
        print('input plugin: %s (%s)' % (pf.getpluginid(), pf.getplugindesc()))
        print('plugin version: %d.%d' % pf.getpluginversion())

        nchannels = pf.getnchannels()
        samprate = pf.getsamprate()
        sampbit = pf.getsampbit()
        nframes = pf.getnframes()
        print('nchannels = %d, samprate = %d, sampbit = %d, nframes = %d'
              % (nchannels, samprate, sampbit, nframes))

        filetype = pf.getfiletype()
        filedesc = pf.getfiledesc()
        filefilter = pf.getfilefilter()
        if filetype:
            print('filetype = %s %s'
                  % (filetype, '(' + filedesc +
                     ('; ' + filefilter if filefilter else '') + ')' if filedesc else ''))
        songinfo = pf.getsonginfo()
        if songinfo:
            print('songinfo = ' + str(songinfo))

        with spaudio.open('wo', nchannels=nchannels, samprate=samprate,
                          sampbit=sampbit) as a:
            b = pf.readframes(nframes)
            print('nread = %d' % len(b))

            nwframes = a.writeframes(b)
            print('write frames = %d' % nwframes)


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Play an audio file including a raw file')
    parser.add_argument('filename', help='name of input file')
    parser.add_argument('-f', '--samprate', type=int,
                        default=8000, help='sampling rate [Hz]')
    parser.add_argument('-c', '--nchannels', type=int,
                        default=1, help='number of channels')
    parser.add_argument('-b', '--sampbit', type=int,
                        default=16, help='bits/sample')
    parser.add_argument('-t', '--filetype', help='file type string')
    args = parser.parse_args()

    playrawbyplugin(args.filename, args.samprate, args.nchannels,
                    args.sampbit, args.filetype)

プラグインによる音声ファイルの読み込み

writefrombyplugin.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import sys
import aifc
import wave
import sunau
import spplugin


def writefrombyplugin(inputfile, outputfile):
    _, ofileext = os.path.splitext(outputfile)
    if ofileext in ('.wav', '.wave'):
        sndlib = wave
        decodebytes = True
        obigendian_or_signed8bit = False
    elif ofileext == '.au':
        sndlib = sunau
        decodebytes = True
        obigendian_or_signed8bit = True
    elif ofileext in ('.aif', '.aiff', '.aifc', '.afc'):
        sndlib = aifc
        decodebytes = False
        obigendian_or_signed8bit = True
    else:
        raise RuntimeError('output file format is not supported')

    with spplugin.open(inputfile, 'r') as pf:
        print('input plugin: %s (%s)' % (pf.getpluginid(), pf.getplugindesc()))
        print('plugin version: %d.%d' % pf.getpluginversion())

        params = pf.getparams()
        print('nchannels = %d, samprate = %d, sampbit = %d, nframes = %d'
              % (params['nchannels'], params['samprate'], params['sampbit'], params['nframes']))

        if params['filetype']:
            print('filetype = %s %s'
                  % (params['filetype'], '(' + params['filedesc'] +
                     ('; ' + params['filefilter'] if params['filefilter'] else '') +
                     ')' if params['filedesc'] else ''))
        if params['songinfo']:
            print('songinfo = ' + str(params['songinfo']))

        b = pf.createrawarray(params['nframes'], True)
        nread = pf.readraw(b)
        print('nread = %d' % nread)

        paramstuple = pf.getparamstuple(decodebytes)

        with sndlib.open(outputfile, 'wb') as sf:
            sf.setparams(paramstuple)
            y = pf.copyarray2raw(b, paramstuple.sampwidth, bigendian_or_signed8bit=obigendian_or_signed8bit)
            sf.writeframes(y)
            print('output file: %s' % outputfile, file=sys.stderr)


if __name__ == '__main__':
    if len(sys.argv) <= 2:
        print('usage: %s inputfile outputfile'
              % os.path.basename(sys.argv[0]), file=sys.stderr)
        quit()

    writefrombyplugin(sys.argv[1], sys.argv[2])

プラグインによる音声ファイルの書き込み

writetobyplugin.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import sys
import aifc
import wave
import sunau
import spplugin


def writefrombyplugin(inputfile, outputfile):
    _, ifileext = os.path.splitext(inputfile)
    if ifileext in ('.wav', '.wave'):
        sndlib = wave
        decodebytes = True
        ibigendian_or_signed8bit = False
    elif ifileext == '.au':
        sndlib = sunau
        decodebytes = True
        ibigendian_or_signed8bit = True
    elif ifileext in ('.aif', '.aiff', '.aifc', '.afc'):
        sndlib = aifc
        decodebytes = False
        ibigendian_or_signed8bit = True
    else:
        raise RuntimeError('input file format is not supported')

    with sndlib.open(inputfile, 'rb') as sf:
        params = sf.getparams()

        print('nchannels = %d, framerate = %d, sampwidth = %d, nframes = %d'
              % (params.nchannels, params.framerate, params.sampwidth, params.nframes))

        if params.comptype:
            print('comptype = %s %s'
                  % (params.comptype, '(' + params.compname +
                     ')' if params.compname else ''))

        y = sf.readframes(params.nframes)

        with spplugin.open(outputfile, 'w', params=params) as pf:
            print('output plugin: %s (%s)' % (pf.getpluginid(), pf.getplugindesc()))
            print('plugin version: %d.%d' % pf.getpluginversion())

            b = pf.copyraw2array(y, params.sampwidth, bigendian_or_signed8bit=ibigendian_or_signed8bit)
            nwrite = pf.writeraw(b)
            print('nwrite = %d' % nwrite)

            print('output file: %s' % outputfile, file=sys.stderr)


if __name__ == '__main__':
    if len(sys.argv) <= 2:
        print('usage: %s inputfile outputfile'
              % os.path.basename(sys.argv[0]), file=sys.stderr)
        quit()

    writefrombyplugin(sys.argv[1], sys.argv[2])

プラグインによる音声ファイルの変換

convbyplugin.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import sys
import spplugin


def convbyplugin(inputfile, outputfile):
    with spplugin.open(inputfile, 'r') as pf:
        print('input plugin: %s (%s)' % (pf.getpluginid(), pf.getplugindesc()))
        print('plugin version: %d.%d' % pf.getpluginversion())

        params = pf.getparams()
        print('nchannels = %d, samprate = %d, sampbit = %d, nframes = %d'
              % (params['nchannels'], params['samprate'], params['sampbit'],
                 params['nframes']))

        if params['filetype']:
            print('filetype = %s %s'
                  % (params['filetype'], '(' + params['filedesc'] +
                     ('; ' + params['filefilter'] if params['filefilter'] else '') +
                     ')' if params['filedesc'] else ''))
        if params['songinfo']:
            print('songinfo = ' + str(params['songinfo']))

        b = pf.createrawarray(params['nframes'], True)
        nread = pf.readraw(b)
        print('nread = %d' % nread)

        with spplugin.open(outputfile, 'w', params=params) as pf:
            print('output plugin: %s (%s)' % (pf.getpluginid(), pf.getplugindesc()))
            print('plugin version: %d.%d' % pf.getpluginversion())

            nwrite = pf.writeraw(b)
            print('nwrite = %d' % nwrite)

            print('output file: %s' % outputfile, file=sys.stderr)


if __name__ == '__main__':
    if len(sys.argv) <= 2:
        print('usage: %s inputfile outputfile'
              % os.path.basename(sys.argv[0]), file=sys.stderr)
        quit()

    convbyplugin(sys.argv[1], sys.argv[2])