2016/05/14(Sat)YAMAHA XGの音源コントローラを結局作り直した。

XGTGCTL2 開発やめた の続きになる。

あれから10年近く経っても、自分のDTM環境が、MU2000 EXから脱却できていないので、
ドラムやEQを自由にいじりやすくするために結局作っていた。
前のバージョンはHSPで作ってて、ソースコードがスパゲティ状態で、拡張なんてとても無理だったのでC#で書き直している。
gitの使い方の勉強もかねて、GitHub上で公開してみる。

リリース: https://github.com/ttsuki/XGMidiControllerForMU2000EX/releases

これを使って作った曲: Another Wing -Deep White- と、そのソースコード
スクリーンショット:


MIDIファイルからの読み込み機能はあんまり使わないので省いて、
音源とSysExでSEND/DUMPするほか、サクラMMLスクリプトではき出すようにしたりした。

もはやXGという規格がレトロ化してきている昨今。
MOXFを買おうかとか、でもソフトで何でもできる時代だしーと思うと躊躇してしまう今日この頃。

2016/04/03(Sun)RAMDISKドライバを作る

RAMDISKドライバを作る

ほんとは、これがやりたくてオレオレ認証局とか作ってたんだけど、
調べたところによると、Windowsで使えるドライバ用のコード証明書のCAは決まってて
そればかりか、Windows 10のカーネルモードのドライバのコード署名はEV証明書でないといけないみたいで、
結局、この記事でやってるようにドライバ署名の検証をスルーしないと動かせなかった。
趣味レベルでカーネルモードドライバをちゃんと作ってリリースする道はもはや絶望的だなー……。

この記事では、

Visual Studioでのドライバの開発に必要なものをインストールして、
サンプルドライバをビルド・インストールしてみてから、
RAMDISKの容量が1GBになるよう、ソースコードを改造してみます。

制限

この記事の範疇ではFAT16なので、2GB(一説では4GB?)よりも大きいドライブは作れないはず。
FAT32への対応はすぐできるんだと思うけど、あんまり調べてない。

上記の通りドライバにコード署名できないので、ドライブを使うには、
毎回ドライバ署名の検証をスルーできる状態でWindowsを起動する必要がある。

続きを読む

2015/12/28(Mon)WINAMPにStereo ToolというDSPプラグインを入れたら、音楽を聴くのが楽しくなる。

はてブ数 2015/12/28 2:50 計算機な日記::ボクと計算機 つーさ

作業用BGMを自分好みにEQかけて聴きたい。
マスタリングエンジニアの人には失礼な話だと思いながら。
(2016.01.18 ちょっと更新した)

いれたもの

Winamp → いつものプレーヤー。
in_!mpg123 → MP3デコーダプラグイン。32bit int PCM/64bit float PCMとかが出る。今回は32bit intで出す。
Stereo Tool → WINAMPのDSPプラグイン。マルチプレッサ他いろいろついてる。
Yet Another (WA)SAPI Output Plugin for Winamp (YASAPI) → WASAPIで、カーネルミキサーを通さず音が出せる。

Stereo Toolの設定ファイル(いじった)

テンション上がる感じのStereo Tool用の設定ファイル ※ダウンロードにならない場合は右クリックして保存
Stereo Toolの設定画面で、LOAD → ALL AUDIO SETTINGS → tu3.sts を読み込むと反映します。

個人の再生環境とか、むしろ好き嫌いがかなり大きい世界なので万人向けではないけど、
かなりドンシャリでプリエンファシスなテンションあがる感じにはなったかな。
プリセットの Bojcha - Enlightened をベースに、低音と中音と高音をいじった。(?)
あんまりコンプレッサーとかよくわかってないけど。

画は設定いじってる途中


本文

今までは普通に、MU2000のA/D Inputを、ただのPC用イコライザーとして使ってたのですが、
ノートPCにさすがにMU2000つないであっちこっち行くのはめんどくさくて、
WMPのイコライザーをオンにしてたんですが、PREAMPがないので、
上げる方向にだけ調整すると音が歪んじゃうんですよね。

