エラーが発生した際や、ユーザーの注意を引きたいときに、OS 標準の警告音(ビープ音)を鳴らす方法を紹介します。
1. フロントエンドから作成する (TypeScript)
Web Audio API を使用して、ビープ音のような正弦波を生成・再生する方法です。簡易的ですがクロスプラットフォームで動作します。
Web Audio API によるビープ音
function playWebBeep(frequency = 440, duration = 0.2) {
const audioCtx = new (window.AudioContext || (window as any).webkitAudioContext)();
const oscillator = audioCtx.createOscillator();
const gainNode = audioCtx.createGain();
oscillator.type = 'sine'; // 正弦波
oscillator.frequency.setValueAtTime(frequency, audioCtx.currentTime);
gainNode.gain.setValueAtTime(0.1, audioCtx.currentTime); // 音量
oscillator.connect(gainNode);
gainNode.connect(audioCtx.destination);
oscillator.start();
oscillator.stop(audioCtx.currentTime + duration);
}
// 呼び出し
playWebBeep(880, 0.1);
2. バックエンドから作成する (Rust)
OS ネイティブの API (MessageBeep, NSBeep) を呼び出すコマンドを作成します。
Rust コマンドの実装
src-tauri/src/lib.rs:
use tauri::command;
#[command]
fn play_system_beep() {
#[cfg(target_os = "macos")]
unsafe {
use cocoa::appkit::NSBeep;
NSBeep();
}
#[cfg(target_os = "windows")]
unsafe {
use winapi::um::winuser::MessageBeep;
use winapi::um::winuser::MB_OK;
MessageBeep(MB_OK);
}
#[cfg(target_os = "linux")]
println!("\x07");
}
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
tauri::Builder::default()
.invoke_handler(tauri::generate_handler![play_system_beep])
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
Cargo.toml に依存関係を追加:
[target.'cfg(target_os = "macos")'.dependencies]
cocoa = "0.24"
[target.'cfg(target_os = "windows")'.dependencies]
winapi = { version = "0.3", features = ["winuser"] }
TypeScript からの呼び出し
import { invoke } from '@tauri-apps/api/core';
async function beep() {
await invoke('play_system_beep');
}
補足
- ネイティブ統合: ユーザーがOS 設定で変更している警告音がそのまま再生されるため、Rust 版の方がネイティブ感があります。
- 依存関係: OS 固有のクレート(
winapi,cocoa)はcfgでターゲットを絞って追加してください。