Wizardcraft

音専門のエンジニアが書く、音響音楽解析の技術録、音楽のレビューおよび分析、作曲活動に関する雑記です

Pythonで楽曲のリズム分析: Novelty Function

はじめに

この記事では、Onset 検出や局所/大域のテンポ分析などリズム分析においてよく使われる、Novelty Function についてPythonのコードとともに紹介します。実装と理解の助けになれば幸いです。


Novelty Curve/Function (Onset_envelope)

wizardcraft.grimoire.work

上記記事のBPM算出の際、拍(ビート)・発音タイミングが分かりやすい信号の周期性を分析するのが肝でした。リズム分析において、このような信号は Novelty Curve/Function と呼ばれています。よく使われている2種類の手法を紹介します。

  1. Energy based
    • 時間領域で、ある時間区間範囲の振幅/パワー値の総和を算出
    • それぞれ先の時間フレームとの差分を算出
    • 半波整流波形化: 負の値(=エネルギー減衰)は0に置換する
  2. Spectral based
    • 時間周波数領域に変換
    • 周波数ごとに、ある時間区間範囲の振幅/パワー値の総和を算出
    • それぞれ先の時間フレームとの差分を算出
    • 半波整流波形化: 負の値(=エネルギー減衰)は0に置換する
    • 周波数で合算(例:平均)

LibROSAでも採用されている 2. は Spectral Fluxの算出と似ています。(ただし、負の値を0にしており、つまり音の立ち下がりについては無視しています。)周波数ごとに差分をとることで、各楽器の立ち上げりが捉えやすくなるのだと思います。

LibROSAなど、いくつかWeb上の実装を見てみると、 - エネルギー総和を算出する時間区間の長さ - log を取る(=人間の聴感に合わせる) - (Spectral based) 周波数重み付け といった工夫がみられます。

実装と適用例

import numpy as np
import librosa
import matplotlib.pyplot as plt

# Load music singal
filepath = librosa.util.example_audio_file()
y, sr = librosa.load(filepath, offset=30)

# Energy based novelty curve
mean_square = librosa.feature.rms(y=y)[0]
energy_novelty = np.log( mean_square[1:]/ (mean_square[:-1] + 1e-9) )
energy_novelty[energy_novelty<0.0] = 0
energy_novelty /= np.max(energy_novelty)

# Spectral based novelty curve
Y = np.log(np.abs(librosa.stft(y))+1e-9)
spectral_novelty = None
n_freq, n_tf = Y.shape
spectral_novelty = np.zeros(n_tf-1)
for f in range(0, n_freq):
    tmp = Y[f,1:] - Y[f,:-1]
    tmp[tmp<0.0] = 0.0
    spectral_novelty += tmp
spectral_novelty /= np.max(spectral_novelty)

plt.subplot(4,1,1)
plt.plot(y)
plt.title("Original music signal")
plt.subplot(4,1,2)
plt.plot(mean_square)
plt.title("RMS")
plt.subplot(4,1,3)
plt.plot(energy_novelty)
plt.title("Energy based novelty function (Onset Envelope)")
plt.subplot(4,1,4)
plt.plot(spectral_novelty)
plt.title("Spectral based novelty function (Onset Envelope)")

plt.tight_layout()
plt.show()

f:id:Kurene:20191015231603p:plain
図1: Novelty Function

Spectral based Novelty function の方が、細かいリズムを捉えやすそうな信号となっていることが分かります。

参考文献

https://www.audiolabs-erlangen.de/content/05-fau/professor/00-mueller/02-teaching/2019w_mpa/2019_Mueller_MP-BeatTracking_6.pdfwww.audiolabs-erlangen.de

https://www.audiolabs-erlangen.de/resources/MIR/FMP/C6/C6S2_TempoBeat.htmlwww.audiolabs-erlangen.de

musicinformationretrieval.com

librosa.core.load() のバックエンドが audioread から PySoundFile に代わった件

PySoundFile vs audioread ?