んじゃ、PREAMPついてるEQついてるプレーヤー使えばいいじゃないと、
ノートPCにもWINAMPを入れたわけですが、WMPのEQに耳が慣れてしまうと、
なんかWINAMPのEQは音籠ったみたいになっちゃうんですよね。なんでかな。

で、そこはWINAMPなんで、プラグインとかきっとあるよなーと思って検索してたら、
Stereo Toolというのを見つけた。一部有料だけど、ほとんどの機能が無料でつかえる! 

続きを読む

2015/12/12(Sat)Windowsファイル共有 over SSH (Windows 8)

はてブ数 2015/12/12 14:56 計算機な日記::ボクと計算機 つーさ

Windows 8 で、インターネットの向こうにあるファイル共有フォルダにアクセスする方法

要求

旅行中・単身赴任中に、遠く離れた家のNASにあるミュージックライブラリにある曲を、普通のプレーヤーで再生したいけど、いちいちscpでコピーしたくないから共有フォルダから直読みしたい。

前提

  • つなぎたい共有フォルダがある。 例えば東京の部屋にあるNAS。
  • インターネットからアクセスできて、共有フォルダにネットワーク的につながるsshサーバがある。 例えば↑で書いたNAS
  • そのsshサーバにつなげるインターネット環境がある。例えばLTEスマホとWi-Fi テザリング
  • sshクライアントがある。 cygwinなりPuTTYなり。

参考リンク

http://blue-red.ddo.jp/~ao/wiki/wiki.cgi?page=SSH%A4%C7Windows%B6%A6%CD%AD%A4%F2%A5%DD%A1%BC%A5%C8%A5%D5%A5%A9%A5%EF%A1%BC%A5%C9%A4%B9%A4%EB

リンク先では、なんか、Loopbackアダプタを追加してそのうえでportproxyを使ってやっている。けど、接続元にしたいPCがサブノートなどの場合でほかのマシンにファイル共有を提供しない場合、いきなりlocalhostでいいかなって。

手順

  1. 参考リンク先にあるLocalSMB.exe という(ちょっとあやしげな)プログラムを実行する。
  2. Windows再起動すると、0.0.0.0:445 を空けといてくれる(開いてない状態で起動する)。
  3. お好みのsshクライアントで、ssh tu-sa@backdoor.tu3.jp -L 445:10.0.0.103:445 とNASまでSSHトンネルを張って、
  4. エクスプローラで\\localhost を開く。

おお、見えた見えた。
これで、いちいちscpでファイル取ってこなくても、好きなプレーヤーで音楽が聴ける。

あー? 携帯音楽プレーヤー?

2014/09/21(Sun)VC++ で __builtin_ctz __builtin_clz __builtin_popcount

はてブ数 2014/09/21 14:33 計算機な日記::プロコン つーさ

をするための intrin wrapper。

コンテストではローカルがVisualStudioで、ジャッジサーバはgccなので、
これを書いておくと、あまりその辺気を使わずビット演算できる


//// bit ////
#ifdef _MSC_VER
#ifdef _WIN32
inline unsigned int __builtin_ctz(unsigned int x) { unsigned long r; _BitScanForward(&r, x); return r; }
inline unsigned int __builtin_clz(unsigned int x) { unsigned long r; _BitScanReverse(&r, x); return 31 - r; }
inline unsigned int __builtin_ffs(unsigned int x) { unsigned long r; return _BitScanForward(&r, x) ? r + 1 : 0; }
inline unsigned int __builtin_popcount(unsigned int x){ return __popcnt(x); }
#ifdef _WIN64
inline unsigned long long __builtin_ctzll(unsigned long long x) { unsigned long r; _BitScanForward64(&r, x); return r; }
inline unsigned long long __builtin_clzll(unsigned long long x) { unsigned long r; _BitScanReverse64(&r, x); return 63 - r; }
inline unsigned long long __builtin_ffsll(unsigned long long x) { unsigned long r; return _BitScanForward64(&r, x) ? r + 1 : 0; }
inline unsigned long long __builtin_popcountll(unsigned long long x) { return __popcnt64(x); }
#else
inline unsigned int hidword(unsigned long long x) { return static_cast<unsigned int>(x >> 32); }
inline unsigned int lodword(unsigned long long x) { return static_cast<unsigned int>(x & 0xFFFFFFFF); }
inline unsigned long long __builtin_ctzll(unsigned long long x) { return lodword(x) ? __builtin_ctz(lodword(x)) : __builtin_ctz(hidword(x)) + 32; }
inline unsigned long long __builtin_clzll(unsigned long long x) { return hidword(x) ? __builtin_clz(hidword(x)) : __builtin_clz(lodword(x)) + 32; }
inline unsigned long long __builtin_ffsll(unsigned long long x) { return lodword(x) ? __builtin_ffs(lodword(x)) : hidword(x) ? __builtin_ffs(hidword(x)) + 32 : 0; }
inline unsigned long long __builtin_popcountll(unsigned long long x) { return __builtin_popcount(lodword(x)) + __builtin_popcount(hidword(x)); }
#endif // _WIN64
#endif // _WIN32
#endif // _MSC_VER

