質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • Python

    7929questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

python 和音を作るプログラム

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 320

Chuchuchu

score 11

pythonでドミソの和音を作るプログラム作成をしているのですが一箇所音を重ねる部分の表現がうまくできなくてドの音しか鳴りません。
addToneの部分もし分かる方いたら教えていただきたいです。

# -*- coding: utf-8 -*-

import numpy as np
from scipy.io.wavfile import write


class GenFreq(object):
    def __init__(self, Fs=44100., dur=1.):
        # 諸々の初期化
     self.Fcs = {'C':262., 'D':294., 'E':330., 'F':349., 'G':392., 'A':440., 'B':494.}
     self.Amp = 2000

     self.Fs = Fs
     self.dur = dur
     self.N = int( dur * Fs )
     self.x = np.zeros( self.N )

     delta = 1./Fs
     self.t = np.arange( self.N ) * delta

    def getSound(self):
        # 波形データ配列を返す
     return self.x

    def getLen(self):
        # データ配列長を返す
     return self.N

    def addTone(self, code='C'):
        # おとを重ねる
     f = self.Fcs[code]
     self.x = self.Amp * np.sin( 2. * np.pi * f * self.t )
     # ここがうまく書けない

# ド・ミ・ソの和音(CEG) を作ってみる

Fs = 44100
s = GenFreq(Fs, dur=1.)
s.addTone('C')
s.addTone('E')
s.addTone('G')
N = s.getLen()

# scipy.wav.iofile の write をインポート
write('soundtest.wav', Fs, s.getSound())
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

単純に重ね合わせて
self.x += self.Amp * np.sin( 2. * np.pi * f * self.t )
ではダメでしょうか?
イメージ説明

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

self.x += self.Amp * np.sin( 2. * np.pi * f * self.t )

 追記

それっぽく聞こえなかったからいじりました。

import numpy as np
from scipy.io.wavfile import write

class GenFreq(object):
    def __init__(self, Fs=44100., dur=1.):
        # 諸々の初期化
        self.Fcs = {'C':261.63, 'D':293.66, 'E':329.63, 'F':349.23, 'G':392.00, 'A':440.00, 'B':493.88}  # うなりが聞こえてたので精度を上げる
        self.Amp = 10

        self.Fs = Fs
        self.dur = dur
        self.N = int( dur * Fs )
        self.x = np.zeros( self.N )

        delta = 1./Fs
        self.t = np.arange( self.N ) * delta

    def getSound(self):
        # 波形データ配列を返す
        return self.x

    def getLen(self):
        # データ配列長を返す
        return self.N

    def addTone(self, code='C', Amp=None):  # 音圧レベル補正
        if Amp is None:  
            Amp = self.Amp
        # おとを重ねる
        f = self.Fcs[code]*2
        self.x += Amp * np.sin( 2. * np.pi * f * self.t )
        # ここがうまく書けない

# ド・ミ・ソの和音(CEG) を作ってみる

Fs = 44100
s = GenFreq(Fs, dur=1.)
s.addTone('C', 10)  # 根拠はよくわからないがこれくらいにしないと音の釣り合いが取れない感じだった
s.addTone('E', 25)
s.addTone('G', 71)
N = s.getLen()

# scipy.wav.iofile の write をインポート
write('soundtest.wav', Fs, s.getSound())

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    字下げについて

    お世話になります 本日マイナビ第26章を勉強しております http://news.mynavi.jp/series/python/026/ この中でどうしてもコマンドの字下げ

  • 解決済

    ファイルの中から特定の文字列の抽出

    ダンプデータの中から、”abcd"という文字を発見したら、”xyz”という文字を見つけるまで、そこの間の文字を抽出し、ファイルに出力したいのですが、どのようなソースコードを書けばよ

  • 解決済

    Pythonのthreadingにおける、終了時の処理

    前提・実現したいこと Pythonを使って、動画や画像を表示するGUIを作っています。その中で、みなさまのご支援を頂ながらカメラの画像を取り込んで再生できるところまで来ました。

  • 解決済

    Pythonのループ操作

    Python超初心者です。 以下のような計算を行いたいときにはどのようなコードを書けばいいでしょうか? ある原子の座標があったとして、それらのステップ毎の計算を一気に行いたいで

  • 解決済

    pygameを用いたMIDIの制御

    実現したい内容 pygameを用いてMIDIデバイスの入力を受け取り、リアルタイムでSin波で演奏 複数音の出力および、ベロシティの対応  発生してる問題 キーを押した時と離し

  • 解決済

    pyinstallerで制作したアプリケーションについて

    Pythonスクリプトをpyinstallerを使ってアプリケーション化した場合に、 実行した場所をカレントディレクトリとするような挙動にしたいのですがやり方がわかりません。

  • 解決済

    python 音 プログラムについて

    実行すると音階ドレミファソラシドを順に鳴らすようなプログラムを作成しているのですが下のコードのy部分がいろいろ試したのですがエラーを吐いてしまいうまく行きません。分かる方いたら回答

  • 解決済

    Python 近似線と決定係数の求め方

     前提・実現したいこと Python初心者です. とあるグラフを対数正規分布の累積分布関数で回帰したいのですが,やり方が分かりません.(近似線と決定係数が知りたいです) 大変恐縮で

同じタグがついた質問を見る

  • Python

    7929questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。