MCIで音楽再生

どうも
かなり久々に日記書きました。
内定を頂いてから駄目人間になりかけたので、本来の自分を取り戻そうと思います。

MCIでコンソールによる音楽再生プログラム

mciSoundPlay.h

#include<windows.h>
#include<string.h>
#include<digitalv.h> //速度変更に使用するヘッダ

class MciSoundPlay
{
	public :
		MCI_OPEN_PARMS mop;
		MCI_PLAY_PARMS mpp;
		MCI_GENERIC_PARMS mgp;
		MCI_DGV_SET_PARMS mdsp;
		MciSoundPlay(LPCSTR titlePath);
		void soundPlayBack();
		void soundStop();
		void soundRewind();
		void soundInterrupt();
		void soundPlayInterrupt();
		void SoundSpeedChange();
		void SoundEnd();
};

mciSoundPlay.cpp

#include"MciSoundPlay.h"
#include<windows.h>
#include<iostream>
#include<digitalv.h> //速度変更に使用するヘッダ

// winmm.lib をリンクする
#pragma comment(lib,"winmm.lib")

MciSoundPlay::MciSoundPlay(LPCSTR titlePath)
{
	int err;
	TCHAR strErr[512];

	//mop.lpstrDeviceType = "WaveAudio";
	mop.lpstrDeviceType = "MPEGVideo";
	//mop.lpstrElementName= "曲ファイルのパス";
	mop.lpstrElementName= titlePath;
	err = mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,(DWORD)&mop); //成功するとwDeviceIDに値が代入される

	if(err)
	{
		mciGetErrorString(err,strErr,512);
		std::cout << "ErrCode -> " << strErr << std::endl;
		exit(0);
	}

	//構造体の中身確認
	std::cout << "mop.lpstrDeviceType  = " << mop.lpstrDeviceType	<< std::endl;
	std::cout << "mop.lpstrElementName = " << mop.lpstrElementName	<< std::endl;
	std::cout << "mop.wDeviceID        = " << mop.wDeviceID			<< std::endl;
}

void MciSoundPlay::soundPlayBack()
{
	//mciSendCommand(mop.wDeviceID,MCI_PLAY,0,0); //Wave用
	mciSendCommand(mop.wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0);	//先頭位置に設定
	mciSendCommand(mop.wDeviceID, MCI_PLAY, 0, (DWORD)&mpp);		//再生
	std::cout << "--- 再生 ---" << std::endl;
}

void MciSoundPlay::soundStop()
{
	mciSendCommand(mop.wDeviceID, MCI_STOP, 0, 0);					//停止
	mciSendCommand(mop.wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0);	//先頭位置に設定
	std::cout << "--- 停止 ---" << std::endl;
}

void MciSoundPlay::soundRewind()
{	
	mciSendCommand(mop.wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0);	//先頭位置に設定
	mciSendCommand(mop.wDeviceID, MCI_PLAY, 0, (DWORD)&mpp);		//再生
	std::cout << "--- 巻き戻し ---" << std::endl;
}

void MciSoundPlay::soundInterrupt()
{
	mciSendCommand(mop.wDeviceID, MCI_PAUSE, 0, 0);					//一時停止
	std::cout << "--- 一時停止 ---" << std::endl;
}

void MciSoundPlay::soundPlayInterrupt()
{
	mciSendCommand(mop.wDeviceID, MCI_RESUME, 0, 0);				//一時停止解除
	std::cout << "--- 再生 ---" << std::endl;
}

void MciSoundPlay::SoundSpeedChange()
{	
	double spd_val;

	std::cout << "再生速度を変更します。"				<< std::endl;
	std::cout << "0.5 〜 2.0 の範囲で指定してください"   << std::endl;
	std::cout << "※標準速度は1.0です"					<< std::endl;
	std::cout << "再生速度 = ";
	std::cin >> spd_val;

	mdsp.dwSpeed = (int)(spd_val * 1000);	//速度設定
	std::cout << "--- 速度 = " << mdsp.dwSpeed << "---" << std::endl;
	mciSendCommand(mop.wDeviceID, MCI_SET, MCI_DGV_SET_SPEED, (DWORD)&mdsp);	//速度変更
	std::cout << "--- 速度変更 ---" << std::endl;
}

