スクイズ機能を実装した。 入力部分も少し修正。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
using NAudio.Wave; using System; using System.Threading.Tasks; using System.Windows.Forms; //serialPortのDtrEnableをtrue、PortNameをCOM3(デスクトップPC)に設定しておく namespace elekey2024_1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private bool execute; private int keystat = 0; private WaveOut waveOut; private Task dot, dash; private void btn_start_Click(object sender, EventArgs e) { if (!execute) { execute = true; btn_start.Text = "停止"; var sineWaveProvider = new SineWaveProvider32(); sineWaveProvider.Frequency = 800; sineWaveProvider.Amplitude = 0.5f; waveOut = new WaveOut(); waveOut.Init(sineWaveProvider); waveOut.Play(); waveOut.Volume = 0; timer1.Start(); } else if(execute) { execute = false; btn_start.Text = "開始"; waveOut.Stop(); waveOut.Dispose(); waveOut = null; timer1.Stop(); } btn_start.Refresh(); while(execute) { if (keystat == 0) { if (keymem == 1) dot = dotproc(); else if (keymem == 2) dash = dashproc(); else if (keydat == 1) dot = dotproc(); else if (keydat == 2) dash = dashproc(); } Application.DoEvents(); } } private void Form1_Load(object sender, EventArgs e) { try { if (serialPort1.IsOpen == true) { return; } serialPort1.Open(); } catch (Exception ex) { MessageBox.Show(ex.Message); } execute = false; } //interval 5ms keydat 0:space 1:dot 2:dash private int keydat = 0; private int keymem = 0; private void timer1_Tick(object sender, EventArgs e) { if (serialPort1.CtsHolding & serialPort1.DsrHolding) { if (keystat == 1) keydat = 2; else if (keystat == 2) keydat = 1; } else if (serialPort1.CtsHolding & !serialPort1.DsrHolding) { if (keystat == 1) keymem = 2; else keydat = 2; } else if (serialPort1.DsrHolding & !serialPort1.CtsHolding) { if (keystat == 2) keymem = 1; else keydat = 1; } else if(!serialPort1.DsrHolding & !serialPort1.CtsHolding) { keydat = 0; keystat = 0; keymem = 0; } } private void Form1_FormClosed(object sender, FormClosedEventArgs e) { serialPort1.Close(); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
using System.Threading.Tasks; namespace elekey2024_1 { public partial class Form1 { private void soundonoff(bool done) { if (done) waveOut.Volume = 0.25f; else if (!done) waveOut.Volume = 0.0f; } private async Task dotproc() { keymem = 0; if (keystat == 1) return; keystat = 1; soundonoff(true); await Task.Delay(100); soundonoff(false); await Task.Delay(100); keystat = 0; } private async Task dashproc() { keymem = 0; if (keystat == 2) return; keystat = 2; soundonoff(true); await Task.Delay(300); soundonoff(false); await Task.Delay(100); keystat = 0; } } } |
音を出す部分は、(1)と同じなので省略。
キー入力のチェックは、5ms毎にまんべんなく行っているけど、タイミングを少し制限した方が使い易いかもしれない。
とりあえず、エレキーもどきは一旦終了。