LibROSAを最新版 (0.7.1) に更新したら、LibROSAの音楽信号の読込を担う load()のバックエンドが、audioreadからPySoundFileに代わったとのこと。

ただし、LibROSA 0.7.1では、PySoundFileがインストールされていない場合は代わりにaudioreadを使う実装になっています。

>>> y, sr = librosa.load(filepath, sr=sr, duration=10, mono=True)
...Python36\site-packages\librosa\core\audio.py:146: UserWarning: PySoundFile failed. Trying audioread instead.
  warnings.warn('PySoundFile failed. Trying audioread instead.')

PySoundFileでは、様々なオーディオデータを扱うことができる C言語実装のライブラリ Libsndfile を使っています。audioreadFFmpegをバックエンドとしているため、導入に一手間必要&処理的に非効率ということなのでしょうか…。

また、audioreadでは、強制的にPCM16-bitのデータになってしまうため、24-bit等のデータをそのまま扱えないという問題もあるようです。

デベロッパーの Brian McFee 氏曰く、

bmcfee commented on 12 Mar

Quick benchmark: loading a 4-minute wave file brings the average load time from 92ms down to 8ms.

Speedup is less dramatic on compressed files (eg ogg), but everything seems to work as expected.

[CR needed] Soundfile-based loader #847

とのことなので、長い or 大量の楽曲信号を扱うときに嬉しい気がします。

github.com

github.com

youtube-dl でYouTube動画の最高音質のオーディオデータ (.m4a) をメタデータ付きでダウンロード

1. youtube-dl (+ ffmpeg) のインストール

wizardcraft.grimoire.work

2. AtomicParsley のインストール

コマンドラインで、MPEG-4メタデータを編集できるソフトウェアです。

atomicparsley.sourceforge.net

環境に適合するバージョンをダウンロードしてください。ダウンロード後、適当なフォルダに展開し、環境変数を編集してください。

sourceforge.net

3. youtube-dl を実行

>youtube-dl -f bestaudio --extract-audio --embed-thumbnail --add-metadata [Video ID]

参考元:

askubuntu.com

諸注意

youtube-dlを利用する際は、コンテンツの著作権および著作権法に十分注意してください。 当方ではその責任を一切負いかねます。

Jupyter notebooksで音楽信号処理の基礎を学べるフレームワーク:FMP Notebooks

AudioLabs @ FAU の、音楽信号処理の権威、Meinard Müller 先生が、ご自身の著書 "Fundamentals of Music Processing (FMP)."に沿った教材として、Jupyter notebooks で音楽信号処理の基礎を学べるフレームワークFMP Notebooks を公開しています。

音楽信号処理や音楽情報検索の基礎技術について、オーディオ信号(波形データ)に関する処理をまとめた教材になっています。Jupyter notebooksにより、技術の詳細とともにPythonのコードが対話的に記述されているため、非常に効率良く技術を学ぶことができる素晴らしい教材です。

概要については、ISMIR2019 で発表予定となっている以下の予稿にまとめられています。

Meinard Müller and Frank Zalkow: FMP Notebooks: Educational Material for Teaching and Learning Fundamentals of Music Processing. Proceedings of the International Conference on Music Information Retrieval (ISMIR), Delft, The Netherlands, 2019.

これほどの内容が、しかもコード付きで、Webで公開されているのは非常に驚きです…!音楽信号処理について分かりやすく体系的に書かれている文献はあまりないので、是非とも活用していきたいものです。

Python: LibROSA を用いた調波打楽器音分離 (HPSS)

調波打楽器音分離とは?

一般的な楽曲では、様々な楽器音が含まれています。 そのため、楽曲信号から直接音楽的な情報(例:コード進行)を分析するのは 計算機ではなかなか難しいです。

そこで、分析の前処理として、 打楽器の音と非打楽器(調波楽器)の音を分離する調波打楽器音分離 (HPSS: Hermonic/Percussive Source Seperation) *1が良く使われています。

この記事では、HPSSの概要とPython (LibROSA) のコードの解説します。



