JUCEプログラミング、Looping audio using the AudioSampleBuffer class、チュートリアル概要

今回はしっかり全体をみてからやるんだね~

なんとなく、気まぐれです。(ぼそ)

JUCEプログラミング、Audioの項目の「Looping audio using the AudioSampleBuffer class」チュートリアルを進めていきます。まずは、全体をみて、どのようなチュートリアルでどんなことができるようになるのかを見ていきたいと思います。

公式のチュートリアルページはこちらになります。

こんな人の役に立つかも

・JUCEフレームワークに入門したい人

・JUCEで音声プログラミングを学びたい人

・JUCEのAudioチュートリアルを進めている人

目次

作成するアプリについて

今回のチュートリアルでは、次のような機能を持ったアプリを作成していきます。

①Openボタンで音声ファイルを読み込むことができる。

②読み込んだ音声をひたすらループ再生する。

③Clearボタンで音声ループ再生を停止する。

アプリを完成させると、次のようなGUIのアプリが完成します。

シンプルすぎますね~^^;

音声の再生、ループ再生は以前にもやったような気がします・・・

AudioPlayerアプリとの違い

以前のチュートリアルで、AudioPlyerというアプリを作成しました。その時も、音声をファイルから読み込んで、Openし、プレイボタンで再生、ポーズで一時停止、Stopで再生リセットみたいな結構しっかりした再生機能を作成した覚えがあります。

プログラムの違い

以前、AudioPlayerアプリを作成したときのgetNextAudioBlock関数です。

void MainComponent::getNextAudioBlock (const juce::AudioSourceChannelInfo& bufferToFill)
{
    if (readerSource.get() == nullptr)
    {
        bufferToFill.clearActiveBufferRegion();
        return;
    }

    transportSource.getNextAudioBlock(bufferToFill);
}

以前のAudioPlayerでは、JUCEのクラスを利用して音声の再生、停止などを行っていました。AudioTransportSourceクラスのgetNextAudioBlockへ音声バッファをスルーしているだけでしたので、基本的に音声の再生停止などの詳細な処理はクラス任せになっていました。

一方で、今回作成するループ再生アプリでは、getNextAudioBlock関数は次のようになっています。

void MainComponent::getNextAudioBlock (const juce::AudioSourceChannelInfo& bufferToFill)
{
    auto numInputChannels = fileBuffer.getNumChannels();
    auto numOutputChannels = bufferToFill.buffer->getNumChannels();

    auto outputSamplesRemaining = bufferToFill.numSamples;
    auto outputSamplesOffset = bufferToFill.startSample;

    while (outputSamplesRemaining > 0)
    {
        auto bufferSamplesRemaining = fileBuffer.getNumSamples() - position;
        auto samplesThisTime = juce::jmin(outputSamplesRemaining, bufferSamplesRemaining);

        for (auto channel = 0; channel < numOutputChannels; ++channel)
        {
            bufferToFill.buffer->copyFrom(channel,
                outputSamplesOffset,
                fileBuffer,
                channel % numInputChannels,
                position,
                samplesThisTime);
        }

        outputSamplesRemaining -= samplesThisTime;
        outputSamplesOffset += samplesThisTime;
        position += samplesThisTime;

        if (position == fileBuffer.getNumSamples())
            position = 0;
    }
}

がっつり実装してますね~

今回のループ再生アプリでは、音声の再生部分の処理を「AudioSampleBuffer」というクラスを利用しますが、以前の再生アプリより詳細に再生機能(とループ)を実装していくことになりそうです。

上のドキュメントによると、どうやら、AudioSampleBufferクラスは、AudioBuffer<float>の別名ととらえることができます。C++のusingの使い方はいろいろあるようですが、リンク先のドキュメントのヘッダーに記載されているusingは、別名を定義する使い方で利用されています。

Qiita
c++ using使い方の名称まとめ - Qiita c++ではusingの使い方がいろいろある。使い方の名称をしらないと検索もかけられないのでそのまとめ。解説リンク付き。

次回の記事で、まずは動作するアプリを作成していきたいと思います。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次