Hatena::ブログ(Diary)

やねうらお−俺のブログがこんなによっちゃんイカなわけがない このページをアンテナに追加 RSSフィード

書籍化されたで! 監修したで!(`ω´) 絶版なってしもた 大好評発売中です! 少し書いたデ!(`ω´) これにもな!(`ω´)
解析魔法少女美咲ちゃん マジカル・オープン!

YaneuLabs / YaneuraoGameSDK.NET / 掲示板 / やねうらおにメール / twitter / プロフィール

 | 

2012-02-26 クローズアップ現代で初音ミク特集

[] クローズアップ現代初音ミク特集  クローズアップ現代で初音ミク特集を含むブックマーク  クローズアップ現代で初音ミク特集のブックマークコメント


クローズアップ現代で「初音ミク特集」をやるらしく、番組ディレクター自らが捨て身で番宣をしている動画YouTubeにアップされている。


2月28日(火)放送!「クローズアップ現代初音ミク特集」

D


ところで、私も高校のとき(20数年前)に某社からとある麻雀ゲームPC移植できないかと言われて、それを検討するために音声合成プログラムを書いたことがある。


当時、音声合成と言えばCSM音声合成(CSM = Composite Sinusoidal Modeling : 複合正弦モデル)が主流だったと思う。当時ゲームアーツで働いていた三橋正邦氏が開発したCSM音声合成システム特に有名だ。『シルフィード』(1986年)にはじまり、『ぎゅわんぶらあ自己中心派』(1987年)、『ゼリアード』(1987年)・『ヴェイグス』(1988年)といったゲーム採用されていた。*1


CSM音声合成自体は結構古い技術1979年ごろにはすでにあった。*2


CSM音声合成データサイズ比較的小さくなるのだが、使いこなすのが技術的にハードルが高く、また、再生データーの生成のために離散コサイン変換をしないといけないので当時のパソコンではデータを変換するのにとても時間がかかった。あと、宇宙人がしゃべっているような声になるのもその特徴だった。


NRTDRV(+CSM音声合成)で「もってけ!セーラーふく」を作ってみた

D


私は当時、CSM音声合成ハードルが高いと判断し、普通ADPCM(Adaptive Differential Pulse Code Modulation)で再生することにした。ところがADPCMだとメモリ結構食うので当時のPC(16KBぐらいしかメモリが使えない)にはきつく、ビットレートを落とすか何らかの工夫をせざるを得なかった。


そこで私は同じ小さい区間を数回ずつ再生するという方法をとった。「あー」という波形はずっと変わらないと仮定できるから、小さな「あ」のサンプリングしたものを繰り返し再生させるという方法だ。子音+母音で構成されている音ならば、256バイトデータ(区間)を5回再生して、次の256バイトデータを5回再生して、またその次の256バイトを…みたいな方法で必要なデータ量を削減した。


そうやって音素ごとにつなげると一応は何かしゃべっているようには聞こえるのだが、音質はすこぶる悪く、しかし、何度もデバッグと調整のために聴いているとだんだん自分の耳が慣れてきて、「ああ、これくらいならまだ判別可能だな」とか思いながらチューンしていくと、やがてどんどん音声が崩れて行った。


それを麻雀ゲーム移植が出来ないかと私に相談してきた某社の社長のところに持って行って「こんな音質なら出来るんですけど」とデモして聴かせたのだが、その社長宇宙人の声にしか思えなかったらしく、麻雀PC移植するのは無理だという判断になり、麻雀移植する話自体はお流れになった。


いまにして思えば、その音声合成たるや、とてもひどい出来で、上の「もってけ!セーラーふく」の動画の音声以下の、「宇宙人のおもしろボイス集」とでも言うべきものに仕上がっていた。


私が大学に入ったころには、もうそんな自分の高校時代黒歴史みたいな音声合成のことはすっかり忘れていたのだが、『C Magazine』(1994年3月号)にリコーの人が作った音声合成プログラム「VC2」というのが付録についていて、しかもそれが結構よく出来ていたので感動して、「ああ、いまのPCならメモリも潤沢にあるし(注 : 当時のPCのフリーメモリは数百KB程度でしたが、フリーメモリが数10KBの世界から移り住んできたのでそれが無限に近いメモリのように思っていました)、これだけメモリがあれば俺にも出来るんじゃね?」と思い、サクっと作ってみたのだが、どうも音素と音素のつなぎ目(たとえば、音素「い」と音素「く」を個別にサンプリングして「いく」という単語再生させる)が綺麗につながらない。


ちなみに、Cマガに載っていたリコープログラムは、このつなぎ目も結構パターンを持っていて、何やらうまくやっているようだった。


その記事の内容はよく覚えていないのだが、たぶん、

1) 「い」を再生して

2) 「い」と「く」との間の音を再生して

3) 「く」を再生する

といった感じだったのだと思う。1)と2)の音はクロスフェードさせる。すなわち、1)を次第に弱くしていき、それと入れ替わるように2)を次第に強くしていく。同様に、2)と3)の音もクロスフェードさせる。そんな感じ。


現代の音声合成技術がその当時からどれほど技術的に進歩したのかは私はよく知らない。このつなぎ目をなめらかにする部分が音声合成におけるひとつの大きなハードルだと思うのだが、そこはすでに超えているのだと思う。


私が初音ミクで不自然だと感じるのは、普通人間だと直前の音を引きずることがあるのだが、初音ミクにはそれがないことだ。


直前の音を引きずるというのは、例えば、「water」という単語ネイティブスピーカーが /wˈɔːṭɚ/の/t/音を発音しきれずに/r/に近い音として発音するケースだ。(このとき日本人には「ワラー」と聴こえる) 同様に「writer」なら/rάɪṭɚ/の/t/が/r/に近い音になる。(このとき日本人には「ライラー」と聴こえる)


初音ミクにはこれがない。前の音を決して引きずらない。これは短所であり、長所でもある。特に、『初音ミクの消失』ではこれが初音ミクらしい早口言葉になっており、これが長所として活かされていると思う。


PV完全版】 初音ミクの消失 DEAD END 【MotionGraphics】

D


それでは、音声合成では、どうやれば前の音を「引きずる」ことが出来るようになるのかという話になるのだが、人間発声の仕組みに相当する物理モデルを組み立てて、それをシミュレーションしてはどうかと思う。声帯筋肉に相当するパラメーターを動かしてみて、それが発声される音が狙った音素に近づくようにパラメーターを機械学習で調整する。


そこまで出来れば、あとは音を連続的に、変化させることは可能だろうし、声帯筋肉をあまり無理せずに動かすように制約を入れれば、前の音を引きずったりするのではないかと思う。人間発声の仕組みがどれくらい解明されているのか私は知らないので、適当なことを言ってるかも知れない。ごめん。


そんなことを考えていたら20年ぶりに音声合成プログラムを書いてみたくなった。


.

hogehoge 2012/02/26 01:38 個人的には、声帯に関しては意外と適当で良くて、
口・歯・舌・喉の形と動き、それに伴う口中の空気の流れとその変化が重要なのではと思っています。

yaneuraoyaneurao 2012/02/26 01:41 ああ、なるほど。言われてみればそうですね。

drumichirodrumichiro 2012/02/26 01:51 いつも楽しく拝見させていただいています。
過去に音楽情報処理に足をつっこんでいて今はゲームプログラマさせてもらっています。

ちょっと気になる点があったので質問です。
CSMは合成時にはフーリエ変換は必要ないと記憶しています。(分析時には各正弦波に積算する振幅を計算するのに必要でしたが)
もしかしてそのゲームではゲーム内で分析も行なっていたのでしょうか?
分析していないにしても昔のゲームで音声合成が採用されていたことにはだいぶ驚きですが。

yaneuraoyaneurao 2012/02/26 02:13 > CSMは合成時にはフーリエ変換は必要ないと記憶しています。

はい、合成時の問題ではなくデータ生成時の問題です。

再生するためのデータを作成する時に、当時のPCでは1秒の再生データを作成するために(離散コサイン変換で)数時間かかるらしかったのです。(私が試したわけではないので「数時間かかる」というのは伝え聞きなのですが。まあ、CPUのクロックが4MHzの時代ですから…)

あとは、CSM音声合成のためのドライバーの実装上、YAMAHAのFM音源チップ(YM2151など)のCSMモードを使いたかったのですが(当時のYAMAHAのFM音源チップにこのCSMモードが備わっていました)、インターバルタイマー(タイマー割り込み)が使えないPCですと、これを使うのがすこぶる難しく、現実的には不可能じゃないかと言われていました。

あとは、当時、YM2151の資料が私の手元にはなくて、『試験に出るX1』(故 祝 一平氏)の著書だけが頼りでしたので、そのへんの仕様も私にはよくわかってなくて、まあ、そんなYM2151のCSMモードなんか使わずに自前でサイン波合成してCSMすればいいんですけど、当時、CSMについてそこまで私の理解が至ってなくて…。

いま思い返すといろいろとgdgdな感じでどう考えても黒歴史っぽいのですが、そろそろ20年前のプログラムのリベンジをしないといけませんかね、これは。

yaneuraoyaneurao 2012/02/26 02:21 どうもおかしいなと思って、いま本文読み直したら私は「離散コサイン変換」を「離散フーリエ変換」って書いていて、しかもこれが再生時の話なのかデータ生成時の話なのかさっぱりわからないという、ひどい文章になっていたので、その部分を修正しました。

謹んでお詫び申し上げます。

mitsumitsu 2012/02/26 07:50 知り合いに「書かれてるよ〜」と言われて、見に来ました。
懐かしい話題に思わずコメント付けてしまいます。

CSMは、技術としては元々あったものですから、「開発」というより「実装」ですかね。また、私はデータ作りのほうを担当していて、88SRで鳴らすほうのプログラムは、昨年夏に亡くなった宮路武氏が作っていました。
当時は、そもそも音声データ取り込みのためのA/Dコンバータのボードから自作でした。解析プログラムはPC-9801で動かしていたのですが、どうすると正しいデータが出てくるのか模索しながらの解析プログラム作成だったのでBASICで動かしていました。1秒分の音声データ解析に2時間くらいかかっていたでしょうか。
もっとも、セリフ一つの解析は、帰るときにプログラム立ち上げたら、次の朝には終わっており、そもそも延々とセリフをしゃべらせるようなモノもなかったので、時間はさほど苦になりませんでした。
問題は変換が終わった後、ピークを4つ拾う作業のほうでした。
当時のセリフはほんとんど社内の人間がしゃべっていました。(音質がアレなので、プロの声優を雇ってもしょうがない。その割に、録音機材は社内に転がっていた2トラ38のオープンリールなんて大げさなものを使っていたのですが・・・)
しかし、声質によって、キレイにピークが4つ拾える人、うまく拾えない人がいて、社内での声優?の選定基準は、基本的に「変換でピークがうまく拾える人」でした。
(ワタシの声もそこそこうまく拾えたので、シルフィードでは宇宙の帝王ザカリテをやらせてもらっています)

ちなみに、88SRでは、CSMモードの付いた音源チップ搭載が、セールスポイントの一つになっていたようですが、肝心のNECがCSMモードを使いこなせておらず、アーツのゲームが(音質はちょっとアレながら)しゃべりまくるのに驚いた、という逸話もあるようです。

mitsumitsu 2012/02/26 08:31 ちょっと追記します。
前のコメントだと、手作業でピークを拾っていたと誤解されるかもしれない書き方でしたが、もちろん、ピークを拾う作業も変換プログラムの中でやっていました。
人によっては、パワースペクトルが明確な山を持つのですが、うまく出ない人もいて、拾うのが一苦労でした。一度プログラムで拾った後、手作業で修正を加えることも考えたのですが、作業量が膨大になって、さすがに無理でした。

yaneuraoyaneurao 2012/02/26 10:58 ↑うお!直々のコメント、ありがとうございます!

> 当時は、そもそも音声データ取り込みのためのA/Dコンバータのボードから自作でした。

あー、そうですね。私はX68000の発売直後(1988年ごろ)に音声合成をやっていたので、音声の取り込みはX68000を持っている友だちにお願いしていました。『シルフィード』の発売は1986年(製作はその1年ぐらい前から?)ですから、A/Dコンバーターのボードを自作するところからなのですね。私は何か業務用の機材があるのかと思っていましたが、まさか自作とは…。

こうして、ときとしてITの歴史上の人物(?)に直接コメントをいただけたりするのが、インターネットの凄いところで、歴史的傍証と言いますか、今日の私の記事が単なる私の与太話だったものが、一瞬にして音声合成の歴史として資料的価値の高い記事に昇華されたのであります。

> ちなみに、88SRでは、CSMモードの付いた音源チップ搭載が、セールスポイントの一つになっていたようですが、肝心のNECがCSMモードを使いこなせておらず

そうですね。CSMモードは設計がピーキーだったのもあって…。

CSM音声合成では『ゼリアード』のオープニングにあった「我二千年の眠りより蘇り、再びこの世に君臨せん」という台詞が私の一番のお気に入りで、プログラマー同士のオフ会ではこの台詞をよく口真似して笑いをとったものです。

いまYouTubeを探してたらゼリアード実況プレイの動画があって、1:23〜1:34にこの台詞がありました。
http://www.youtube.com/watch?v=WCfEWE1z3TI

長々とすみません。

mitsumitsu 2012/02/26 13:40 ではもう少し追加情報を
A/Dコンバータは、81年ごろ、東大マイコンクラブの駒場祭で「音階認識システム」を作るために一度自作しています。当時のPC-8001では、音声認識はさすがに難しいけれど、音程を認識して、歌を楽譜にするくらいのことは出来るのでは、ということから始まったプロジェクトでした。マイクに向かって歌うと、8001の画面に楽譜が出るという、まあ、今の技術からみるとなんともたわいも無いものでしたが、NHKやフジテレビの番組にも取り上げてもらった記憶があります。(フジの番組では、松田聖子に歌わせたのではなかったかな)
そのときのA/Dコンバータを、9801に繋ぐために改造したか、ほぼ同じモノを9801用に作ったか、このどちらかが手元に合ったのを使いました。

このA/Dコンバータは、シルフィードよりさらに前、ASCIIでPC-6001用のAXシリーズを作ったときに一度使っています。
AX-7のデモンストレーションプログラムでは「AX-7 by ASCII」としゃべっているのですが、これは、6001のPSGを使ったもので、最大周波数で音を鳴らしておいて、16段階のボリュームを細かくコントロールして4ビットのPCM再生を試みるという荒業でした。

画面が出ていると割り込みで再生レートが乱れるので、AX-7のデモでは、音声が出ている時には画面が出ないという無茶な仕様になっています。

mitsumitsu 2012/02/26 13:53 ゼリア−ドの音声ですが、魔王の声は作曲を担当していたメカノアソシエイツの青山さんだったと記憶しています。
彼は、教会の「アーメン」、武器屋の「冷やかしなら出て行け」、宿屋の「はい一名さんご案内」、賢者の「レベルアップの呪文」も担当しています。

これらの声は、先日発売になったゲームアーツベストコレクション
http://www.amazon.co.jp/%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%A2%E3%83%BC%E3%83%84-%E3%83%99%E3%82%B9%E3%83%88%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3-VA/dp/B006QU1XUE
に全部収録されています。
ゼリア−ドのBGMは、今回初のCD化です。よろしかったら是非どうぞ(と、ここで軽く宣伝。とはいっても、売れてもワタシにはお金が入るわけじゃないんだけど)

そうそう、賢者の呪文は、ちょっとしたセリフの逆再生になっています。
納品されたセリフを普通に解析して、吐き出されたデータを逆から再生するだけなので、作業は簡単でした。

どんなセリフの逆回しか?
うーん。それは、ネットに転がっている音声ファイルや、先のCDから取り込んで、逆に再生してみてください。

ちなみに呪文は2種類納品されて、片方がボツ、片方が採用になったのですが、ボツになったほうのセリフは「寿限無寿限無五劫の擦り切れ」の逆再生でした。

yaneuraoyaneurao 2012/02/26 19:58 ↑*1,*2 なんという俺得情報!! 本当にありがとうございます。インタビュー記事として然るべきところに残しておくに値する情報ですね。

> 6001のPSGを使ったもので、最大周波数で音を鳴らしておいて、16段階のボリュームを細かくコントロールして4ビットのPCM再生を試みるという荒業でした。

そう言えば、PC-8001のような、beep音しか鳴らないマシンでMMLで定義した音楽を再生するプログラムが当時(1985年ごろ)、PCマガジン等に同時多発的に掲載されていて、ソースコードを見るとbeep音のon/offだけでやっていたように思います。(PC-8001のbeep音にはボリューム調整がなかったんでしょうね。)

音量調整が出来る場合、おっしゃるような、ボリュームレジスタに値を書きこんで、擬似的にPCMを実現しているソースコードも私はいろいろ見たことがあります。このテクニック、当時、流行ったんですかね…。

ただ当時のことを思い返すに、ボリュームは、あまり線形性がよろしくて、ずいぶんひずんだ音になっていた気がします。

t 2012/02/26 20:24
http://simesabat.blog.shinobi.jp/Entry/9/

連続音をデータベースで持つというのはあるみたいですね

http://akita-neru.at.webry.info/200908/article_2.html

 diphone合成というらしい


ttp://d.hatena.ne.jp/keyword/UTAU%CF%A2%C2%B3%B2%BB%B2%BB%B8%BB

http://ja.wikipedia.org/wiki/%E9%9F%B3%E5%A3%B0%E5%90%88%E6%88%90

というかWIKIPEDIAが

mitsumitsu 2012/02/26 20:35 >ボリュームは、あまり線形性がよろしくて、ずいぶんひずんだ音になっていた気がします。

もちろん、そのまま4bitのPCMデータとして扱ったらダメです。ボリュームは対数目盛になっているので。
ボリューム0と1の差に対して、ボリューム14と15の差は、何十倍もあります。なので、256段階でサンプリングしたデータを、0〜5まではボリューム0で、6〜12まではボリューム1で・・・・160〜200はボリューム14で、201〜255をボリューム15で、というようなテーブルを作って変換してデータを作っています。

当時は、PC-6001でボリュームを直線的に変化させて鳴らした音を、A/Dコンバータで取り込み直してテーブルの値を決定していました。

ちなみに、ボリュームコントロールが無い状態でも、8bitでサンプリングしたデータを、128を境界線としてプラスとマイナスに分けてオンオフで再生するやり方で(かなり強引な方法ですが)なんとか聞ける音を作ることが可能です。言ってみれば、1ビットのPCMですね。

・・・あと、調べてみたらAXシリーズのデモで音声を出したのは、AX-7ではなくてAX-6でした。

通縋通縋 2012/02/26 23:04 >人間の発声の仕組みに相当する物理モデルを組み立てて、それをシミュレーションしてはどうかと思う。

そんなことが実現できたら、フォルマント兄弟が大変喜びます。

yaneuraoyaneurao 2012/02/27 00:10 ↑*2
> 当時は、PC-6001でボリュームを直線的に変化させて鳴らした音を、A/Dコンバータで取り込み直してテーブルの値を決定していました。

うわ!!当時にそこまでされてたんですか。いやー、脱帽です。フィードバック制御にも通ずるものがありますね。

> 128を境界線としてプラスとマイナスに分けてオンオフで再生するやり方で(かなり強引な方法ですが)なんとか聞ける音を作ることが可能です。

こっちは私も自分でプログラムを書いたことがあります。X68000で広まっていた萌えボイス(?)のデータをフロッピーに入れてもらってきたものをX1で再生するときにそういうプログラムを書きました。昭和初期のラジオ放送のような「さらさら」した(?)ノイズが乗っていて、あれはあれで味がありました。

yaneuraoyaneurao 2012/02/27 00:25 ↑*4
> 連続音をデータベースで持つというのはあるみたいですね

それはまあ、リコーのVC2以前からある一番お手軽でそれらしく聴こえる実装でして。いまどきのPCならメモリも潤沢にあるので、よく出現する連続した音素の組み合わせは長いもの(3音素とか4音素とか…)も持っておけば、かなり自然に聴こえるでしょうね。録音するのが大変でしょうけども。

↑*2
> そんなことが実現できたら、フォルマント兄弟が大変喜びます。

フォルマント兄弟って私、知らなくて、いま初めて↓の動画を見たのですが、面白すぎてドミノ・ピザが食べたくなってきました!
http://www.youtube.com/watch?gl=JP&hl=ja&v=FFvFlpVjEjM

NOGUENOGUE 2012/02/27 04:15 >ボリュームコントロールが無い状態でも、8bitでサンプリングしたデータを、128を境界線としてプラスとマイナスに分けてオンオフで再生するやり方で(かなり強引な方法ですが)なんとか聞ける音を作ることが可能です。
この場合、128で分けるのではなく、1ビットDAC的な動作をさせたほうが音質的に有利なはずです。(可能なかぎり高周波で動作させて値によって0と1を割り振る。たとえば64なら0を3回で1を1回というふうに。)PC-9801のBEEP音でPCM再生する方法として使われていました。

yaneuraoyaneurao 2012/02/27 11:36 > この場合、128で分けるのではなく、1ビットDAC的な動作をさせたほうが音質的に有利なはずです。

はい、まあ、mitsuさんはゲームの製作者サイドですから(音声素材自体も自分たちで用意できる立場ですから)、「1ビットDAC的な動作」をさせるぐらいなら、サンプリングレートを上げた音声素材を用意しなおすというのは、前提条件としてあるのではないでしょうか。

要するに、
1) 8bitでサンプリングしたデータを「1ビットDAC的な動作」で再生させる
2) 8倍のサンプリングレート × 1bit でサンプリング したものをbeepのオン/オフで再生させる
のとでは、同じデータ量ですが2)のほうがいい音質になるという…。

つまり、
既存の8bitでサンプリングされた音声データをなるべく忠実にbeepで再生したいなら → 1)
音声素材自体を作りなおして良いなら → 2)
という話。

hex125hex125 2012/02/27 21:34 もってけ!〜を作った者です。取り上げていただきまして、ありがとうございます。

yaneuraoyaneurao 2012/02/27 22:47 ↑こちらこそ、素晴らしい動画をupしていただき、ありがとうございます。X1用の市販ソフトの開発などをやっていた私としてはこれがX1で動いているというのは感動そのものです。

通縋通縋 2012/03/01 00:56 10年ほど前の話ですが、フォルマント兄弟の中の人に聞いた所では、ATRに人間の発声について研究している部署があるので、そこの人達と一緒に「人間の発声の仕組みに相当する物理モデル」の構築に関する基礎的な調査はしたけど、リアルタイムに変形する柔らかい口腔内の動きをコンピュータでシミュレートするのは非常に難しいと言う事が判って頓挫したそうです。
僕自身もATRに行って、人間の発声の様子のレントゲン動画を見ましたが、難しいだろうことは容易に想像出来ました。

で、フィジカルに発声させる口腔のモデルの場合でも、現在の所、こんな面白く不気味な感じのものしか出来てません。
https://www.youtube.com/watch?v=J_R7fgo0FLc

このモデルだと、ペペローションでも含ませない限り、口の中カラッカラですね。

yaneuraoyaneurao 2012/03/01 03:15 ↑とても面白いですね。物理的に人間の発話の仕組みを再現しようという試みですね。それをコンピューターのなかで仮想的に再現すればどうかというのが私の思うところなのですが、そのためには空気の流れ(流体の)シミュレーションを正確にしないといけないでしょうから、いまのコンピューターでそんなことが出来るのかというのはあります。流体より、もう少しお手軽な物理モデルでどうにかなるのが理想なのですが、そんなに甘くないのでしょうね…。

h_sakuraih_sakurai 2012/03/01 07:36 声道モデルってやつらしいです。
http://www.splab.ee.sophia.ac.jp/Vocal_Tract_Model/index-j.htm
flashで音声合成する音声合成もどきが面白いです。
まずは母音のフォルマントがキーワードというかんじですが数式の意味がさっぱりわかりません(汗
http://wonderfl.net/c/nHqP

yaneuraoyaneurao 2012/03/01 15:13 ↑その後者のリンクのソースコード凄いですね。簡単な数式で母音が再生できてますね。

yaneuraoyaneurao 2012/03/03 15:23 twitterのツイートに返信。

https://twitter.com/#!/tekisuke/status/175798044602798081
> tekisuke やねうらおさんのところでCSM音声合成話が。 t.co/lVA4iQY2 VSTプラグイン化したXacaliteの話をしたい気もするがおそれおおくて書き込めないw t.co/ypCrzUIW

CSM音声合成のVSTプラグインですか!素敵!

トラックバック - http://d.hatena.ne.jp/yaneurao/20120226
 | 

人気blogランキング
1900 | 01 |
2004 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 03 | 04 | 05 |


Microsoft MVP
Microsoft MVP Visual C# 2006.07-2011.06