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

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

ただいまの
回答率

87.79%

processingのmp3の再生方法について

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,694

score 7

以前質問をさせていただいてprocessingでの鍵盤の作り方を教えていただきました。そこにmp3ファイルの再生をしようと考えています。再生だけはできたのですが、何かキーを押して再生や停止をすることは可能でしょうか?また、それと同時にレコードのようなものを画面に映し出し、mp3ファイルが再生されると回転し、停止すると回転が止まるようなプログラムは作れるのでしょうか。わかる方がいらっしゃいましたら教えていただきたいです。

import ddf.minim.spi.*;
import ddf.minim.signals.*;
import ddf.minim.*;
import ddf.minim.analysis.*;
import ddf.minim.ugens.*;
import ddf.minim.effects.*;

Minim minim;
AudioOutput out;
AudioPlayer player;
HashMap<String, Keyboard> pressedKeys = new HashMap<String, Keyboard>();

void setup() {
size(600, 400);
minim = new Minim(this);
player = minim.loadFile("y2mate.com - flamingo_OjdMFqnSybw_320kbps.mp3");
player.play();
out = minim.getLineOut();
}

void draw() {
}

void keyPressed() {
String pitchName = getPitchName();
if (pitchName == null) return;

Keyboard k = pressedKeys.get(pitchName);
if (k == null) {
k = new Keyboard(pitchName);
pressedKeys.put(pitchName, k);
}

k.noteOn();
}

void keyReleased() {
String pitchName = getPitchName();
if (pitchName == null) return;

pressedKeys.get(pitchName).noteOff();
}

String getPitchName() {
switch (key) {
case '1': return "G3";
case '2': return "A3";
case '3': return "A#3";
case '4': return "D4";
case '5': return "A#3";
case '6': return "C4";
case '7': return "A3";
case '8': return "A#3";
case '9': return "A3";
case '0': return "G3";
case 'q': return "G3";
case 'w': return "A3";
case 'e': return "A#3";
case 'r': return "F3";
case 't': return "D3";
case 'y': return "D4";
case 'u': return "A#3";
case 'i': return "C4";
case 'o': return "A3";
case 'p': return "A#3";
case '@': return "A3";
case '[': return "G3";

case 'a': return "C3";
case 's': return "D3";
case 'd': return "E3";
case 'f': return "F3";
case 'g': return "G3";
case 'h': return "A3";
case 'j': return "B3";
case 'k': return "C4";
case 'l': return "D4";
case ';': return "E4";
case ':': return "F4";
case ']': return "G4";

case 'z': return "C#3";
case 'x': return "D#3";
case 'v': return "F#3";
case 'b': return "G#3";
case 'n': return "A#3";
case ',': return "C#4";
case '.': return "D#4";

}

return null;
}

class Keyboard {
Oscil osc;
boolean pressed;

Keyboard(String pitchName) {
osc = new Oscil(Frequency.ofPitch(pitchName), 0.1, Waves.SAW);
}

void noteOn() {
if (pressed) return;

osc.patch(out);
pressed = true;
}

void noteOff() {
osc.unpatch(out);
pressed = false;
}
}

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

何かキーを押して再生や停止をすること

一時停止 player.pause();
再開 player.play(); or player.loop();
keyPressed()で好きなキーに割り当てればいいでしょう。

レコードのようなものを画面に映し出し

レコードっぽい画像を表示するのが手っ取り早いでしょう。
画像の表示・回転は参考ページがたくさんあります。
画像を回転するには | 自己啓発。人生について考える
の「画像中央を中心に360°回転させる例:」等がちょうどよさそうです。

mp3ファイルが再生されると回転し、停止すると回転が止まる

player.isPlaying()で今の再生状態が取れます。
draw内にあるであろう回転角度の変更部分を、再生中だけ増やすようにすればいいでしょう。


追記 参考コード
ENTERキーでトグル動作 本題でないところ全カット

import ddf.minim.*;

Minim minim;
AudioPlayer player;
PImage img;
float deg; // 回転角度
float delta = 33.3 * 360.0 / 60; // 1秒間に回る角度

void setup() {
  size(600, 400);
  minim = new Minim(this);
  player = minim.loadFile("おんがく.mp3");
  img = loadImage("れこーど.png");
}

void draw() {
  rotateImage((width - img.width) / 2, (height - img.height) / 2, img, deg);

  if (player.isPlaying()) {
    deg += delta / frameRate;
    if (deg > 360) deg -= 360;
  }
}

void keyPressed() {
  println("keyPressed");

  if (key == ENTER || key == RETURN) {
    if (player.isPlaying()) {
      player.pause();
    } else {
      player.loop();
    }
  }

  // 省略
}