inline unsigned int bsf(unsigned int v) { return __builtin_ctz(v); } // 最下位の1は下から数えて何ビットめか?
inline unsigned long long bsf(unsigned long long v) { return __builtin_ctzll(v); } // 最下位の1は下から数えて何ビットめか?
inline unsigned int bsr(unsigned int v) { return 31 - __builtin_clz(v); } // 最上位の1は下から数えて何ビットめか?
inline unsigned long long bsr(unsigned long long v) { return 63 - __builtin_clzll(v); } // 最上位の1は下から数えて何ビットめか?
inline unsigned int msb(unsigned int v) { return 1 << bsr(v); } // 最上位の1だけ残す
inline unsigned long long msb(unsigned long long v) { return 1ull << bsr(v); } // 最上位の1だけ残す
inline unsigned int lsb(unsigned int v) { return v & -v; } // 最下位の1だけ残す
inline unsigned long long lsb(unsigned long long v) { return v & -v; } // 最下位の1だけ残す
inline unsigned int pop_lsb(unsigned int v) { return v & v - 1; } // 最下位の1以外を残す
inline unsigned long long pop_lsb(unsigned long long v) { return v & v - 1; } // 最下位の1以外を残す
inline unsigned int round_up_pow2(unsigned int v) { return msb(v - 1) << 1; } // 2の累乗に切り上げ
inline unsigned long long round_up_pow2(unsigned long long v) { return msb(v - 1) << 1; } // 2の累乗に切り上げ

// bit permutation。nビット立っているものを列挙する
inline unsigned int next_bit_permutation(unsigned int x)
{
	int t = x | (x - 1);
	return (t + 1) | (unsigned int)((~t & -~t) - 1) >> (bsf(x) + 1);
}

// bit permutation。nビット立っているものを列挙する
inline unsigned long long next_bit_permutation(unsigned long long x)
{
	long t = x | (x - 1);
	return (t + 1) | (unsigned long long)((~t & -~t) - 1) >> (bsf(x) + 1);
}

// x の p1からlen bitと p2 から len bit を入れ替える
template<class T>
T bit_swap(T x, size_t p1, size_t p2, size_t len)
{
	T mask = (static_cast<T>(1) << len) - 1;
	T ope = (x >> p1 ^ x >> p2) & mask; // 入れ替える場所のxorを求める
	return x ^ (ope << p1 | ope << p2); // 入れ替える場所をxor。
}

最新版は以下でメンテされるだろう。
ただし、あっちは、 #define long long long されているので注意が必要。
プロコン用テンプレート C++11

2014/07/06(Sun)プロコン用テンプレート C++11

はてブ数 2014/07/06 5:32 計算機な日記::プロコン つーさ

つーさが、ここ1ヶ月くらい前からAOJで遊びはじめて、
プログラミングコンテストとかで使ってるテンプレートです。
C++11です。

入出力が READ や read<..>(n次元); や readjag()で簡単に書けたり、
出力が、WRITE に vector を渡すと1行にスペース区切りで出してくれたりとか。

探索と幾何はそれなりにまとめた?
フローとかがなくてつらい。


続きを読む