ここでは、C#のGUIのフレームワークであるWPFのサンプルプログラムを、ChatGPTの力を借りながら、作ったサンプルコードをまとめています。実行可能であることは確認していますが、WPF初学者の私がChatGPTと作っているので、ベストな方法ではないかもしれませんので、ご了承ください。

音を出す

指定した時間後に音を鳴らすタイマーを作ろうとしたのですが、プロンプトをいろいろ変えてもなかなかうまくいきませんでした。特に、音声ファイルの生成ができませんでしたのでまず音を出すサンプルから作ることにしました。

まずプロンプトです。これも一回ではうまくいかず、何度か修正してもらって完成しました。


Visual Studio Express 2017で、PCで動くサンプルアプリを作ります。
GUIはWFPを使います。

GUIの外観
+「音を出す」と書かれたボタン

動作
+「音を出す」を押すと、タイマー音が再生される。
+タイマー音は、exeファイルと同じフォルダにある「sound.mp3」を使用する。

このアプリのXAMLのコードと、C#のコードを作ってください。
mp3ファイルを再生するために必要なライブラリがある場合にはインストールの方法も説明してください。


 

GPTが作ってくれた、MainWindow.xamlです。

<Window x:Class="SampleApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Sample App" Height="200" Width="300">
    <Grid>
        <Button x:Name="playSoundButton" Content="音を出す" HorizontalAlignment="Center" VerticalAlignment="Center" Width="100" Height="40" Click="PlaySoundButton_Click"/>
    </Grid>
</Window>

 

次は、GTPが作ってくれた、MainWindow.xaml.cs です。

using System;
using System.Windows;
using System.Windows.Media;
using System.IO;
using System.Windows.Media.Imaging;

namespace SampleApp
{
    public partial class MainWindow : Window
    {
        private MediaPlayer player = new MediaPlayer();

        public MainWindow()
        {
            InitializeComponent();

            // タイマー音の設定
            string soundFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "sound.mp3");
            player.Open(new Uri(soundFilePath));
        }

        private void PlaySoundButton_Click(object sender, RoutedEventArgs e)
        {
            // タイマー音再生
            player.Stop();  // 既存の再生を停止
            player.Play();  // 再生開始
        }
    }
}

 

実行したときのGUIです。ボタンを押すと、…\bin\Debug\sound.mp3 を再生することを確認しました。

タイマー

タイマーを作ってもらうのは、かなり試行錯誤しました。プロンプトを変えてもなかなか思うようにはいかず、運の要素もある感じもしてきました。特に、特に音を出すところで毎回エラーが出て、修正を依頼してもうまくいきません。

そこで、一気に作るのではなく、段階的に機能を加えていくように指示しました。そのようにしたら、結構スムーズに目的のものに到達できました。

 

以下、使用したプロンプトです。

1回目:時間のボタンは「+5秒」のみ。時間が0になっても、音は出さずに、表示のみ。


Visual Studio Express 2017で、PCで動くシンプルなタイマーアプリを作ります。
GUIはWFPを使います。

GUIに表示するもの
+時間を表示するラベル。画面上部にセンタリングして大きいフォントで表示。「HH:MM:SS」で時間を表示する。
+「+5秒」と表記された時間ボタン。時間を表示したラベルの下の行に配置。
+「初期化」と表記されたクリアボタン。時間増加ボタンの下の行に配置。

動作
+起動時すると、初期状態として、時間を「00:00:00」と表示。
+時間増加ボタンを押すと、対応する時間が加算されカウントダウンが開始する。
+カウントダウンが終わると、「時間になりました」と表示する。
+「初期化」ボタンを押すと、初期状態となる。

このアプリのXAMLのコードと、C#のコードを作ってください。コメントも詳しく入れてください。


 

2回目:時間が0になったときに音がなるようにする。音の繰り返しはなし。


カウントダウンが終わって、「時間になりました」と表示するときに、実行ファイル同じフォルダに配置されたsound.mp3 を再生するように改良してください。


 

