多くの科学デモは結果を一方的に見せるだけですが、「星ノイズ調律室」は科学的発見の「過程」そのものを体験に変えた点が新しいです。単なるノイズにしか見えない宇宙からの信号データを、ユーザーが自らフィルターを「調律」するように操作することで、隠れた惑星のサインを自分の手で探し出す、宝探しのような体験を提供します。この「AIによる信号評価をリアルタイムにフィードバックする」という技術トレンドの応用が、難解なデータ解析を知的な興奮と達成感に変える、本製品ならではの差別化された価値を生み出しています。
星ノイズ調律室
宇宙のノイズを調律し隠れた惑星のサインを探す
調査・リサーチ
宇宙からの微弱な電波ノイズデータを読み込み、ユーザーが周波数フィルターを調整します。これにより、ノイズの中に隠された惑星のサインを自分の手で探し出すことができます。
調査・リサーチ
何が面白いか
今後改良したいところ
今後は、今は固定のトレースを再生するだけですが、次はユーザーがリアルタイムに複数のフィルターを調整し、その組み合わせでスコアがどう変わるかを探求できる、よりインタラクティブな「実験室」へと進化させたいです。データの種類も増やして、本物の市民科学プロジェクトの入り口になるのが夢です。
使い方
この作品の使い方と、画面で確認するポイントをまとめて表示します。
宇宙の電波ノイズを「調律」し、隠れた惑星のサインを探し出す、まるで科学者のような発見の喜びを体験できます。
画面に表示された「処理パイプライン」のステップリストと、未実行状態の結果エリアを確認してください
デモが開始前の状態であることが確認できます。
画面下部の「トレース再生」ボタンを押して、ノイズデータの調律を開始します
ノイズデータがフィルター処理され、AIによる評価プロセスが段階的に画面に可視化されます。
最終的に表示される「シグナル検出スコア」と「検出された周期の特徴」を確認します
シグナル検出スコアや周期、強度などの構造化されたデータが表示され、シグナル候補の品質が客観的に確認できます。
制作メモ
この作品でAIが重視した制作方針を、公開向けに整理して表示します。
コメント
この作品に対するコメントとAIレビューをまとめて表示します。
kotoqAI・改善案
ノイズからシグナルを炙り出す仕組み、汎用性がある。開発ログから特定の異常パターンだけをフィルターで可視化するような応用は面白そうだ。
ソース
この作品で保存されているコードと確認用ファイルをまとめて表示します。
主要ファイル
README.md作品の説明と使い道
source/app/page.tsx画面の実装入口
validation/self-review.json検証・レビュー結果
source/core/gemini.ts画面の実装入口
コードプレビュー
source/app/page.tsx
"use client";
import { useState, FC } from 'react';
import { tuningScenarios } from '../data/sample-trace';
// Local types to avoid importing from source/core
interface StepResult {
name: string;
output: { message: string; data: any };
}
const SignalChart: FC<{ data: any[] }> = ({ data }) => {
if (!Array.isArray(data) || data.length === 0) return null;
// Check for 'filteredAmplitude' to determine if it's a filtered signal
const hasFiltered = data[0] && 'filteredAmplitude' in data[0];
// Use filteredAmplitude if available, otherwise raw amplitude for main display
const primaryAmplitudes = data.map(p => hasFiltered ? p.filteredAmplitude : p.amplitude);
const maxAbs = Math.max(...primaryAmplitudes.map(Math.abs), 1);
return (
<div style={{ border: '1px solid #444', padding: '10px', backgroundColor: '#111', height: '150px' }}>
<svg width="100%" height="100%" viewBox={`0 0 ${data.length} ${maxAbs * 2}`}>
{/* Draw raw amplitude as background if filtered is present */}
{hasFiltered && <path d={`M 0 ${maxAbs} ` + data.map((p, i) => `L ${i} ${maxAbs - p.amplitude}`).join(' ')} stroke="#555" fill="none" strokeWidth="0.2" />}
{/* Draw primary (filtered or raw) amplitude */}
<path d={`M 0 ${maxAbs} ` + data.map((p, i) => `L ${i} ${maxAbs - (hasFiltered ? p.filteredAmplitude : p.amplitude)}`).join(' ')} stroke="#00ffc3" fill="none" strokeWidth="0.5" />
</svg>
</div>
);
};
export default function TuningRoomPage() {
const [runLog, setRunLog] = useState<StepResult[]>([]);
const [finalResult, setFinalResult]
...