void MciSoundPlay::SoundEnd()
{
	std::cout << "アプリケーションを終了します" << std::endl;
	mciSendCommand(mop.wDeviceID ,MCI_CLOSE ,0 ,(DWORD_PTR)&mgp);	
}

mciCommandPlay.cpp

#include"MciSoundPlay.h"
#include<iostream>

int main()
{
	int data;

	LPCSTR titlePath = "曲ファイルのパス";
	MciSoundPlay msp(titlePath);

	while(1)
	{
		std::cout << "数字を入力してください"    << std::endl;
		std::cout << "************************"    << std::endl;
		std::cout << "1:再生"					<< std::endl;
		std::cout << "2:停止"					<< std::endl;
		std::cout << "3:巻き戻し"				<< std::endl;
		std::cout << "4:一時停止"				<< std::endl;
		std::cout << "5:一時停止解除"			<< std::endl;
		std::cout << "6:速度変更"				<< std::endl;
		std::cout << "9:終了"					<< std::endl;
		std::cout << "************************" << std::endl;
		std::cout << "数字 = ";
		std::cin >> data; 

		if(data == 9)
		{
			msp.SoundEnd();
			break;
		}

		switch(data)
		{
			case 1:    //再生
				msp.soundPlayBack();
				break;
			case 2:    //停止
				msp.soundStop();
				break;
			case 3:    //巻き戻し
				msp.soundRewind();
				break;
			case 4:    //一時停止
				msp.soundInterrupt();
				break;
			case 5:    //一時停止解除
				msp.soundPlayInterrupt();
				break;
			case 6:    //速度変更
				msp.SoundSpeedChange();
				break;	
        }//swicth

 }//while
	
}

現在学校でwiiリモコンを使った音楽アプリケーションを作成しており、自分は音楽再生担当なのでこのプログラムを作成した。
mp3を再生するのに何を使えばいいかわからなかった。調べていくと「MCI」で音楽を再生できることがわかった。

MCIコマンドによる再生とよく使う操作

http://www13.plala.or.jp/kymats/study/MULTIMEDIA/mciCommand_play.html

MCIに関してのWebページが少なく、困ることが多かった。
音楽再生をするときはMCIを使用しないのかな?
このブログを見て「私はこれで音楽再生したよ!」という人がいたらぜひ教えて頂きたい。

キャリアパス

みなさんは自分のキャリアパスについて考えたことがありますか?
私自身、キャリアパスを考えようと思ったことは何度もありますが、
あえて考えることを避けてきました。
理由としては、キャリアパスを考えたからといってその通りに進むわけがなく、
自分にもわかりませんが、キャリアパスに対する恐怖心があったのです。
おそらく、その恐怖心は「将来への不安」なのではないかと思われます。
自分の考えたキャリアパス通りに進めるのか?自分の考えたキャリアパス
本当に正しいのか?など、色々な恐怖が存在するわけです。
私はキャリアパスについて考えていることをTwitterでつぶやいたら結構反響が良く、
キャリアパスについて考えている人はそこまでいないことがわかりました(多分学生時代)。
しかし、多々いるTwitterの技術者達にはある1つ共通点がありました。それは・・・

続きを読む

TwitterClient2

久々のブログ更新です。
色々あって更新できませんでした。
さぁプログラムだ。

regeek TwitterClientのパワーアップ

今回追加した機能は、JTableによるアイコン表示です。
Twitterクライアントにはかかせない画像表示の機能をなんとかつけたかったので頑張りました。

TimeLine.java

import twitter4j.*;
import javax.swing.*;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Date;

public class TimeLine implements ActionListener {
	
	Twitter twitter;
	JPanel timeLinePanel;
	JPanel updatePanel;
	JTextField updateField;
	JButton updateButton;
	
	JLabel iconLabel;
	ImageIcon icon;
	JTable table;
	
	public TimeLine(Twitter twitter) throws TwitterException{
		
   this.twitter = twitter;
   timeLinePanel = new JPanel();
   updateField = new JTextField();

   updatePanel = new JPanel(new FlowLayout());
   updatePanel.setSize(600, 30);
   updatePanel.setPreferredSize(new Dimension(600, 30));
   updatePanel.setMaximumSize(new Dimension(600, 30));

   updateButton = new JButton("Update");
   updateButton.setSize(90, 20);
   updateButton.setPreferredSize(new Dimension(90, 20));
   updateButton.setMaximumSize(new Dimension(90, 20));
   updateButton.addActionListener(this);
   
   updateField = new JTextField();
   updateField.setSize(400, 20);
   updateField.setPreferredSize(new Dimension(400, 20));
   updateField.setMaximumSize(new Dimension(400, 20));

   updatePanel.add(updateField);
   updatePanel.add(updateButton);
   timeLinePanel.add(updatePanel);
   updateTimePanel();
	    
	}
	