調波打楽器音分離のアイディア

フーリエ変換等を使って周波数に変換した楽曲信号を考えます。

f:id:Kurene:20191012204945p:plain

上記の画像のように、楽曲信号には複数の楽器の音が含まれています。

調波打楽器音分離では、楽曲信号は調波楽器音と打楽器音を足し合わせた構造であると考え、
楽曲信号から調波楽器音と打楽器音を推定
します。*2

ただし調波/打楽器音は未知であるため、何らかの仮定をおく必要があります。

調波打楽器音分離では、上記の画像を見て気づくように、

  • 調波楽器音: 時間方向に連続的
  • 打楽器音:  周波数方向に連続的

であるという特徴を用いることで、調波/打楽器音を推定します。 (もしくは、調波/打楽器音について何らかの事前学習を行う手法もあります。)

アルゴリズムの設計

非負値行列因子分解+基底クラスタリング

非負値行列因子分解を用いて複数の基底を求めた後、
その基底をSVMサポートベクターマシン)で調波/打楽器音基底に2クラス分類します。そして、調波/打楽器音に分類された基底のみを用いて対応するアクティベーション行列との行列積を求めることで、調波/打楽器音のみの信号のスペクトログラムを推定します。なお、基底分類用の2クラスSVMの学習を事前学習しています。

Separation of drums from polyphonic music using non-negative matrix factorization and support vector machine - ResearchGate

最適化問題(行列因子分解)として解く

次のコスト項と制約に基づく最適化問題として解く手法です。

  • 調波/打楽器音の時間/周波数方向の連続性に基づくコスト項
  • 等式制約
  • 非負値制約

以下の論文では補助関数に基づく反復アルゴリズムにより、調波/打楽器音のスペクトログラムを推定します。

Separation of a monaural audio signal into harmonic/percussive components by complementary diffusion on spectrogram - ResearchGate

メディアンフィルタベースの手法

最適化問題として解く場合、アルゴリズムが複雑になり、また、どうしても計算量が多くなってしまいます。そのため、大量の楽曲データを解析したり、高速な処理が求められたり、計算資源が限られているユースケースでは使いづらいことがあります。

一方で、以下の論文では、画像処理などでよく使われているメディアンフィルタを用いることで、高速に調波/打楽器音を推定しています。

Harmonic/Percussive Separation using Median Filtering - ResearchGate

この手法では、周波数/時間方向の1次元メディアンフィルタを元の楽曲信号にフィルタリングすることで調波/打楽器音を算出します。LibROSAの実装もこちらの手法がベースとなっています。

LibROSAにおける調波打楽器分離(HPSS)の実装

使い方

# Extract harmonic and percussive components
y, sr = librosa.load(librosa.util.example_audio_file())
y_harmonic, y_percussive = librosa.effects.hpss(y)
# Get a more isolated percussive component by widening its margin
y_harmonic, y_percussive = librosa.effects.hpss(y, margin=(1.0,5.0))

librosa.effects.hpss()

実装の詳細

LibROSAのHPSS(調波打楽器音分離)の実装を見ていきます。

librosa.effects.hpss()

楽曲信号yをそのまま引数にできる、便利なラッパーです。
中身は、時間周波数領域への変換と逆変換を行っているだけです。