3回目:「初期化」ボタンを押すまで、音が繰り返し鳴るようする。


カウントダウンが終わって、「時間になりました」と表示するときに、
実行ファイル同じフォルダに配置されたsound.mp3 を繰り返し再生するように改良してください。
そして、「初期化」ボタンを押したときに、再生を止めるようにしてください。


 

4回目:時間ボタンの追加。


「+5秒」のボタンの横に「+10秒」と「+1分」のボタンも加えてください。


 

5回目:レイアウト調整。


ボタンが重なっているので、位置を整えてください。


 

以下、GPTが最終的に作ってくれたコードです。

<Window x:Class="SimpleTimerApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Simple Timer App" Height="300" Width="400">
    <Grid>
        <Label x:Name="timeLabel" Content="00:00:00" FontSize="36" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="0,40,0,0"/>
        <Button Content="+5秒" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Height="30" Margin="50,100,0,0" Click="Add5SecondsButton_Click"/>
        <Button Content="+10秒" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Height="30" Margin="140,100,0,0" Click="Add10SecondsButton_Click"/>
        <Button Content="+1分" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Height="30" Margin="230,100,0,0" Click="Add1MinuteButton_Click"/>
        <Button Content="初期化" HorizontalAlignment="Center" VerticalAlignment="Top" Width="75" Height="30" Margin="0,150,0,0" Click="ClearButton_Click"/>
    </Grid>
</Window>

 

using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Threading;
using System.IO;

namespace SimpleTimerApp
{
    public partial class MainWindow : Window
    {
        private TimeSpan currentTime = TimeSpan.Zero;
        private DispatcherTimer countdownTimer = new DispatcherTimer();
        private MediaPlayer player = new MediaPlayer();

        public MainWindow()
        {
            InitializeComponent();

            // タイマーの設定
            countdownTimer.Interval = TimeSpan.FromSeconds(1);
            countdownTimer.Tick += CountdownTimer_Tick;

            // アラーム音の設定
            string soundFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "sound.mp3");
            player.Open(new Uri(soundFilePath));
            player.MediaEnded += Player_MediaEnded;
        }

        private void CountdownTimer_Tick(object sender, EventArgs e)
        {
            currentTime = currentTime.Add(TimeSpan.FromSeconds(-1));

            // タイマー表示を更新
            timeLabel.Content = currentTime.ToString(@"hh\:mm\:ss");

            if (currentTime.TotalSeconds <= 0)
            {
                countdownTimer.Stop();
                timeLabel.Content = "時間になりました";
                PlayAlarm();
            }
        }

        private void PlayAlarm()
        {
            player.Position = TimeSpan.Zero;
            player.Play();
        }

        private void Player_MediaEnded(object sender, EventArgs e)
        {
            PlayAlarm(); // アラーム音を繰り返し再生
        }

        private void Add5SecondsButton_Click(object sender, RoutedEventArgs e)
        {
            AddTime(TimeSpan.FromSeconds(5));
        }

        private void Add10SecondsButton_Click(object sender, RoutedEventArgs e)
        {
            AddTime(TimeSpan.FromSeconds(10));
        }

        private void Add1MinuteButton_Click(object sender, RoutedEventArgs e)
        {
            AddTime(TimeSpan.FromMinutes(1));
        }

        private void ClearButton_Click(object sender, RoutedEventArgs e)
        {
            countdownTimer.Stop();
            player.Stop();
            timeLabel.Content = "00:00:00";
            currentTime = TimeSpan.Zero;
        }

        private void AddTime(TimeSpan timeSpan)
        {
            currentTime = currentTime.Add(timeSpan);
            timeLabel.Content = currentTime.ToString(@"hh\:mm\:ss");

            if (!countdownTimer.IsEnabled)
                countdownTimer.Start();
        }
    }
}

 

実行したときのGUIです。

立ち上げ時は00:00:00 を表示。

「+5秒」を押すと00:00:05からカウントダウンし、

時間が来ると、「時間になりました」と表示され、アラームが鳴り続けます。

やっとできました。

動画はこちら。