2020年2月27日木曜日

C++のヘッダーファイルだけでシングルトンを作る

おじさん、この年になってもいまだにC++で上手にシングルトンが作れません。
スレッドセーフとか考えるとあれ結構難しくない?
やっぱシングルトンは良質な水と原料からでないと作れないっぽいです。

だれでも簡単に任意のクラスをシングルトンにできるクラスとか作れないんだろうか。
よく、シングルトンを作るために.cppファイルでstatic変数を

static MyClass*pmyclass=NULL;

とか宣言するのも意味不明でたまに忘れてコンパイルエラーになってめんどくさいし。
シングルトンのクラスをシングルトンじゃなくしたり意外とめんどくさいじゃん。

.cppファイルがいらない、C++のヘッダーファイルだけで簡単にシングルトンを作れるのか考えてみました。

とりあえず getInstance()の関数の中で、

getInstance(){
Singleton<MyClass> a;
return a.a;
}

このように返せばどんなクラスでもシングルトン化できるテンプレートを作成。
これで数行追加するだけでどのクラスもシングルトン化できてだいぶ便利な気がする。

template<typename A> A Singleton<A>::a;

この一行がポイントですね。
ヘッダーファイル内でグローバル変数宣言できるし。
しかもヘッダーファイルを使わないときは、メモリ使われないし。
やっぱテンプレート機能をつかわないとできないのかなぁ。

----------------------------------
#include <cstdio>

//ここからヘッダーファイルのつもり
template<typename A> class Singleton {
public:
static A a;
};
template<typename A> A Singleton<A>::a;
//ここまでヘッダーファイルのつもり

class ClassA{
public:
ClassA() {
printf("ClassA()\n");
}
virtual ~ClassA(){
printf("~ClassA()\n");
}
static ClassA& getInstance()
{
Singleton<ClassA> a;
return a.a;
}
void func(){
printf("func()\n");
}
};

int main(int argc, char* argv[])
{
ClassA& ca = ClassA::getInstance();
ca.func();
return 0;
}

----------------------------------


2020年2月26日水曜日

オペアンプで遊ぶ その2

オペアンプのブログが意外とうけが良いので、調子に乗って本日も真のオペアンプではないですが、オペアンプ系です。


おじさん今から30年以上前の小学4年生の時にLM386というICではじめてインターフォンを作りました。IC一つで作れるんで、小学生でも作れるんですね。
音系の電子工作ってどれもとても音が悪かった記憶が残っています。

しかし、最近、インターネットでいろいろな人が回路図を公開することが増えて、回路図をみんなでレビューしていることと、電子回路のシミュレーションが誰でもソフトで簡単できるようになったことで、何十年も定石と言われていた電子回路が実は違っていたことがわかってきました。

いままで地球は平らで地球の周りを太陽が回っていると思っていたのに、実は地球は丸く太陽の周りを地球が回っているくらい、アナログ電子回路も地動説と天動説くらい常識が変わっています。

http://settembre21x.blogspot.com/2013/09/lm386.html
このLM386革命アンプもそうなのです。
おうちのインターフォンとか給湯器のスピーカーを鳴らすために使われている50円くらいの定番のIC。音が悪いけど値段が安いのでありとあらゆるところに使われています。
このICがちょっと回路を直すだけで、10万円相当のハイレゾコンポになるらしいのです。

おじさんも先日のA47アンプのオペアンプの技術解説をみていてLM386のアンプも同じなんじゃないって思っていたんだよね。
もう何年も前にそのことに気づいている人がいるのね。
最初に気づいたこの人ほんとすごいねー。

先日のオペアンプもそうですが、おじさん、いままで音が悪いのはICの性能が悪いからだったと思っていたんですが、IC周辺のリファレンス回路が間違っているのね。

いままで安かろう悪かろうだと思われていた電子回路が、ほんのちょっと頑張って改良すれば、高級オーディオ並みにまで音が良くなるっぽいです。
とりあえず回路図は複製できた。

http://symphonical-rain.main.jp/?p=13205
去年末ごろからダイソーで見かける300円のイヤホンも市販の1500円くらいのイヤホンと同じくらい音質がいいらしいし、最近は十万円くらいのオーディオ機器は自分で千円くらいで作れるんですね。
前回のヘッドフォンアンプにつなげればもう高級オーディオいらない??

これ作って実験してみようっと。

2020年2月21日金曜日

オペアンプで遊ぶ

最近、テレワークが流行っているようです。
でもおじさん、テレワークでやることがない。
そこで、今日はオペアンプでヘッドフォンアンプをつくって電子工作をしてみようと思います。

アマゾンで安く売っているヘッドフォンアンプキットがこれ。
A47アンプというらしいです。
ChuMoy Ampというチューモイさんが作ったアンプをAphearedさんという方が改造して、その頭文字のAらしいです。

http://www.tij.co.jp/jp/lit/an/jaja203/jaja203.pdf
このOP2604の回路図を参考にしたんですね。

このアンプとっても音がよいという噂。
このA47アンプのキットの回路図が以下のものです。


このアンプ、NE5532というオペアンプICを使ったアンプキットなんで、多くの音楽系の楽器や電子機器にこの回路がそのまま使われています。

オーディオマニアや音楽マニアの間では、オペアンプを使った音楽系のものは使用するオペアンプを変えると音が変わるというんです。
そんな都市伝説があるわけねーだろ。
面白いことにオペアンプのICって50円から数万円するものまであります。
なんなんだこの不思議なオペアンプの世界。

ということで、オペアンプを変えると本当に音が変わるか、このキットを2個買って作ってみました。そして、片方のオペアンプを100円のNE5532から500円のMUSES8920に変えてみます。

たしかに、断然MUSES8920のほうが音がいい。
なんで?

https://blog.bnikka.com/audio/chumoy.html

いろいろ調べると、そもそもこの回路図はFETのオペアンプ用に作られた回路です。
NE5532はバイポーラのオペアンプ。バイポーラだと入力バイアス電流が大きいのでR12とR13の抵抗が高すぎます。
OP2604使うと値段が高くなるから値段の安いNE5532に変えたのね。
NE5532に変えるのならばR12とR13も変えないと音悪くなるでしょ。

これ、オペアンプを変えると音がよくなるんじゃなくて、コストダウンのためにオペアンプを安いものに変えて、抵抗の値も変えないといけないのにそういうこと知らなくて音が悪くなっているだけでしょ?
なにも考えないでオリジナルからコピペするからこうなるんだよ。

プログラムもたった一行のミスでアプリが落ちたりシステムが止まったりして大変なことになりますが、アナログな電気回路もたった一か所のミスが致命的になるんですね。
プログラムの場合、ミスると動かないのでわかりますが、アナログ回路だとミスっても音が出るから気づかないんですね。

どうも世の中のオペアンプを変えると音がよくなるというのは、オペアンプを変えると、コピペミスで間違った回路が正しくなるからも一理あるようです。

次回はコンデンサーを変えると音がよくなるという都市伝説を実験てみよう。