y_harmonicy_percussiveがそれぞれ調波/打楽器音です。これら信号を様々な分析に利用したり、```librosa.output.write_wav()````で書き出したりします。

HPSSの本体はlibrosa.decompose.hpss() であり、それに時間周波数領域の楽曲信号をstft渡しています。

def hpss(y, **kwargs):

    # Compute the STFT matrix
    stft = core.stft(y)

    # Decompose into harmonic and percussives
    stft_harm, stft_perc = decompose.hpss(stft, **kwargs)

    # Invert the STFTs.  Adjust length to match the input.
    y_harm = util.fix_length(core.istft(stft_harm, dtype=y.dtype), len(y))
    y_perc = util.fix_length(core.istft(stft_perc, dtype=y.dtype), len(y))

    return y_harm, y_perc

librosa.effects.hpss()

librosa.decompose.hpss()

処理の流れは以下通りです。

  1. 時間周波数領域の楽曲信号Sを、振幅Sと位相phaseに分離
  2. kernel_sizeより、調波/打楽器音成分用のメディアンフィルタの長さwin_harm/win_percを設定
  3. marginより、調波/打楽器音成分用の閾値を設定(後述)
  4. 周波数/時間方向の1次元メディアンフィルタを適用し、それぞれ調波/打楽器音の振幅スペクトログラムmask_harmmask_percを算出
  5. ソフトマスク(ウィーナーフィルタ)librosa.util.softmask()を適用
    • margin_harm/margin_perc > 1の場合、その値に応じて閾値処理
  6. 返り値
    • mask==True: 調波/打楽器の振幅スペクトログラムを返す
    • mask==False: 元の楽曲信号の位相をそのまま利用して、調波/打楽器の時間周波数領域の信号を返す
def hpss(S, kernel_size=31, power=2.0, mask=False, margin=1.0):
    # (1) 
    if np.iscomplexobj(S):
        S, phase = core.magphase(S)
    else:
        phase = 1

    # (2)
    if np.isscalar(kernel_size):
        win_harm = kernel_size
        win_perc = kernel_size
    else:
        win_harm = kernel_size[0]
        win_perc = kernel_size[1]
    
    # (3)
    if np.isscalar(margin):
        margin_harm = margin
        margin_perc = margin
    else:
        margin_harm = margin[0]
        margin_perc = margin[1]

    # (4) Compute median filters. Pre-allocation here preserves memory layout.
    harm = np.empty_like(S)
    harm[:] = median_filter(S, size=(1, win_harm), mode='reflect')

    perc = np.empty_like(S)
    perc[:] = median_filter(S, size=(win_perc, 1), mode='reflect')

    ...

    # (5)
    mask_harm = util.softmask(harm, perc * margin_harm,
                              power=power,
                              split_zeros=split_zeros)

    mask_perc = util.softmask(perc, harm * margin_perc,
                              power=power,
                              split_zeros=split_zeros)
    # (6)
    if mask:
        return mask_harm, mask_perc

    return ((S * mask_harm) * phase, (S * mask_perc) * phase)

librosa.decompose

LibROSAの実装では、メディアンフィルタによって算出した調波/打楽器音の振幅スペクトログラムをそのまま使うのではなく、ソフトマスク(ウィーナーフィルタ)を利用することで聴感的な歪みを軽減しています。

また、調波/打楽器音を抽出しやすくするために、mask_harmmask_percという変数の値によって閾値処理を行っています。これは下記の論文で提案されている手法です。

Extending Harmonic-Percussive Separation of Audio Signals - ISMIR 2014

以下のページでは、この手法を適用した結果が公開されています。

https://www.audiolabs-erlangen.de/resources/2014-ISMIR-ExtHPSep/www.audiolabs-erlangen.de

LibROSA: 調波打楽器分離(HPSS)の適用例

コード

import librosa
import numpy as np
import matplotlib.pyplot as plt

# Main
sr = 16000
margin = 1.5
offset = 116
duration = 20
filepath = "02 Retrograde Amnesia.mp3"

y, sr = librosa.load(filepath, sr=sr, offset=offset, duration=duration, mono=True)
y_harm, y_perc = librosa.effects.hpss(y, margin=margin)

# Dump signals
librosa.output.write_wav('hpss_org.wav', y, sr)
librosa.output.write_wav('hpss_harm.wav', y_harm, sr)
librosa.output.write_wav('hpss_perc.wav', y_perc, sr)

# Plot
plt.subplot(3,1,1)
plt.plot(y)
plt.title("Original signal")

plt.subplot(3,1,2)
plt.plot(y_harm)
plt.title("Harmonic signal")

plt.subplot(3,1,3)
plt.plot(y_perc)
plt.title("Percussive signal")

plt.tight_layout()
plt.show()

実際の楽曲への適用

自身の楽曲に適用してみました。


f:id:Kurene:20191014181212p:plain
HPSSの適用結果

課題としては、

  • 調波楽器(エレキギター、ボーカル)のアタック音が打楽器音の方に含まれてしまう
  • (特に)打楽器音の音質が悪い

が挙げられます。

コード進行やリズムの分析などの用途としては十分かもしれませんが、調波/打楽器音単体を聞きたいというような用途に対してはまだ余地があるように思います。そのような場合、パラメタ(例:フィルタサイズ、マージン)をチューニングしてみるか、最適化ベースの手法を検討してみるのもよいかもしれません。

また、調波音を取り出すメディアンフィルタが時間方向に大きな幅を持つことが、リアルタイム処理の場合は問題となります。従って、フィルタの形状等に何らかの工夫が必要になります。

まとめ

調波打楽器音分離のLibROSAでの実装を中心に解説しました。

*1:HPS: Hermonic/Percussive Seperationと呼ばれることもあります

*2:時間周波数領域における楽曲信号の振幅/パワースペクトログラムを入力として与えます

Python: LibROSAによるBPM自動算出の詳細 

はじめに

この記事では、Pythonの音楽分析モジュールである LibROSA
実装されているBPM算出手法について、コードをベースに 解説をします。

BPM自動算出の概要・設計方針については、以下の記事をご参考ください。

wizardcraft.grimoire.work

LibROSAのBPM自動算出の詳細

LibROSA によるBPM算出

# Estimate a static tempo
y, sr = librosa.load(librosa.util.example_audio_file())
onset_env = librosa.onset.onset_strength(y, sr=sr)
tempo = librosa.beat.tempo(onset_envelope=onset_env, sr=sr)

>>> tempo
array([129.199])

librosa.beat.tempo Examplesより

  1. librosa.load()を使って、楽曲の時間信号yとサンプリング周波数srを得る
  2. librosa.onset.onset_strength関数により、onset strength envelope(発音強度包絡)onset_envを得る
  3. librosa.beat.tempo()onset_envを与え、BPM tempoが算出される

楽曲信号には、リズムを分析するのに不必要/邪魔な成分が含まれています(調波楽器のアタック音以外や、反響・残業など)。そこで、BPM算出などのリズムの分析の際には、まず楽曲信号から発音強度の時間系列(=発音されたタイミング)を算出し、それを使って分析を行うのが一般的です。

librosa.onset.onset_strength() について

以下の論文で提案されている SuperFlux というOnset検知手法の一部をベースにしています。

(SuperFluxでは、さらに Peak-picking と呼ばれる識別処理により、Onsetの時間フレームか否かの2クラスに分類します。)

Maximum filter vibrato suppression for onset detection - DAFx-13

実は中身はonset_strength_multi() です。
コアとなる処理部のコードを見てみましょう。
※デフォルトでは、ref = Slag = 1です。

# Compute difference to the reference, spaced by lag 
onset_env = S[:, lag:] - ref[:, :-lag]

# Discard negatives (decreasing amplitude)
onset_env = np.maximum(0.0, onset_env)
...

if aggregate is None:
    aggregate = np.mean
...

if aggregate:
    onset_env = util.sync(onset_env, channels,
                          aggregate=aggregate,
                          pad=pad, axis=0)

librosa.beat.onset_strength()

以上の処理により、入力された楽曲信号の対数パワースペクトログラムSの時間フレーム方向の差分の、周波数平均を計算しています。

これは音楽分析でよく使われる、 Spectral flux と呼ばれる特徴量です。ただし、Spectral fluxの負の成分は0としています。

語弊を恐れず言えば、急激に音圧が大きくなる時間フレームで大きい値を取ります。つまり、```onset_env````は発音の強さを表す特徴量の時間系列となっています。

