2017-09-26 6 views
0

メトロノームアプリケーションを作成し始めたばかりですが、タイマーで音色を再生するときに問題が発生しました。タイマーティックを設定します。たとえば、1秒ごとにサウンドを再生するメソッドを呼び出します。そして、音が一度だけ演奏され、何も演奏されないという問題が現れました。WPF Timer Tickで音を再生する - 音が反復しない

私の質問 - すべてのタイマーティックで音を鳴らすにはどうすればいいですか? MSDNから

<Window x:Class="Metronome.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition /> 
     <ColumnDefinition /> 
    </Grid.ColumnDefinitions> 
    <StackPanel Grid.Column="0"> 
     <TextBox Name="textBox1" /> 
     <Button Name="button1" Content="Start" Click="button1_Click" /> 
     <MediaElement Name="mediaElement1" Source="MetroBar1.wav" LoadedBehavior="Manual" /> 
    </StackPanel> 
</Grid> 

 using System.Collections.Generic; 
     using System.Linq; 
     using System.Text; 
     using System.Windows; 
     using System.Windows.Controls; 
     using System.Windows.Data; 
     using System.Windows.Documents; 
     using System.Windows.Input; 
     using System.Windows.Media; 
     using System.Windows.Media.Imaging; 
     using System.Windows.Navigation; 
     using System.Windows.Shapes; 
     using System.Windows.Threading; 

     namespace Metronome 
{ 
public partial class MainWindow : Window 
{ 
    const int secInMin = 60; 
    int beatRate; 
    double beatPerMsec; 

    DispatcherTimer timer1; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     timer1 = new DispatcherTimer(); 
    } 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     //beatRate = Convert.ToInt16(textBox1.Text); 
     //beatPerMsec = Math.Pow((beatRate/secInMin), -1) * 1000; //Amount of beats (timer ticks) per msec 
     // timer1.Tick += new EventHandler(metronome_Run); 
     timer1.Tick += metronome_Run; 
     //timer1.Interval = new TimeSpan(0, 0, 0, 0, Convert.ToInt16(beatPerMsec)); 
     timer1.Interval = new TimeSpan(0, 0, 1); 
     timer1.Start(); 
    } 

    private void metronome_Run(object sender, EventArgs e) 
    { 
     mediaElement1.Play(); 
    } 
} 

}

+1

なぜb/aの代わりにMath.Pow(a/b、-1)を書いていますか? :) – Adassko

答えて

4

MediaElement.Play()

演劇媒体現在位置から。

MediaElement再生が完了すると自動的に位置がリセットされません。 Playを呼び出す前に、手動でPositionをリセットする必要があります。

private void metronome_Run(object sender, EventArgs e) 
{ 
    mediaElement1.Position = new TimeSpan(0); 
    mediaElement1.Play(); 
} 

あなたのサウンドファイルの長さに応じて、Playを呼び出す前にStopを呼び出すために、より安全かもしれません。 Stopが自動的に先頭に戻ってリセットされ、現在再生中のサウンドが中断されます。

private void metronome_Run(object sender, EventArgs e) 
{ 
    mediaElement1.Stop(); 
    mediaElement1.Play(); 
} 
+0

mediaElement.Positionを使用すると、ビートが不安定であると聞くことができるので、ありがとうございます。 –

関連する問題