音感トレーニングアプリ「Harmonize」で音程を良くしよう!相対音感、純正律を身につけたい人のために

音感トレーニングアプリ「Harmonize」で音程を良くしよう!相対音感、純正律を身につけたい人のために

「Harmonize(ハーモナイズ)」は、相対音感や純正律の感覚をゲーム感覚で鍛えられる音感トレーニングアプリ です。 吹奏楽やオーケストラで音程を磨きたい方はもちろん、歌の音程に苦手意識がある方、ギターやピアノのような平均律の楽器には慣れていても、フレットレス楽器やハモりに難しさを感じる方にも向いています。 このアプリでは、正解の和音を耳で覚え、自分の操作で同じ響きを作っていきます。単なる知識ではなく、耳で違いを感じながら音程感覚を育てていける のが特徴です。 こんな方におすすめ 相対音感を鍛えたい 純正律の響きを体で覚えたい ハモりやピッチの安定感を良くしたい 楽器のチューニングに近い感覚で音感練習したい 音程の「合っている」「ズレている」を感覚的に掴みたい アプリを作った理由 このアプリを作ったきっかけは、自分が大人になってからコントラバスを習い始めたことでした。今まで触れてきたのは、エレキベースやクラシックギターのようにフレットがある楽器が中心です。その感覚のままフレットレスの弦楽器に向き合うと、音程の粗さがそのまま表に出る ことを痛感しました。 そこで考えたのが、耳を頼りに音程を合わせる感覚を、もっと効率よく練習できる方法です。そうして作ったのが、この Harmonize です。 Note 「コントラバスは低音だから、多少ズレてもそこまで目立たないだろう」と甘く考えていましたが、実際はかなりシビアでした。レッスンでは何度も音程を注意されましたが、練習を重ねるうちに少しずつ改善していきました。 Harmonizeアプリで音感トレーニングしてみよう! Harmonize では、正解の和音と同じ響きを自分で作っていく ことで音感を鍛えます。 最初に正解の和音が流れ、その後は画面を操作しながら音程を少しずつ調整していきます。耳で「うなり」が減っていくポイントを探し、響きがきれいに重なる位置を目指します。感覚としては、楽器のチューニングやハモりの微調整にかなり近いです。 https://www.youtube.com/watch?v=XJJmpANMocA 二胡奏者の小林さんが、Harmonize の遊び方を動画でわかりやすく紹介してくださいました。現在のバージョンでは、すべての和音が純正律に対応しています。 セントとは? アプリのスコアには「セント」という単位が出てきます。これは、音程のズレを細かく表すための単位 です。 1オクターブは 12 個の半音でできていますが、半音単位だけではズレの細かさを表しきれません。そこで、半音を 100 等分したものが 1 セント です。 つまり、20 セントなら半音の 1/5、10 セントなら半音の 1/10 です。Harmonize では、このセントのズレを見ながら「どれくらい正解の和音に近かったか」を確認できます。 セントという言葉は、英語の cent と同じく「100分の1」という感覚だと覚えるとわかりやすいです。 純正律と平均律 このアプリでは、純正律 を基準に和音を作っています。 まず、普段よく使われている 平均律 は、1オクターブを均等に 12 分割した考え方です。ピアノやギターなど、多くの現代楽器はこの平均律を前提にしています。 一方の 純正律 は、音同士の周波数比がきれいに響く関係を重視した考え方です。たとえば「ド」と「ミ」の関係では、平均律なら 400 セントですが、純正律では少し低くなります。 $$ \mathrm{cents}_{\mathrm{JI}}=1200\log_2!\left(\frac{5}{4}\right) \approx386.314\ \mathrm{cents} $$ ...

公開: 2025年8月28日 · 更新: 2026年4月18日 · Toshihiko Arai

【Swift】リングバッファーのQueueでベンチマークテスト

Q? 突然ですが、プログラミングでQueueを処理するにはどうしますか? SwiftでQueueを作ってみました。次の単純なプログラムでサクッと作れました。 var max:Int! var data:[Any] = [] init(_ max:Int) { self.max = max } func enqueue(_ obj:Any) -> Bool { if data.count > self.max - 1 { return false } data.append(obj) return true } func dequeue() -> Any? { if data.count > 0 { let obj = data[0] data.remove(at: 0) return obj } return nil } しかしこのアルゴリズムは、問題があります。とくにC言語の場合で、致命的な問題になる場合があります。 このプログラムでは配列の先頭を削除してますが、内部では同時に配列全体を前方にシフトする処理を行っているので、配列が大きくなればなるほど速度が遅くなってしまうのです。 リングバッファ 何か良い方法があるのではと思いQueueのプログラムを調べていくと、リングバッファと呼ばれるアルゴリズムが見つかりました。 サイズの決まった配列を作り、輪のように見立てて考えます。0番から順番にデータを入れていきます。一周回ったら、また0番に戻ってデータを入れていきます。こうすることで、配列をシフトする処理の必要が無くなります。カウントの管理はheadとnumの値で管理します。enqueueしたらnumカウントを1プラスするようにし、dequeueしたら、headカウンタを1プラスします。enqueueすべきインデックスはhead+num番となります。dequeueすべきインデックスはhead番となります。 リングバッファーの説明およびプログラミングは、こちらのサイトが大変参考になりました。 http://www.cc.kyoto-su.ac.jp/~yamada/ap/queue.html SwiftでQueue さて、このリングバッファーのQueueを、Swiftでもやってみたいと思いプログラミングしてみました。 var head:Int = 0 var num:Int = 0 var max:Int = 0 var data:[Any]! var debug = false init(_ max:Int) { self.max = max self.data = Array<Any>(repeating: -1, count: max) } @discardableResult func enqueue(_ obj:Any) -> Bool { // キューが一杯だったらfalseを返す if num < max { self.data[(head + num) % max] = obj num = num + 1 return true } return false } @discardableResult func dequeue() -> Any? { if num > 0 { let obj = data[head] data[head] = -1 num = num - 1 head = (head + 1) % max; return obj } return nil } 動作確認を行うために、XCTestで次のプログラムを組んで確認してみます。 ...

公開: 2018年12月21日 · 更新: 2026年3月19日 · Toshihiko Arai