LibROSAのBPM検出では、このSpectral flux を元にBPMを算出します。この周辺技術については、以下のドキュメントが参考になります。

librosa.github.io

librosa.beat.tempo()について

重要なコードを引用します。

librosa.feature.tempogram で算出されるテンポグラムを元に(グローバルな)BPMが算出されます。

テンポグラム行列tgの形状は(win_length, len(onset_envelop))であり、1次元目がBPMに対応する周波数(以降、BPM周波数)となっています。テンポグラムは自己相関関数により算出された局所的なテンポ変化を捉えるためのリズム特徴量であり、端的に言えば、各時間フレームでどのBPM周波数っぽいかを表しています。

(テンポグラムの詳細については、別途まとめたいと思います。)

処理の流れを示します。

大まかな流れとしては、時間フレームごとのBPM周波数(テンポグラム)を算出し、 時間平均+重み付けを行うことで、楽曲全体のBPMを算出しています。 (局所的なBPM周波数をサンプルとしたMAP推定っぽい感じ)

  1. onset_envelopeより、tempogram関数よりテンポグラムtgを算出
  2. tgを時間方向に集約(平均)する
  3. tgBPM周波数のインデックスに対応するBPMが格納されたベクトルbpmsを取得
  4. 事前確立(重み付け)ベクトルの負の対数であるlogpriorを作成
  5. logpriorを考慮して、最も楽曲のBPMらしい、BPM周波数インデックスbest_periodを算出
  6. best_periodbpmsインデックスとして与え、推定されたBPMを返り値とする