	private void updateTimePanel() throws TwitterException {
   java.util.List<Status> statusList = twitter.getFriendsTimeline();

   Object statusArr[][] = new Object [statusList.size()][2];
   timeLinePanel.setLayout(new BoxLayout(timeLinePanel, BoxLayout.Y_AXIS));

   for (int i = 0; i < statusList.size(); i++) {
	    	statusArr[i][0] = new ImageIcon(statusList.get(i).getUser().getProfileImageURL());
	    	Date tweetDate = statusList.get(i).getCreatedAt();
	    	SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yy HH:mm");
	    	statusArr[i][1] =  statusList.get(i).getUser().getName() + statusList.get(i).getText() + "-" + formatter.format(tweetDate);
	    }

	    Object columnName[] = {"icon","text"};
	    
	    DefaultTableModel statusTable = new MyTableModel(statusArr,columnName);
	    JTable table = new JTable(statusTable);
	    
	    //列幅の指定
	    DefaultTableColumnModel columnMode = (DefaultTableColumnModel)table.getColumnModel();
	 TableColumn column1 = null;
	 TableColumn column2 = null;
    column1 = columnMode.getColumn(0);
	    column1.setPreferredWidth(150);
	    column2 = columnMode.getColumn(1);
	    column2.setPreferredWidth(850);
	    table.setAutoResizeMode(table.AUTO_RESIZE_OFF);
	    //高さの指定
	    table.setRowHeight(50);
	    
	    JScrollPane scrollPane = new JScrollPane(table);
	    scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
	    
	    timeLinePanel.add(scrollPane);
	  }
	  
	
	  class MyTableModel extends DefaultTableModel{
		  MyTableModel(Object[][] data,Object[] columName){
		    super(data,columName);
		  }

		  public Class getColumnClass(int col){
		    return getValueAt(0, col).getClass();
		  }
		}
	
	  public JPanel getTimeLinePanel() {
		    return timeLinePanel;
	  }
	  
	@Override
	public void actionPerformed(ActionEvent e) {
		try {
		      twitter.updateStatus(updateField.getText());
		      updateTimePanel();
		      timeLinePanel.remove(1);
		      timeLinePanel.updateUI();
		      updateField.setText("");
		    } catch (TwitterException exception) {
		      JOptionPane.showMessageDialog(null, "An error has occurred while updating.");
		    exception.printStackTrace();
		    }
	}
}


今回よくわからなかったのは以下のコード

class MyTableModel extends DefaultTableModel{
 MyTableModel(Object[][] data,Object[] columName){
  super(data,columName);
 }
    
 public Class getColumnClass(int col){
  return getValueAt(0, col).getClass();
 }
}	

このコードがないと画像を表示することができないらしい。
MyTableModelクラスについてはまだ理解出来るが、
getColumnClassクラスがわからない。
MyTableModelクラスの中でgetColumnClassクラスを宣言しているから内部クラスなのだろうか?
getColumnClassクラスの引数、int col にどこで値を渡しているかなどがよく分からない。
まだまだ勉強不足です。

画像

次の課題

Jtableのテキストを折り返すようにする。
折り返さないとみんなのつぶやきが見れないよ><

javaマスターの方がこのブログを見ていたら助けてください!
よろしくお願いします。

サンプルコードに助けられながらもちょっとしたアプリを作成した。

サンプルコードを初めて読んだときは全く意味分からなかったけど
時間が経つにつれてだんだん理解できてきた。

Twiter4jのダウンロード

Twitter4j は Twitter APIJava ラッパだそうです。
javaTwitter関係のアプリ作ろうとしたらこれが良いらしいので、今回はTwitter4j を使用した。
http://twitter4j.org/ja/index.html

続きを読む

javaでTwitterクライアントを作成

ちょっとした事情がありまして、何かのアプリケーションを作成することになりました。
ここ数日何を作ろうか悩んだ結果・・・

javaTwitterクライアントを作ることにしました。

とりあえず宣言します。