Python、ピッチオフセット、Pianoputer

翻訳者から:



あなたがお勧めする記事は新しいものではありません-3月29日に公開されました。 しかし、Redditに投稿されたのはほんの数日前であり、彼女は確かに関連性を失いませんでした。 その関心は、作者が単純で短い例を使用して、3つの大規模で人気のあるライブラリnumpy、scipy、およびpygameの実用的なアプリケーションを示していることです。 最初の2つについては多くの人が聞いていますが、科学研究の文脈でますます多くなっているので、「通常の」生活での応用を見ることは興味深いです。 記事の最後に、結果の優れたビデオデモンストレーションがあります。少なくとも一見の価値があります。



著者のコードは、PEP-8に従って設計されたものではないにもかかわらず、変更されずに保存されており、その妥当性を保証することはできません。 いずれにせよ、実際に動作するコードはGitHubにあります;リンクは記事の最後にあります。



サウンドを録音し、トーンを50回変更し、新しい各サウンドにコンピューターのキーボードのキーを割り当てます。 Pianoputerになります!







サウンドは、次のような値の配列(またはリスト、 リスト )としてエンコードできます。







このサウンドを2倍の速度で再生するには、配列の2番目の値をすべて削除します。







これにより、音の長さを半分にしただけでなく、周波数を2倍にしたため、音が高くなりました。



それどころか、各値を繰り返すと、音が遅くなり、周期が長くなるため、音が低くなります。







以下は、送信された係数に応じて音速を変更する単純なPython関数です。



import numpy as np def speedx(sound_array, factor): """ Multiplies the sound's speed by some `factor` """ indices = np.round( np.arange(0, len(snd_array), factor) ) indices = indices[indices < len(snd_array)].astype(int) return sound_array[ indices.astype(int) ]
      
      







音色を維持しながら音の長さを変更する(音を伸ばす)、または音程を維持しながら音の長さを変更する(音色シフト)のはさらに困難です。



サウンドストレッチ





クラシックフェーズボコーダー方式を使用してサウンドをストレッチできます。 最初に、サウンドを交差するピースに分割し、次にそれらを移動して、図のように交差するように(サウンドを減らすために)または小さく(ストレッチするために)します。







ここでの難点は、移動したピースの相互作用が不十分であり、これを防ぐために特定の位相変換が必要なことです。 ここから自由に書き換えられたPythonコードは次のとおりです



 def stretch(sound_array, f, window_size, h): """ Stretches the sound by a factor `f` """ phase = np.zeros(window_size) hanning_window = np.hanning(window_size) result = np.zeros( len(sound_array) /f + window_size) for i in np.arange(0, len(sound_array)-(window_size+h), h*f): # two potentially overlapping subarrays a1 = sound_array[i: i + window_size] a2 = sound_array[i + h: i + window_size + h] # resynchronize the second array on the first s1 = np.fft.fft(hanning_window * a1) s2 = np.fft.fft(hanning_window * a2) phase = (phase + np.angle(s2/s1)) % 2*np.pi a2_rephased = np.fft.ifft(np.abs(s2)*np.exp(1j*phase)) # add to result i2 = int(i/f) result[i2 : i2 + window_size] += hanning_window*a2_rephased result = ((2**(16-4)) * result/result.max()) # normalize (16bit) return result.astype('int16')
      
      







トーンオフセット





音を伸ばした後、音色を変えるのは簡単です。 より高いトーンを得るために、サウンドをストレッチし、トーンを維持した後、結果を加速して、最終的なサウンドが元のサウンドと同じ長さになるようにしますが、速度の変化によりトーンが高くなります。



サウンドの周波数を2倍にすると、トーンが1オクターブ、つまり12セミトーン増加します。 したがって、音をn半音だけ増やすには、ピッチに2 ^(n / 12)を掛ける必要があります。



 def pitchshift(snd_array, n, window_size=2**13, h=2**11): """ Changes the pitch of a sound by ``n`` semitones. """ factor = 2**(1.0 * n / 12.0) stretched = stretch(snd_array, 1.0/factor, window_size, h) return speedx(stretched[window_size:], factor)
      
      







アプリケーション:Pianoputer





新しいビーコンディスプレイサーを試してみましょう。 開始するには、ボウルを打つ:







次に、非常に低い音から非常に高い音まで、50の派生音を作成します。



 from scipy.io import wavfile fps, bowl_sound = wavfile.read("bowl.wav") tones = range(-25,25) transposed = [pitchshift(bowl_sound, n) for n in tones]
      
      







次のように、 このファイルで指定された順序に従って、キーボードの各キーにサウンドを割り当てます







コンピューターをピアノ( pianoputer )に変えるPythonコードは次のとおりです。



 import pygame pygame.mixer.init(fps, -16, 1, 512) # so flexible ;) screen = pygame.display.set_mode((640,480)) # for the focus # Get a list of the order of the keys of the keyboard in right order. # ``keys`` is like ['Q','W','E','R' ...] keys = open('typewriter.kb').read().split('\n') sounds = map(pygame.sndarray.make_sound, transposed) key_sound = dict( zip(keys, sounds) ) is_playing = {k: False for k in keys} while True: event = pygame.event.wait() if event.type in (pygame.KEYDOWN, pygame.KEYUP): key = pygame.key.name(event.key) if event.type == pygame.KEYDOWN: if (key in key_sound.keys()) and (not is_playing[key]): key_sound[key].play(fade_ms=50) is_playing[key] = True elif event.key == pygame.K_ESCAPE: pygame.quit() raise KeyboardInterrupt elif event.type == pygame.KEYUP and key in key_sound.keys(): key_sound[key].fadeout(50) # stops with 50ms fadeout is_playing[key] = False
      
      







以上です! そして今、私はあなたに伝統的なトルコの歌を演奏します( 実際にはそうではありません。







自宅で同じことを試してみたい場合、必要なファイルすべてここにあります。 HTML5 / JS / elm開発者の読者の中の誰かがブラウザベースのPianoputerを作成して、より多くの人が利用できるようになるといいと思います。



一般的に、コンピューターは音楽を再生するのに十分に使用されていないように思えます。 本物のピアノキーボードを使用したり、本物の楽器を録音したりする方が簡単ですが、Pythonの通常のボウルと60本のラインで何が達成できるかを見てみましょう。



安価なコンピューターでも、本格的な音楽ステーションになるのに十分なコントロールがあります。マイクに向かって歌ったり、ウェブカメラでジェスチャーを見せたり、マウスであらゆるものを変調したり、キーボードから残りを制御したりできます。 非常に多くの自己表現の手段があり、Pythonにはライブラリがあります...芸術的なハッカー、誰もこの方向に踏み込むことを望みませんか?



All Articles