...
# (1)
tg = tempogram(y=y, sr=sr,
               onset_envelope=onset_envelope,
               hop_length=hop_length,
               win_length=win_length)

# (2) Eventually, we want this to work for time-varying tempo

if aggregate is not None:
    tg = aggregate(tg, axis=1, keepdims=True)

# (3) Get the BPM values for each bin, skipping the 0-lag bin
bpms = core.tempo_frequencies(tg.shape[0], hop_length=hop_length, sr=sr)

# (4) Weight the autocorrelation by a log-normal distribution
if prior is None:
    logprior = -0.5 * ((np.log2(bpms) - np.log2(start_bpm)) / std_bpm)**2
else:
    logprior = prior.logpdf(bpms)

...

# (5) Get the maximum, weighted by the prior
# Using log1p here for numerical stability ...(5)
best_period = np.argmax(np.log1p(1e6 * tg) + logprior[:, np.newaxis], axis=0)

# (6)
return bpms[best_period]

librosa.beat

最後に

LibROSAのBPM算出は処理が少し複雑ですが、BPM自動算出の設計方針にも書いたように、拍検出がしやすい信号(Onset envelope)に対して周波数分析(テンポグラム)を行うことでBPMを推定しています。

使ってみた感じ、EDMなどビートが分かりやすい楽曲には十分な精度だと思います。 一方で、ジャズやピアノソロなど人間が聞いても拍が分かりにくい楽曲へ適用する際には、まだまだ改善の余地がありそうです。

更なる精度向上のためには、以下のようなチューニングが考えられます。

  • 周波数帯域への重み付け
  • 邪魔な成分の除去/抑圧
  • 時間フレームへの重み付け、取捨選択
    • ノイジーな(BPM算出が難しそうな)区間を捨てる/信頼性を重みづける
  • BPMの値を制限
    • 最小/最大のBPMを限定する
    • 解像度

補足

Onset-envelope, Tempogramのプロット

f:id:Kurene:20191014150022p:plain
図1: Onset-envelope (中), Tempogram(下)

import librosa
import numpy as np
import matplotlib.pyplot as plt

y, sr = librosa.load(librosa.util.example_audio_file(), offset=15, duration=15)
onset_env = librosa.onset.onset_strength(y, sr=sr)
#tempo = librosa.beat.tempo(onset_envelope=onset_env, sr=sr)

ac_size=8.0
hop_length=512
win_length = librosa.core.time_to_frames(ac_size, sr=sr, hop_length=hop_length).item()

