amerikantypewr1ter
@amerikantypewr1ter (y kawano)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

JUCE(C++) getParameterTextの記述に関して

解決したいこと

下記の資料(本)を参考にjuceでシンセサイザーのプラグインを作っています。
https://www.oufac.com/

getParameterTextの記述に関して理解が全く進まないので質問させてください。

該当コード

const String SimpleEqualizerAudioProcessor::getParameterText(int index)
{
    switch (index)
    {
    case Parameters::MasterBypass:
        return UserParams[MasterBypass] != 1.0f ? "EFFECT" : "BYPASS";

    case Parameters::Frequency:
        return String((int)(pow(1000.0f, UserParams[Frequency]) * 20.0f)) + String(" Hz");

    case Parameters::BandWidth:
        return String(pow(60.0f, UserParams[BandWidth]) * 0.1f, 2) + String(" Octave");

    case Parameters::Gain:
        return String((48.0f * (UserParams[Gain] - 0.5f)), 1) + String(" dB");

    case Parameters::SampleRate:
        return String(UserParams[SampleRate]) + String(" Hz");

    default:return String();
    }
}

pow関数が累乗であることは理解できるんですが、その後の記述が何をしようとしているかが分かりません。
文字列を返そうとしているのは分かりますが、1000.0fやUserParams[Frequency]) * 20.0fのような記述が理解できません。

例えば下記コードなど)

return String((int)(pow(1000.0f, UserParams[Frequency]) * 20.0f)) + String(" Hz");

このあたりの知識を深掘りしたいのですが、どのように学習すべきか分かりません。
参考サイトや参考図書などがありましたら教えてください。

0

1Answer

たとえば単に 1000 と書いたとき、この数値の型は int です。 1000.0f と書いてあればこれは float 型の数値を表すリテラルです。

pow が標準ライブラリの pow だと解釈される文脈だとしたら、これはオーバーロードされていて型によって異なる実体が呼び出されるので具体的に型がわかるようにしているのでしょう。 直接的に一致する型がない場合に暗黙の型変換が起きるなどオーバーロードの解決ルールは複雑です。

UserParams[Frequency] は配列 UserParamsFrequency 番目の要素にアクセスしています。 ただ、 [] はオーバーロード可能な演算子なのでどこかでオーバーロードされていれば別の意味を持つかもしれません。

そういう風に、どこかで定義されたものを呼び出している形になっていることは多いのである箇所だけを抜き出しても正確な意味はわからないことがあります。

入門書

C++ は複雑な言語です。 十分な基礎知識が身についていない段階だとリファレンス系の資料はどこをどう読めば良いのかすらわからず圧倒されるでしょう。 まずはしっかりと入門書を読んでください。

本の分厚さ

繰り返しますが C++ は複雑です。 入門書でもそれなりに分厚いです。 ボリュームのない本だと背景となる事情の説明が十分ではなくかえって良くわからないということも起きます。

私の感覚だと入門に必要な内容をよっぽど上手く整理しても 500 ページを下回ることはなさそうだと思います。 色々な資料で補いながら読むという前提であれば話は別ですが、それが出来るようなら入門書なんて必要ないわけですから……。

ただ、 C++ は C を発展させる形なので C の知識がある人に向けるならそのあたりの基礎部分を省略していたり、ライブラリの細かな部分を省いたりしてもっと薄くなっている (そして十分にわかりやすい) ということもあるかもしれません。

本の新しさ

C++ は 2011 年以降は三年ごとに規格を改定するという運用がされています。 言語仕様が変更されれば書き方の習慣にも違いが出てきます。 そういった変更に追従できていない古い本は避けるべきです。

新しければよいというものでもありませんが、 2011 年の改定は特に劇的な変更があり、初心者に関係してくる基礎的な部分でも違いがあります。 少なくとも C++11 (← C++ の 2011 年の改定の通称) より新しい規格に対応していると明記されているものを選択するのをお勧めします。

具体的な入門書

私自身は C++ を身に着けたのはかなり前 (ISO の規格が出来るより前) の時代で、あとは差分を知っていくという形でした。 なので今の時代の手ごろな入門書がどれなのかというのはわかりませんし、新しい本は持っていません。 なので紹介ページを紹介するにとどめます。

「江添亮のC++入門」は内容が無料でウェブ公開されているので今からでも読み始められます。 ただ、 C++ の普通の入門書でなら必ず説明するようなクラスの継承の話をバッサリとカットしたり、その替わりに言語の外の話 (コマンドやツールの事情) を入れるといった構成になっています。

ウェブ上のリファレンス

有志の方々がまとめている ja.cppreference.com はとてもとても参考になります。 規格の改定で変わった個所などもわかりやすく書かれていますし欠陥報告 (後述) も反映されています。 ただ、あくまでも規格をわかりやすく再構成するような形なので解説とは違います。

そしてもうひとつ人気があるのは cpprefjp です。 言語仕様の細かい規則に踏み込むほどのものではありませんが解説や例が多く、日常的な利用ではわかりやすいまとめだと思います。

規格

C++ の規格は ISO でまとめられていて販売もされていますが、そこそこの高級品です。

しかし規格として承認される直前の草案は無料でアクセスできるようになっています。 (実際の規格との違いはわずかな誤字程度でしょう。)

欠陥報告

C++ の規格は複雑なので規則が矛盾していたり誤読の余地があったりする箇所が後で発見されることもあります。

欠陥報告 (defect report) という名前でまとめられているのですが……、この報告による修正は過去の仕様に遡って適用されることがあります。 すでに発行されている仕様の内容が変わってしまうことになり、仕様の解釈を難しくしています。

ほとんどは微妙に解釈の幅があるのを明確化するというようなものですが根本的な動作が変わってしまうものも全くないというわけではありません。

1Like

Comments

  1. 丁寧に回答いただきありがとうございます!
    参考サイトや参考図書なども確認させていただきます。
    貴重なお時間ありがとうございました。

Your answer might help someone💌