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

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

新規登録して質問してみよう
ただいま回答率
85.47%
import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

2回答

1243閲覧

processingで音楽プレーヤーのスキップ機能を作成したいです。

bump_of_pool

総合スコア7

import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

0クリップ

投稿2021/12/04 18:47

編集2021/12/05 18:58

音楽プレーヤーのようなものを作成していました。
これに曲のスキップ機能をつけたいと思っております。マウスでクリックしたときに次の曲または前の曲を再生する方法が分からず困っています。どなたかご教授ください。
全体のプログラムは以下の通りです。

import ddf.minim.*; import ddf.minim.analysis.*; import ddf.minim.effects.*; import ddf.minim.signals.*; import ddf.minim.spi.*; import ddf.minim.ugens.*; int a = 50; int b = 440; int mode; PImage img; Minim minim; AudioPlayer player1; AudioPlayer player2; AudioPlayer player3; AudioPlayer player4; AudioPlayer player5; Teishi teishi; Saisei saisei; void setup(){ size(357, 600); PFont font = createFont("Meiryo",50); textFont(font); img = loadImage("586.jpg"); minim = new Minim(this); teishi = new Teishi(); saisei = new Saisei(); player1 = minim.loadFile("01 Tides.mp3"); player2 = minim.loadFile("02 Shivers.mp3"); player3 = minim.loadFile("03 First Times.mp3"); player4 = minim.loadFile("04 Bad Habits.mp3"); player5 = minim.loadFile("05 Overpass Graffiti.mp3"); saisei.display(); } void draw(){ } void mouseClicked(){ if (a-1 < mouseX && mouseX < a + 30 && b-1 < mouseY && mouseY < b + 30) { saisei.display(); if (player4.isPlaying()) { player4.pause(); } else { player4.loop(); teishi.display(); } } } class Saisei{ void display(){ background(255); image(img, width*1.17/7, height/12, width*2/3, height*2/5); strokeWeight(5); line(0, (height*3/5)-10, width, (height*3/5)-10); fill(0); textSize(30); text("曲名", 40, 400); textSize(15); text("artist", 40, 425); text("1/1",width/2-10, height/2+30); fill(255); rect(b,a,b,a); fill(0); triangle(a,b,a,b+30,a+30,b+15); triangle(200,425,215,415,215,435); triangle(218,425,233,415,233,435); triangle(300,425,285,415,285,435); triangle(318,425,303,415,303,435); } } class Teishi{ void display(){ background(255); image(img, width*1.17/7, height/12, width*2/3, height*2/5); strokeWeight(5); line(0, (height*3/5)-10, width, (height*3/5)-10); fill(0); textSize(30); text("曲名", 40, 400); textSize(15); text("artist", 40, 425); text("1/1",width/2-10, height/2+30); fill(255); rect(b,a,b,a); fill(0); line(a,b,a,b+30); line(a+15,b,a+15,b+30); triangle(200,425,215,415,215,435); triangle(218,425,233,415,233,435); triangle(300,425,285,415,285,435); triangle(318,425,303,415,303,435); } }

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2021/12/04 21:40

まだ内容まで見ていませんが、 「できなくなりました」 というのは、全く同じプログラムなのに以前はできた、今はできない、という意味ですか?
bump_of_pool

2021/12/05 18:56

回答していただきありがとうございます。全く同じプログラムなのに以前はできた、今はできない、という意味であっております。ですが、全く同じプログラムで新規作成したらエラーがなくなったので自己解決してしまいました。
bump_of_pool

2021/12/05 18:59

なので、質問内容を変更させていただきました。勝手ながら申し訳ございません。
thkana

2021/12/05 21:59

> 質問内容を変更 まぁ、回答がついてないからギリいいのかな。もしかしたら、あの人とかあの人が回答を一所懸命考えてたかもしれないけれど。自己解決の回答をつけてクローズ、別の質問を新たに作成、というのがよかった気がします。 あ、一応この欄は「質問への追記・修正の依頼」ということで回答ではない、解決に直接寄与するのでない、情報の提供やなんかを質問者にお願いする欄、ということのようです。質問/回答掲示板でしばしば見かける、情報が足りなくて解にたどり着けないような質問に「回答欄」で情報の提供を求めると「答えがわからないなら黙ってろ」と暴言を吐かれるような事態への対応ということでしょうかね。
guest

回答2

0

Processing

1 player1 = minim.loadFile("01 Tides.mp3"); 2 player2 = minim.loadFile("02 Shivers.mp3"); 3 player3 = minim.loadFile("03 First Times.mp3"); 4 player4 = minim.loadFile("04 Bad Habits.mp3"); 5 player5 = minim.loadFile("05 Overpass Graffiti.mp3");

この辺を「配列」にするとプログラム中で前後の概念を表すのが容易になると思います。

Processing Ver.2までで使われていたminimでも全然問題ないですけど、ProcessingのVer.3ではSoundFileとかいうのができたのでそっちを使うのが「標準」かも知れません。

投稿2021/12/05 22:06

thkana

総合スコア7652

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

おそらくボタンが並ぶことになるでしょうから、ControlP5とかを使ったほうが楽じゃないですかね?
AudioPlayerを複数持つとだいぶメモリの無駄に感じますので、都度loadFileしたほうがよさそうです。

無駄にこだわってしまって長くなったのでボタンだけ^^;
ボリューム・シークバーは、Sliderが使えます。

Processing