//http://mslabo.sakura.ne.jp/WordPress/make/processing%E3%80%80%E9%80%86%E5%BC%95%E3%81%8D%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/%E7%94%BB%E5%83%8F%E3%82%92%E5%9B%9E%E8%BB%A2%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF/
void rotateImage(int x, int y, PImage img, float deg) {
  pushMatrix();
  translate(x + img.width / 2, y + img.height / 2);
  rotate(radians(deg));
  imageMode(CENTER);
  image(img, 0, 0);
  imageMode(CORNER);
  popMatrix();
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/01/08 21:27

    回答いただきありがとうございました。こちらの方法で試してみましたが、私が理解していないのもあり、うまくできませんでした。お手数ですが、具体的なプログラムを教えていただけないでしょうか?また、Enterキーを押して実行するプログラムは可能ですか?

    キャンセル

  • 2020/01/08 22:17

    import ddf.minim.spi.*;
    import ddf.minim.signals.*;
    import ddf.minim.*;
    import ddf.minim.analysis.*;
    import ddf.minim.ugens.*;
    import ddf.minim.effects.*;

    Minim minim;
    AudioOutput out;
    AudioPlayer player;
    PImage img;
    float deg;
    float delta = 33.3 * 360.0 / 60;
    HashMap<String, Keyboard> pressedKeys = new HashMap<String, Keyboard>();

    void setup() {
    size(600, 400);
    minim = new Minim(this);
    player = minim.loadFile("y2mate.com - flamingo_OjdMFqnSybw_320kbps.mp3");
    img = loadImage("record.png");
    out = minim.getLineOut();
    }

    void draw() {
    rotateImage((width - img.width) / 2, (height - img.height) / 2, img, deg);

    if (player.isPlaying()) {
    deg += delta / frameRate;
    if (deg > 360) deg -= 360;
    }
    }

    void keyPressed() {
    println("keyPressed");

    if (key == ENTER || key == RETURN) {
    if (player.isPlaying()) {
    player.pause();
    } else {
    player.loop();
    }
    }
    String pitchName = getPitchName();
    if (pitchName == null) return;

    Keyboard k = pressedKeys.get(pitchName);
    if (k == null) {
    k = new Keyboard(pitchName);
    pressedKeys.put(pitchName, k);
    }

    k.noteOn();
    }

    void keyReleased() {
    String pitchName = getPitchName();
    if (pitchName == null) return;

    pressedKeys.get(pitchName).noteOff();
    }

    String getPitchName() {
    switch (key) {
    case '1': return "G3";
    case '2': return "A3";
    case '3': return "A#3";
    case '4': return "D4";
    case '5': return "A#3";
    case '6': return "C4";
    case '7': return "A3";
    case '8': return "A#3";
    case '9': return "A3";
    case '0': return "G3";
    case 'q': return "G3";
    case 'w': return "A3";
    case 'e': return "A#3";
    case 'r': return "F3";
    case 't': return "D3";
    case 'y': return "D4";
    case 'u': return "A#3";
    case 'i': return "C4";
    case 'o': return "A3";
    case 'p': return "A#3";
    case '@': return "A3";
    case '[': return "G3";

    case 'a': return "C3";
    case 's': return "D3";
    case 'd': return "E3";
    case 'f': return "F3";
    case 'g': return "G3";
    case 'h': return "A3";
    case 'j': return "B3";
    case 'k': return "C4";
    case 'l': return "D4";
    case ';': return "E4";
    case ':': return "F4";
    case ']': return "G4";

    case 'z': return "C#3";
    case 'x': return "D#3";
    case 'v': return "F#3";
    case 'b': return "G#3";
    case 'n': return "A#3";
    case ',': return "C#4";
    case '.': return "D#4";

    }

    return null;
    }

    class Keyboard {
    Oscil osc;
    boolean pressed;

    Keyboard(String pitchName) {
    osc = new Oscil(Frequency.ofPitch(pitchName), 0.1, Waves.SAW);
    }

    void noteOn() {
    if (pressed) return;

    osc.patch(out);
    pressed = true;
    }

    void noteOff() {
    osc.unpatch(out);
    pressed = false;
    }
    }

    void rotateImage(int x, int y, PImage img, float deg) {
    pushMatrix();
    translate(x + img.width / 2, y + img.height / 2);
    rotate(radians(deg));
    imageMode(CENTER);
    image(img, 0, 0);
    imageMode(CORNER);
    popMatrix();
    }

    これで試してみましたが、
    rotateImage((width - img.width) / 2, (height - img.height) / 2, img, deg);
    のところでエラーが起き、応答なしになってしまいました。

    キャンセル

  • 2020/01/08 22:37

    こちらではこのコードをそのまま実行できましたけどなんでしょうね??

    何かエラー文は出ていますか?
    いくつか画像を変えて試していただけますか?

    キャンセル

0

mp3の再生はsoundライブラリ
キーを押したらxxはkeyPressedシステム変数keyPressed関数
画を回すにはtranslate()とrotate() (もう面倒だからリファレンスページから自分でたどってみましょう。)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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