音楽について

タグの編集
投稿者 kane  (中学生) 投稿日時 2010/7/16 04:17:16
今、音楽編集ソフトを作成しています。
どうにか音楽の再生や一時停止や停止は出来るようになりました。
あとしたいのは音楽の再生時間が分かるのと音楽が流れたら徐々にスクロールバーが進むようにしたいです。

それと質問ばかりで申し訳ないのですが・・・
音楽の音量を変更するプログラムも作ってみたいです。

投稿者 YAS  (社会人) 投稿日時 2010/7/16 05:37:46
2点確認させてください。

どのような方法で再生していますか?
方法によって現在位置の取得の仕方はちがいます。

音量の変更は再生時の音量でしょうか。
それとも音量を変えたファイルを作成するのでしょうか。
投稿者 kane  (中学生) 投稿日時 2010/7/16 07:01:01
再生方法がよく分からないのでプログラムを載せます。

こんな感じです↓
'再生・再開


        Call mciSendString(String.Format("open ""{0}"" alias MySound", FileName), "", 0, 0)
        Call mciSendString("play MySound", "", 0, 0)

        Call mciSendString("play """ & FileName & """", "", 0, 0)


        Label1.Text = FileName & "を再生中"
        Button2.Text = "再生"

        Call mciSendString("play """ & FileName & """", "", 0, 0)


        Label1.Text = FileName & "を再生中"

音量を変えたファイルを作成するです。

投稿者 (削除されました)  () 投稿日時 2010/7/17 10:16:16
(削除されました)
投稿者 YAS  (社会人) 投稿日時 2010/7/17 10:18:28
※一つ上の削除は私です。コードに間違いがありました。ごめんなさい。

高レベルMCIを使っているのですね。
再生位置の表示は次のようになると思います。
ついでにTrackBarを移動すると再生位置も移動するようにしています。
再生時間の取得はTrackBarのMaximumを指定するところを参考にしてください。
音量を変更したファイルの作成は高レベルMCIを使用した方法は思いつきません。
Waveファイルをバイナリで読み込んで直接変更するか,DirectShowを使うことになると思います。

Option Explicit On
Option Strict On

Imports System.Text
Imports System.Runtime.InteropServices

Public Class Form1

    <DllImport("winmm.dll", CharSet:=CharSet.Auto)> _
    Private Shared Function mciSendString( _
        ByVal command As String, _
        ByVal buffer As StringBuilder, _
        ByVal bufferSize As Integer, _
        ByVal hwndCallback As IntPtr) As Integer
    End Function

    Dim WithEvents Button1 As New Button
    Dim WithEvents TrackBar1 As New TrackBar
    Dim WithEvents Timer1 As New Timer

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Button1.Text = "再生"
        Me.TrackBar1.Location = New Point(0, 30)
        Me.TrackBar1.Width = Me.ClientSize.Width
        Me.Controls.AddRange({Me.Button1, Me.TrackBar1})
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim FileName As String = Application.StartupPath & "\Test.wav"
        Dim Command As String
        Command = String.Format("open ""{0}"" alias MySound", FileName)
        mciSendString(Command, Nothing, 0, IntPtr.Zero)
        Command = String.Format("status {0} {1}", "MySound", "length")
        Dim Res As New StringBuilder(256)
        mciSendString(Command, Res, Res.Capacity, IntPtr.Zero)
        TrackBar1.Maximum = Integer.Parse(Res.ToString)
        Command = "play MySound"
        mciSendString(Command, Nothing, 0, IntPtr.Zero)
        Me.Timer1.Interval = 500
        Me.Timer1.Start()
    End Sub

    Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Dim Command As String = String.Format("status {0} {1}", "MySound", "position")
        Dim Res As New StringBuilder(256)
        mciSendString(Command, Res, Res.Capacity, IntPtr.Zero)
        Me.TrackBar1.Value = Integer.Parse(Res.ToString)
    End Sub

    Private Sub TrackBar1_Scroll(ByVal sender As Object, ByVal e As System.EventArgs) Handles TrackBar1.Scroll
        Dim TrackBar As TrackBar = DirectCast(sender, TrackBar)
        Dim Command As String = String.Format("seek {0} to {1}", "MySound", TrackBar.Value)
        mciSendString(Command, Nothing, 0, IntPtr.Zero)
        Command = "play MySound"
        mciSendString(Command, Nothing, 0, IntPtr.Zero)
    End Sub
End Class
投稿者 kane  (中学生) 投稿日時 2010/7/18 22:26:35
すいませんできません(泣

この部分にエラーみたいなのが出ます
Dim WithEvents Button1 As New Button
    Dim WithEvents TrackBar1 As New TrackBar
    Dim WithEvents Timer1 As New Timer


全部コード貼りますのでコードを作ってもらえませんか?

Public Class Form1


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


    End Sub
    Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
    Declare Function sndPlaySound _
    Lib "winmm.dll" Alias "sndPlaySoundA" _
    (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long
    Public Const SND_SYNC = &H0
    Public Const SND_ASYNC = &H1
    Public Const SND_NODEFAULT = &H2
    Public Const SND_MEMORY = &H4
    Public Const SND_LOOP = &H8
    Public Const SND_NOSTOP = &H10
    Dim FilePath = FileName
    Dim FolderName As String
    Private aliasName = gg
    Dim FileName As String
    Private strFolder As String = " "
    Private strFileName As String = ""
    Dim gg As String
    Dim ff As String
    Dim aa As String
    Dim fm As String
    Dim cmd As String



    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        '再生・再開


        Call mciSendString(String.Format("open ""{0}"" alias MySound", FileName), "", 0, 0)
        Call mciSendString("play MySound", "", 0, 0)

        Call mciSendString("play """ & FileName & """", "", 0, 0)


        Label1.Text = FileName & "を再生中"
        Button2.Text = "再生"

        Call mciSendString("play """ & FileName & """", "", 0, 0)


        Label1.Text = FileName & "を再生中"

    End Sub

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        '停止    
        Call mciSendString("Close """ & FileName & """", "", 0, 0)
        Me.Label1.Text = FileName & "を停止しました"
        Call mciSendString("stop MySound", "", 0, 0)
        Call mciSendString("close MySound", "", 0, 0)

    End Sub



    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'ファイルを開く


        If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.Cancel Then Exit Sub


        FileName = OpenFileDialog1.FileName

        'フォルダ名とファイル名に分けるには 
        gg = System.IO.Path.GetDirectoryName(FileName) 'ここと
        ff = System.IO.Path.GetFileName(FileName) 'ここの() 

        Select Case IO.Path.GetExtension(FilePath)
            Case ".mp3", ".wmv", ".mp4"

            Case Else
                MessageBox.Show(FileName & "が開かれました")
        End Select


    End Sub


    Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
        '閉じるイベント       
        Call mciSendString("Close """ & FileName & """", "", 0, 0)
        Me.Close()

    End Sub

End Class

お願いします。。

投稿者 YAS  (社会人) 投稿日時 2010/7/18 23:03:27
>すいませんできません(泣

いやできるはずです。
VB2010でプロジェクトを新規に作成し,まるごとコピー貼り付けします。
「Application.StartupPath & "\Test.wav"」の部分を再生したいファイル名に変えます。
これで実行できるはずです。

>この部分にエラーみたいなのが出ます

エラー「みたいなの」ってどんなものが出るのですか?

>全部コード貼りますのでコードを作ってもらえませんか?

ですから,コード全部作ったのですが...
ファイルを開くところだけ,自分で付け足してみてください。

申し訳ありませんが,kaneさんのコードは突っ込みどころが多すぎて指摘しきれません。
VB6のコードのサンプルコードをそのまま使おうとしているのではありませんか?

コードを全部作ってさしあげるのは,さしたる苦労はないのですが,それを改造していくためには
一行一行のコードを理解する必要があります。私が返信したコードを理解せずにコピー貼り付け
しようとしても問題の解決にはなりません。理解できないところがあれば解説いたしますので,
「ここの意味がわからない」とピンポイントで質問していただけるとありがたいです。

推測ですが,すでにButton1をデザインビューで貼り付けた状態で私のコードを貼り付けたのでは
ありませんか? コードでButton1を作成していますので,「Button1」という名前がダブってしまい
ます。すでにあるButton1か私のコードのButton1の名前を変える必要があると思います。
投稿者 kane  (中学生) 投稿日時 2010/7/18 23:30:30
ここに式が必要ですって出ます(泣

Me.Controls.AddRange({Me.Button1, Me.TrackBar1})
              
投稿者 YAS  (社会人) 投稿日時 2010/7/18 23:48:11
>ここに式が必要ですって出ます(泣
>Me.Controls.AddRange({Me.Button1, Me.TrackBar1})

新しいプロジェクトに私のコードすべてを貼り付けていますか?

Me.Controls.AddRange({Me.Button1, Me.TrackBar1})

これはフォームに新しく作成したボタンとトラックバーを追加しているコードです。
「式が必要です」のエラーがでるとは考えにくいです。

エラーが出ているコードをすべて見せてください。
投稿者 るきお  (社会人) 投稿日時 2010/7/19 00:13:59
こんにちは。

多分、kaneさんが使っているVBがVB2005かVB2008なのではないですか?
YASさんのコードは最新版のVB2010で動きます。
VB2010もExpresss Editionは無償なのでぜひダウンロードして使ってみてください。

VB2005やVB2008でも動くようにするには

Me.Controls.AddRange({Me.Button1, Me.TrackBar1})

の個所を
    
Me.Controls.AddRange(New Control() {Me.Button1, Me.TrackBar1})

にします。

試してみましたが快適に動作しますよ。つまみをマウスで移動させると再生位置もちゃんとジャンプしてくれてごきげんです。
投稿者 YAS  (社会人) 投稿日時 2010/7/19 00:25:24
>多分、kaneさんが使っているVBがVB2005かVB2008なのではないですか?

あら~。やってしまいました。
るきおさんのおっしゃる通りです。
kaneさん,ごめんなさい。
投稿者 kane  (中学生) 投稿日時 2010/7/19 14:58:23
すいません音楽ファイルを開くことが出来なくなりました

どうやったら開けるのでしょうか?
よかったら教えてください。

投稿者 るきお  (社会人) 投稿日時 2010/7/19 21:02:25
こんにちは。
YASさんのプログラムがうまく動いたかをまず教えてください。

この掲示板をはじめWeb上の多くの掲示板は、「お互いに」情報を提供する場です。
YASさんがプログラム情報を提供したのに対し、
kaneさんは、「動いた」「動かない」という情報を提供してください。
動かない場合は具体的なエラーなどを教えてください。(そういう意味でこの前のkaneさんの「動かない」という情報は有益でした!)

こういったことが重要な理由の1つはインターネットから検索でたどりついた人に役に立つ情報を書き残しておくためです。kaneさん個人のサポートをする場ではなく、今書きこんでいる人たちや将来検索でたどりつくいろいろな人たちに役に立つ情報を残すのが趣旨です。

前置き長くなりましたが、
音楽ファイルを開くプログラムはYASさんのプログラムを使用されていますか?
音楽ファイルの形式はなんでしょうか?
また、以前は開けていた同じファイルが同じプログラムで開けなくなってしまったということでしょうか?
それとも、違うファイルですか?またプログラムはまったく同じものでしょうか?
投稿者 YAS  (社会人) 投稿日時 2010/7/19 21:52:38
るきおさん,フォローありがとうございます。
おそらくkaneさんは,「やりたいことはわかっているが,どうやるかは全然わからない」状態なのだと
思います。そのため,いろいろなWebページからコピー・貼り付けでコードを書こうとしているので
しょう。(VB6らしきコードが混じっていることや,明らかに不要な変数などが見られることからの推測
ですが...)
わたしも子どものころ,BASICマガジンのコードを意味もよくわからず入力していましたが,そんな段階
なのだと思います。

>すいません音楽ファイルを開くことが出来なくなりました

と,いうことは「再生はできた」ということだと思います。わたしがkaneさんのコードから勝手にファイルを
開くダイアログからファイル名を取得する部分を削除したのものですから困っているのでしょう。
コードの意味を理解していれば追加するのは容易だと思いますが,それが難しいのでしょう。
ですから,コピー・貼り付けで動作する例を提示することにします。
投稿者 YAS  (社会人) 投稿日時 2010/7/19 21:55:56
ファイルを開くダイアログを追加したサンプルは次のようになると思います。
Option Explicit On
Option Strict On

Imports System.Text
Imports System.Runtime.InteropServices
Imports System.IO

Public Class Form1

    <DllImport("winmm.dll", CharSet:=CharSet.Auto)> _
    Private Shared Function mciSendString( _
        ByVal command As String, _
        ByVal buffer As StringBuilder, _
        ByVal bufferSize As Integer, _
        ByVal hwndCallback As IntPtr) As Integer
    End Function

    Dim WithEvents Button1 As New Button
    Dim WithEvents Button2 As New Button
    Dim WithEvents Button3 As New Button
    Dim WithEvents TrackBar1 As New TrackBar
    Dim WithEvents Timer1 As New Timer
    Dim WithEvents OpenFileDialog1 As New OpenFileDialog
    Dim FileName As String

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Button1.Text = "再生"
        Me.Button2.Text = "停止"
        Me.Button3.Text = "開く"
        Me.Button2.Location = New Point(80, 0)
        Me.Button3.Location = New Point(160, 0)
        Me.TrackBar1.Location = New Point(0, 30)
        Me.TrackBar1.Width = Me.ClientSize.Width
        Me.Controls.AddRange(New Control() {Me.Button1, Me.Button2, Me.Button3, Me.TrackBar1})
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If File.Exists(FileName) Then
            Me.Text = Path.GetFileName(FileName) & "を再生中..."
            Dim Command As String
            Command = String.Format("open ""{0}"" alias {1}", FileName, "MySound")
            mciSendString(Command, Nothing, 0, IntPtr.Zero)
            Command = String.Format("status {0} {1}", "MySound", "length")
            Dim Res As New StringBuilder(256)
            mciSendString(Command, Res, Res.Capacity, IntPtr.Zero)
            TrackBar1.Maximum = Integer.Parse(Res.ToString)
            Command = "play MySound"
            mciSendString(Command, Nothing, 0, IntPtr.Zero)
            Me.Timer1.Interval = 500
            Me.Timer1.Start()
        End If
    End Sub

    Private Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
        Timer1.Stop()
        Me.Text = Path.GetFileName(FileName) & "を停止中..."
        Dim Command As String
        Command = String.Format("stop {0}", "MySound")
        mciSendString(Command, Nothing, 0, IntPtr.Zero)
        Command = String.Format("close {0}", "MySound")
        mciSendString(Command, Nothing, 0, IntPtr.Zero)
    End Sub

    Private Sub Button3_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button3.Click
        Me.OpenFileDialog1.Filter = "サウンドファイル(*.wav)|*.wav"
        Me.OpenFileDialog1.InitialDirectory = Application.StartupPath
        If Me.OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
            FileName = Me.OpenFileDialog1.FileName
            Me.Text = Path.GetFileName(FileName)
        End If
    End Sub

    Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Dim Command As String = String.Format("status {0} {1}", "MySound", "position")
        Dim Res As New StringBuilder(256)
        mciSendString(Command, Res, Res.Capacity, IntPtr.Zero)
        Me.TrackBar1.Value = Integer.Parse(Res.ToString)
    End Sub

    Private Sub TrackBar1_Scroll(ByVal sender As Object, ByVal e As System.EventArgs) Handles TrackBar1.Scroll
        Dim TrackBar As TrackBar = DirectCast(sender, TrackBar)
        Dim Command As String
        Command = String.Format("seek {0} to {1}", "MySound", TrackBar.Value)
        mciSendString(Command, Nothing, 0, IntPtr.Zero)
        Command = String.Format("play {0}", "MySound")
        mciSendString(Command, Nothing, 0, IntPtr.Zero)
    End Sub

End Class
投稿者 kane  (中学生) 投稿日時 2010/7/21 14:06:24
おかげ様で出来るようになりましたwww
YASさんるきおさんありがとうございましたww

wavファイルよりmp3ファイルが再生できるようにしたいのですが?
どのようにしたらいいでしょうか?
投稿者 YAS  (社会人) 投稿日時 2010/7/21 22:48:00
>wavファイルよりmp3ファイルが再生できるようにしたいのですが?

そうなのですか?
kaneさんの投稿から,それは全然読み取ることができませんでした...

Me.OpenFileDialog1.Filter = "サウンドファイル(*.wav)|*.wav"

の行を

Me.OpenFileDialog1.Filter = "サウンドファイル(*.wav)|*.wav|MP3形式サウンド(*.mp3)|*.mp3"

と書き換えてください。mp3ファイルも選択できるようになります。
通常はmciでmp3ファイルも再生できると思います。
投稿者 (削除されました)  () 投稿日時 2010/7/21 23:34:19
(削除されました)
投稿者 kane  (中学生) 投稿日時 2010/7/21 23:37:25
YASさんありがとうございますww
あのまたエラーが出ます(泣

Dim WithEvents Button1 As New Button
    Dim WithEvents Button2 As New Button
    Dim WithEvents Button3 As New Button
    Dim WithEvents TrackBar1 As New TrackBar
    Dim WithEvents Timer1 As New Timer
    Dim WithEvents OpenFileDialog1 As New OpenFileDialog
    Dim FileName As String

↑Btton1はすでにclassで'Friend WithEvents Button1 As System.Windows.Forms.Button' として既に宣言されています。

ってでます。

どうすればいいでしょうか?
投稿者 YAS  (社会人) 投稿日時 2010/7/22 06:03:58
>Btton1はすでにclassで'Friend WithEvents Button1 As System.Windows.Forms.Button' として既に宣言されています。

デザイナで自分でButton1を配置したのだと思います。
Button1が2つあるとエラーになります。

Dim WithEvents Button1 As New Button

を一度消した後,デザイナでbutton1を消し,再び

Dim WithEvents Button1 As New Button

を書いてください。
もしくは新しいプロジェクトを作成して私のコードをコピーしてください。

なお,私のコードはコードだけで完結するために,通常はデザイナで配置するコントロールも
コードで配置しています。自分でデザイナで配置する場合は,

    Dim WithEvents Button1 As New Button
    Dim WithEvents Button2 As New Button
    Dim WithEvents Button3 As New Button
    Dim WithEvents TrackBar1 As New TrackBar
    Dim WithEvents Timer1 As New Timer
    Dim WithEvents OpenFileDialog1 As New OpenFileDialog

の部分を消してください。