1import controlP5.*; 2import ddf.minim.*; 3 4Minim minim; 5AudioPlayer player; 6 7ArrayList<String> files = new ArrayList<String>(); 8int current; 9int length; 10 11PImage img; 12 13ControlP5 cp5; 14Button playPause; 15boolean isPlaying; 16 17void setup() { 18 size(400, 400); 19 20 minim = new Minim(this); 21 cp5 = new ControlP5(this); 22 23 cp5.addButton("prevTrack") 24 //.setImages(loadImage("normal.png"), loadImage("hover.png"), loadImage("pressed.png")) 25 .setImages(getPrevTrackImage()) 26 .setPosition(125, 330) 27 .setSize(40, 40); 28 29 playPause = cp5.addButton("playPause") 30 .setImages(getPlayImage()) 31 .setPosition(175, 325) 32 .setSize(50, 50); 33 34 cp5.addButton("nextTrack") 35 .setImages(getNextTrackImage()) 36 .setPosition(235, 330) 37 .setSize(40, 40); 38 39 selectFolder("フォルダを選択", "folderSelected"); 40} 41 42void draw() { 43 background(255); 44 45 if (img != null) image(img, 0, 0, width, height); 46 47 fill(0, 128); 48 noStroke(); 49 rect(0, 300, width, 100); 50 51 if (player == null) return; 52 53 if (!isPlaying && player.isPlaying()) { 54 isPlaying = true; 55 playPause.setImages(getPauseImage()); 56 } else if (isPlaying && !player.isPlaying()) { 57 isPlaying = false; 58 playPause.setImages(getPlayImage()); 59 //println(length, player.position()); // 1秒以上食い違うorz 60 } 61 62 // 雑終了判定w 63 if (!isPlaying && length != 0 && length - 1500 <= player.position()) { 64 nextTrack(); 65 } 66} 67 68void prevTrack() { 69 move(-1); 70} 71 72void playPause() { 73 if (player == null) return; 74 75 if (isPlaying) player.pause(); 76 else player.play(); 77} 78 79void nextTrack() { 80 move(1); 81} 82 83void move(int i) { 84 if (files.size() == 0) return; 85 86 if (player != null) player.close(); 87 88 current += i; 89 if (files.size() <= current) current = 0; 90 if (current < 0) current = files.size() - 1; 91 92 player = minim.loadFile(files.get(current)); 93 player.play(0); 94 length = player.length(); 95} 96 97void folderSelected(File selection) { 98 if (selection == null) return; 99 100 if (player != null) player.close(); 101 files.clear(); 102 img = null; 103 104 for (File file : selection.listFiles()) { 105 if (!file.isFile()) continue; 106 107 String name = file.getName().toLowerCase(); 108 if (name.endsWith(".mp3") || name.endsWith(".wav")) { 109 files.add(file.getAbsolutePath()); 110 } 111 112 if (file.getName().equals("Folder.jpg")) { 113 img = loadImage(file.getAbsolutePath()); // アルバムアート 114 } 115 } 116 117 current = -1; 118 nextTrack(); 119} 120 121// 以下ボタン画像生成 まったく重要でないw 122PGraphics[] getPrevTrackImage() { 123 return new PGraphics[] { pn(color(0, 1), true), pn(color(0, 32), true), pn(color(0, 64), true), }; 124} 125PGraphics[] getPlayImage() { 126 return new PGraphics[] { py(color(0, 1)), py(color(0, 64)), py(color(0, 1)), }; 127} 128PGraphics[] getPauseImage() { 129 return new PGraphics[] { pe(color(0, 1)), pe(color(0, 64)), pe(color(0, 1)), }; 130} 131PGraphics[] getNextTrackImage() { 132 return new PGraphics[] { pn(color(0, 1), false), pn(color(0, 32), false), pn(color(0, 64), false), }; 133} 134 135PGraphics py(color c) { 136 PGraphics pg = createGraphics(50, 50); 137 pg.beginDraw(); 138 139 pg.fill(c); 140 pg.stroke(200); 141 pg.circle(25, 25, 49); 142 143 pg.noFill(); 144 pg.stroke(255); 145 pg.strokeWeight(2); 146 pg.triangle(17, 15, 17, 35, 32, 25); 147 148 pg.endDraw(); 149 150 return pg; 151} 152 153PGraphics pe(color c) { 154 PGraphics pg = createGraphics(50, 50); 155 pg.beginDraw(); 156 157 pg.fill(c); 158 pg.stroke(200); 159 pg.circle(25, 25, 49); 160 161 pg.noFill(); 162 pg.stroke(255); 163 pg.strokeWeight(2); 164 pg.line(21, 15, 21, 35); 165 pg.line(29, 15, 29, 35); 166 167 pg.endDraw(); 168 169 return pg; 170} 171 172PGraphics pn(color c, boolean flip) { 173 PGraphics pg = createGraphics(40, 40); 174 pg.beginDraw(); 175 176 if (flip) { 177 pg.translate(40, 0); 178 pg.scale(-1, 1); 179 } 180 181 pg.noStroke(); 182 pg.fill(c); 183 pg.circle(20, 20, 39); 184 185 pg.noFill(); 186 pg.stroke(255); 187 pg.strokeWeight(2); 188 pg.triangle(12, 12, 12, 28, 24, 20); 189 pg.line(28, 12, 28, 28); 190 191 pg.endDraw(); 192 193 return pg; 194}

参考資料
processing GUI, controlP5
selectFolder() / Reference / Processing.org
File (Java Platform SE 8 )
[Folder.jpg AlbumArtSmall.jpg - Google 検索


player.length()が取れない時があるらしい(となると再生終了検知が。。。

setVolumeが効かない問題も悩ましい(setGainは扱いづらい)が、Soundはmp3開くのが激重すぎて使えなかった。

アートワークはFolder.jpgを使用(Windows限定だが^^;

あとファイルはwav・mp3・aiffで、 wmaが未対応なのが悲しいですね。。。

投稿2021/12/05 21:45

編集2021/12/05 22:22
TN8001

総合スコア9363

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問