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

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

ただいまの
回答率

90.36%

  • Python

    9113questions

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

python 和音を作るプログラム

解決済

回答 2

投稿

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

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())

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • Python

    9113questions

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