tg = librosa.feature.tempogram(y=y, sr=sr, onset_envelope=onset_env,hop_length=hop_length, win_length=win_length)

plt.subplot(3,1,1)
plt.plot(y)
plt.title("Audio signal")
plt.subplot(3,1,2)
plt.plot(onset_env)
plt.title("Onset envelope: onset_env")
plt.subplot(3,1,3)
plt.imshow(tg, aspect="auto")
plt.title("Tempogram: tg")
plt.tight_layout()
plt.show()

ハーディ・ガーディ音源まとめ

はじめに

ja.wikipedia.org

知る人ぞ知る、機械仕掛けのヴァイオリン、ハーディ・ガーディ。

中世ヨーロッパの情景を彷彿させる民族音楽らしい音色は、
どこかで聞いたことがあるのではないでしょうか。

民族音楽のような音楽を作る際には、バクパイプと並んで、 非常に重宝する音色です。 今回は、このハーディガーディの音源をまとめました。

あまり楽器が出回っておらず、演奏者も比較的少ないせいか、 音源の種類も少ないようです。

無料音源

Samsara Hurdy Gurdy FREE

samcycle.blogspot.com

無料のVST音源です。
32-bit版と64-bit版がありますが、自分の環境(FL Studio)では32-bit版のみ動作を確認しました。

他の音源と比べるとあまりリアルな音色ではないですが、
電子音楽などで使うのにはよいかもしれません。

有料音源

Hurdy Gurdy - Sonokinetic

www.sonokinetic.net

高音質な有料音源です。
1オクターブのドローン弦と、 2オクターブのチャンター弦を備えています。
ハーディガーディの画像の中央部にある、鍵盤設定パネルでは、

  • Flip:
    • ドローン弦とチャンター弦のキーボード割り当てを左右反転します
  • Always Trans.:
    • OFFの場合、チャンター弦をレガート(次の音へと滑らかに繋がる)で演奏します
    • ONの場合、次の打鍵の際の打鍵音が含まれます
  • IR
    • 反響・残響の制御
    • 3種類の空間プリセット(CASTLE HALL, ROOM, INN)
    • 2つのパラメータ: Room size, DRY/WET
  • Aftertouch Response
    • アフタータッチ(打鍵後の鍵盤の押し込みによる音色変化)を制御できます
  • Volumes

などの設定が可能であり、細かい音作りができます。 音色が高品質であり、ハーディガーディを使った本格的な民族音楽を作るのに
向いていると思います。

価格、その他スペックなど:

  • €49,90
  • 48 kHz, 24bit mono aif format
  • 1.04GB uncompressed
  • Kontakt or Kontakt player 5.7.1 以上

Hurdy Gurdy - Rhythmic Robot

www.rhythmicrobot.com

デモ音源を聞くと、民族音楽らしい空気感が作りやすい音源のように感じました。
価格的にもコスパはよさそうです。

また、上記サイトにはハーディガーディに関する詳しい説明が記載されています。
ハーディガーディの音作りの参考になるかもしれません。

また、Rhythmic Robot Audioではハーディガーディにインスパイアされたシンセ音源 Crank があります。
とてもアナログな温かみが感じられる音色です。
お得なHurdy Gurdyとのバンドルもあるのでご興味がある方はチェックしてみてください。

価格、その他スペックなど:

Hurdy Gurdy - Talesweaver Orchestra

https://www.taleweaver-orchestra.de/products/hgurdy.htmlwww.taleweaver-orchestra.de

こちらも非常に高音質なリアルな音源です。
音源のレビューされている方がいらっしゃいました。 yamachanthrash.blog.fc2.com

この音色で比較的安価なのも魅力的です。

ERA II Medieval Legends - Best Service

www.bestservice.com

$259 と少し値が張りますが、他の中世ヨーロッパ系の民族楽器音源を揃えられるのがメリットです。

また、同社のフリーのサンプラー"Engine"向けのライブラリであるため、
Kontaktが必要ないのも注目すべきところです。