Tool zur Protokollierung der täglichen Übungszeit

Perkeo
Perkeo
Registrierter Benutzer
Zuletzt hier
07.01.25
Registriert
15.01.22
Beiträge
127
Kekse
1.046
Ort
Ansbach
Hallo zusammen,

ich suche schon seit längerem eine Möglichkeit, meine Übungszeit (E-Gitarre) zu protokollieren. Natürlich lässt sich das mit einer Stopuhr oder einem Timer verwirklichen, Problem dabei ist: Es ist umständlich und ich vergesse ständig, den Timerknopf zu drücken, hab keine Lust die Zeiten irgendwo einzugeben, einzutragen, etc. Also übe ich halt doch so mehr oder weniger bis es genug ist oder ich keine Lust mehr habe.

Deshalb hab ich mal ChatGTP befragt und heraus gekommen ist ein kleines Tool in html, welches wie eine Stopuhr funktioniert. Ausgelöst wird der Timer durch ein Signal des Audioeinganges an welchem mein Pod Go angeschlossen ist. Und das funktioniert so:

Sobald ein Signal über den Audioeingang kommt, startet der Timer. Wenn ich nun aufhöre zu üben, kommt kein Signal mehr. Mein Tool zählt dann noch 5 Minuten weiter bevor es die Protokollierung stoppt. Ist die Spielpause länger als 5 Minuten wird die Protokollierung beendet und diese 5 Minuten von der Spielzeit abgezogen.

Das Ganze wird dann in eine Tabelle eingetragen.

So wird also meine tägliche Übungszeit minutengenau erfasst und protokolliert. Einziger Aufwand dabei: Der Browser muss geöffnet sein (ist er bei mir sowieso fast immer) und der Schwellwert, ab welchem das Tool die Protokollierung startet muss vorher eingestellt werden.

Es funktioniert in seiner Grundfunktion, wurde aber noch nicht im Langzeitbetrieb getestet und ich würde es gern noch ein bißchen erweitern. Allerdings hab ich keinen kostenpflichtigen ChatGTP Account und muss jetzt bis morgen warten, um daran weiter zu arbeiten. Aber vielleicht hat jemand von euch Lust, es auszuprobieren oder selbst ein bißchen damit zu basteln.

lg Perkeo

Hier der Quelltext:



Code:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Guitar Practice Timer</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 20px;
            background-color: black;
            color: white;
        }
        h1 {
            text-align: center;
        }
        #controls, #log {
            margin-top: 20px;
        }
        table {
            width: 100%;
            border-collapse: collapse;
        }
        th, td {
            border: 1px solid #555;
            padding: 8px;
        }
        th {
            background-color: #333;
            color: white;
            text-align: left;
        }
        td {
            background-color: #222;
        }
        #threshold-container {
            margin-top: 20px;
        }
        #visualizer {
            width: 100%;
            height: 20px;
            background-color: #444;
            position: relative;
            margin-bottom: 10px;
        }
        #level {
            height: 100%;
            background-color: green;
            width: 0;
        }
        #threshold-slider {
            width: 100%;
        }
        #session-time {
            color: white;
        }
    </style>
</head>
<body>
    <h1>Guitar Practice Timer</h1>

    <div id="controls">
        <label for="audio-input">Select Audio Input:</label>
        <select id="audio-input"></select>
        <button id="start-button">Start Monitoring</button>
        <button id="stop-button" disabled>Stop Monitoring</button>
    </div>

    <div id="threshold-container">
        <div id="visualizer">
            <div id="level"></div>
        </div>
        <label for="threshold-slider">Set Threshold:</label>
        <input type="range" id="threshold-slider" min="0" max="100" value="5">
    </div>

    <div id="status">
        <p><strong>Status:</strong> <span id="status-text">Stopped</span></p>
        <p><strong>Current Session Time:</strong> <span id="session-time">0:00</span></p>
    </div>

    <div id="log">
        <h2>Practice Log</h2>
        <table>
            <thead>
                <tr>
                    <th>Date</th>
                    <th>Time Practiced</th>
                </tr>
            </thead>
            <tbody id="log-table-body">
            </tbody>
        </table>
    </div>

    <script>
        const audioInputSelect = document.getElementById('audio-input');
        const startButton = document.getElementById('start-button');
        const stopButton = document.getElementById('stop-button');
        const statusText = document.getElementById('status-text');
        const sessionTime = document.getElementById('session-time');
        const logTableBody = document.getElementById('log-table-body');
        const thresholdSlider = document.getElementById('threshold-slider');
        const visualizer = document.getElementById('visualizer');
        const level = document.getElementById('level');

        let audioContext, analyser, source;
        let monitoring = false;
        let startTime = null;
        let accumulatedTime = 0;
        let silenceTimer = null;
        let silenceThreshold = 5 * 60 * 1000; // 5 minutes in milliseconds

        async function getAudioInputs() {
            const devices = await navigator.mediaDevices.enumerateDevices();
            const audioInputs = devices.filter(device => device.kind === 'audioinput');
            audioInputs.forEach((device, index) => {
                const option = document.createElement('option');
                option.value = device.deviceId;
                option.textContent = device.label || `Microphone ${index + 1}`;
                audioInputSelect.appendChild(option);
            });
        }

        function formatTime(ms) {
            const totalSeconds = Math.floor(ms / 1000);
            const minutes = Math.floor(totalSeconds / 60);
            const seconds = totalSeconds % 60;
            return `${minutes}:${seconds.toString().padStart(2, '0')}`;
        }

        function updateLog(date, time) {
            const row = document.createElement('tr');
            const dateCell = document.createElement('td');
            const timeCell = document.createElement('td');
            dateCell.textContent = date;
            timeCell.textContent = formatTime(time);
            row.appendChild(dateCell);
            row.appendChild(timeCell);
            logTableBody.appendChild(row);
        }

        async function saveData() {
            const data = {
                date: new Date().toLocaleDateString(),
                accumulatedTime
            };
            const file = new Blob([JSON.stringify(data)], { type: 'application/json' });
            const a = document.createElement('a');
            a.href = URL.createObjectURL(file);
            a.download = 'practice_data.json';
            a.click();
        }

        async function startMonitoring() {
            const selectedDeviceId = audioInputSelect.value;
            const stream = await navigator.mediaDevices.getUserMedia({
                audio: { deviceId: selectedDeviceId },
                video: false
            });

            audioContext = new AudioContext();
            analyser = audioContext.createAnalyser();
            analyser.fftSize = 256;
            source = audioContext.createMediaStreamSource(stream);
            source.connect(analyser);

            monitoring = true;
            statusText.textContent = 'Monitoring';
            startTime = Date.now();
            accumulatedTime = 0;
            silenceTimer = null;

            startButton.disabled = true;
            stopButton.disabled = false;

            monitorAudio();
        }

        function stopMonitoring() {
            monitoring = false;
            statusText.textContent = 'Stopped';

            if (startTime) {
                accumulatedTime += Date.now() - startTime;
                updateLog(new Date().toLocaleDateString(), accumulatedTime);
            }

            if (silenceTimer) {
                clearTimeout(silenceTimer);
            }

            if (audioContext) {
                audioContext.close();
            }

            saveData();

            startButton.disabled = false;
            stopButton.disabled = true;
        }

        function monitorAudio() {
            if (!monitoring) return;

            const buffer = new Uint8Array(analyser.frequencyBinCount);
            analyser.getByteFrequencyData(buffer);

            const volume = buffer.reduce((sum, value) => sum + value, 0) / buffer.length;
            const threshold = parseInt(thresholdSlider.value, 10);

            // Update visualizer
            level.style.width = `${(volume / 256) * 100}%`;

            if (volume > threshold) { // Noise detected
                sessionTime.style.color = 'green';
                if (silenceTimer) {
                    clearTimeout(silenceTimer);
                    silenceTimer = null;
                }
                if (!startTime) {
                    startTime = Date.now();
                }
                sessionTime.textContent = formatTime(accumulatedTime + (Date.now() - startTime));
            } else {
                sessionTime.style.color = 'red';
                if (!silenceTimer) {
                    silenceTimer = setTimeout(() => {
                        accumulatedTime += Date.now() - startTime;
                        startTime = null;
                    }, silenceThreshold);
                }
                if (startTime) {
                    sessionTime.textContent = formatTime(accumulatedTime + (Date.now() - startTime));
                }
            }

            requestAnimationFrame(monitorAudio);
        }

        startButton.addEventListener('click', startMonitoring);
        stopButton.addEventListener('click', stopMonitoring);

        getAudioInputs();

        window.addEventListener('beforeunload', saveData);
    </script>
</body>
</html>
 
  • Gefällt mir
  • Interessant
  • Haha
Reaktionen: 4 Benutzer
Nette Idee, macht aber alles meine Frau für mich.

Allerdings eher um ihre Postion hinsichtlich der häuslichen Arbeiten zu stärken.
Wir haben jetzt 50:50 vereinbart.

Ich habe jetzt 50% Zeit zum spielen und 50% für die gesamte Hausarbeit.
 
  • Haha
  • Gefällt mir
Reaktionen: 8 Benutzer
Coole Idee, das als Web-App (HTML + JavaScript) zu bauen! Hab es kurz ausprobiert - klappt :)

Eine mögliche Erweiterung wäre, die Übe-Protokolle im Localstorage des Browsers zu speichern, so dass die Übe-Daten nicht als JSON-Dateien lokal gespeichert werden müssen. Allerdings hat dein Ansatz natürlich auch Vorteile: Die Dateien sind sicher gebackuppt, während der Localstorage schon auch mal verloren gehen kann.

Außerdem - wenn ich jetzt von meinen Übe-Routinen ausgehe - wäre ein Kommentarfeld ganz nett, um einzutragen, woran man geübt hat. Oder eine Dropdown-Liste, wo man zwischen verschiedenen Bereichen wählen kann (z.B. Technik, Repertoire, Voicings, Improvisation, Comping, Transkription usw.). Dann sieht man, an welchem Tag man was gemacht hat... und ggf. wäre sogar noch eine Checkliste nicht schlecht.

Die Sache mit dem Threshold könnte man auch noch etwas intelligenter machen, indem beim Zuhören ein Mittelwert gemerkt wird (z.B. über die letzten 20 Sekunden) und dann automatisch erkannt wird, wenn der Level deutlich darüber liegt.

Ich habe mir vor Jahren mal ein ähnliches Tool zum Üben gebaut, wo noch ein Media-Player für YouTube-Videos eingebaut ist und verschiedene Felder zum Eingeben von konkreten Übungen, Akkordfolgen, Links.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: 1 Benutzer
Sobald ein Signal über den Audioeingang kommt, startet der Timer. Wenn ich nun aufhöre zu üben, kommt kein Signal mehr. Mein Tool zählt dann noch 5 Minuten weiter bevor es die Protokollierung stoppt. Ist die Spielpause länger als 5 Minuten wird die Protokollierung beendet und diese 5 Minuten von der Spielzeit abgezogen.

Und wenn was dazwischen kommt (Vulkanausbruch, Erdbeben, Sturmflut oder sogar Durchfall) und du nur 2 Minuten üben kannst und dir 5 Minuten abgezogen werden, dann hast du ja -3 Minuten geübt!
Mhh? :unsure:
 
  • Haha
Reaktionen: 3 Benutzer
Coole Idee, ich bau mir nen Betriebsstundenzähler in den Amp :unsure:
 
  • Haha
Reaktionen: 6 Benutzer
Die Kommentare hat auch ChatGPT verfasst?
if (volume > threshold) { // Noise detected
Ich würde mir da sorgen machen, ob dir die KI wohlgesonnen ist ;)

Aber generell eine gute Idee und eine sehr schöne Anwendung von AI assisted programming.
 
  • Haha
Reaktionen: 1 Benutzer
:gruebel:

Wäre es nicht hilfreicher zu protokollieren, was Du geübt hast und ob bzw. welche Fortschritte Du dabei erzielst? Also ein Trainingstagebuch zu führen? So bekommst Du doch nur einen Zeitstrahl, aus dem sich keinerlei hilfreiche Informationen ableiten lassen, außer, dass Du etwas getan hast. Wenn Du also Ende 2025 da X Stunden auf der Uhr stehen hast, aber keinen Millimeter weiter gekommen bist, kannst Du immer noch nicht sagen, woran es liegt. Viel hilft zwar viel beim Üben, aber nur dann, wenn man auch das Richtige übt. Ein Zeitmesser scheint mir hier die nutzloseste Idee zu sein. Es sei denn Du bist Eddie oder Alex van Halen, die von ihrer Mutter gezwungen werden, mindestens 30 Minuten täglich Klavier zu üben, bevor sie zu Gitarre und Schlagzeug übergehen. Dann ist ein Zeitmesser essentiell:).
 
  • Gefällt mir
Reaktionen: 6 Benutzer
Die Grundvoraussetzung ist doch erst einmal, zu klären worin der Sinn liegt, warum und was protokolliert werden soll, bevor man sich über ein Tool Gedanken macht.
Da könnte wie bei @SlowGin die Frau sein, die gerne die Zeit begrenzt haben möchte, die man für's üben verbringt, da könnte der Auftragsmusiker sein, der seine Zeit dokumentieren möchte, die er für die Vorbereitung investiert hat, um das ggf. in Rechnung zu stellen, oder seine Gage entsprechend anzupassen, oder es ist lediglich reines Interesse für einen selber, wieviel Zeit man an seinem Instrument sitzt. Apropos Instrument, evtl. möchte ich ja auch noch unterscheiden, wieviel Zeit ich am Keyboard und wieviel an der Gitarre sitze, bzw. wieviel Zeit ich für Gesangtraining verbringe. Wenn das alles über ein Audiointerface läuft, könnte das vom TE genannte Tool genutzt werden, müsste vielleicht nur noch das Instrument erkennen und entsprechend aufschlüsseln.

Ich will das lieber alles gar nicht so genau wissen. Im Moment hab ich einem Bekannten die Keyboard-Begleitung für sein Schülerkonzert zugesagt. Da hab ich 24 Songs aus allen möglichen Genres bekommen, davon hab ich 5 selber schon mal gespielt, die restlichen muss ich mir drauf schaffen, einige davon echt heftig aufwendig. Da hab ich gefühlt schon 30 Stunden dran gesessen, alleine mit der Vorbereitung, Sound Programmierung, Chords und Noten raushören, und werde sicher noch weitere Zeit mit dem Üben der Songs verbringen. Wenn ich das in Rechnung stellen müsste, würden da sicher die kompletten Einnahmen für das Konzert nicht reichen. Daher besser, nicht zu viel drüber nachzudenken, sondern einfach nur das Proben genießen :)
 
  • Gefällt mir
Reaktionen: 1 Benutzer
Wenn/dann, würde ich wohl auch eher konkrete Ziele definieren und die dann abarbeiten und „abhaken“. Was sicher nicht verkehrt ist, dass ist ab und an zu schauen wann man wie lange wirklich etwas konzentriert übt und wann man eher mehr spielt und/oder rumdaddelt.

Da reicht aber doch der Blick auf die Uhr, oder vielleicht ein Timer. Wobei ich dazu rate eher darauf zu achten, ab wann man anfängt zu huddeln. Dann lieber stoppen oder eine Pause machen.

Aber wenn man einfach mal Spaß an so einem Programm hat und sich aus Interesse damit etwas beschäftigen möchte, warum nicht?
 
  • Gefällt mir
Reaktionen: 1 Benutzer
Wäre es nicht hilfreicher zu protokollieren, was Du geübt hast und ob bzw. welche Fortschritte Du dabei erzielst?
Ich persönlich würde den Schwerpunkt bei einem Übe-Tool für mich auch woanders sehen (wie ja oben schon erwähnt). Aber:

ich suche schon seit längerem eine Möglichkeit, meine Übungszeit (E-Gitarre) zu protokollieren.

Perkeo hat sich also genau das gebaut, was er für sich selbst haben wollte :)
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: 1 Benutzer
Erstens finde ich das auch umständlich, zweitens gibt es viele Fehlerquellen und drittens, was bringt einem das Ganze? Glaubt hier wirklich jemand, dass man durch Absolvieren von Zeit spieltechnisch irgend etwas lernt? Allein schon die Zeit für die Befassung mit dem Thema hätte man besser in Üben investieren können :rofl:
 
  • Gefällt mir
Reaktionen: 2 Benutzer
Hallo Leute,

ich muss jetzt doch mal etwas loswerden…. Wenn ich ein Thema erstelle mit diesem Titel „Tool zur Protokollierung der Übungszeit“ UND darüber hinaus schreibe, dass ich es mit ChatGTP erstelle UND den Quelltext dazu einstelle UND die Fories hier dazu einlade, es auszuprobieren oder selbst damit zu spielen, basteln oder es zu erweitern, DANN heisst das NICHT, dass ich mir nicht auch über den Inhalt, Ablauf, Qualität des Übens so meine Gedanken mache. Nein, denn sonst hätte ich ein anderes Thema gewählt und auch geschrieben wie etwas „Wie Übungszeit sinnvoll nutzen“ o.ä.

Einzig der User jazzundso scheint das verstanden zu haben und mir super Verbesserungs-/ Ergänzungsvorschläge gemacht. Danke dafür!

Ich formuliere hier meine Themen/Fragen schon überlegt und die Flut an Off-Topic Antworten verderben mir leider etwas die Freude an diesem Forum. Genauso neulich, als ich explizit fragte, welches Schaller Tremolo denn in meine PRS Gitarre passen würde und ich antworten bekam, wie „wozu tauschen, bring sie zum Händler zurück“ o.ä. Alles schön und gut, aber dann hätte ich gefragt, was ich mit dem nicht stimmstabilen Tremolo machen soll. Hab ich aber nicht, sondern genau nach dem passenden Schaller-Tremolo gefragt.

Also hier geht es mir tatsächlich nur um einen Weg, ÜbungsZEIT zu erfassen, möglichst automatisiert (deshalb mein gewählter Weg über die Schnittstelle Soundeingabe), ohne Stopuhr, Zettelwirtschaft, Excel Tabelle oder protokollierende Ehefrau.

Das Ganze hat nicht zuletzt auch den Hintergrund, dass ich aufgrund meiner Glasknochen meine Übungszeit begrenzen MUSS damit nicht das passiert, was vor ein paar Tagen wieder passiert ist, Rippenbruch wohl wegen Überlastung. Ich neige nämlich dazu, zu lange zu spielen und nicht aufzuhören, wenn es dringend angesagt wäre. Konntet ihr nicht wissen und ich wollt’s nicht dazu schreiben, ok.

Nicht zuletzt aber finde ich, dass Übungszeit automatisch auch einen Übungsfortschritt bedingt, zumindest wenn man sich an der Qualität des Spielens orientiert und das regelmässig macht. Es ist schon recht schwierig, mehrere Stunden täglich zu üben und dabei KEINEN Fortschritt zu erzielen, Aber auch das wäre wieder ein anderes Thema, dass wir ja gern an anderer Stelle besprechen könnten.

Hier ging es mir ausschließlich um die Erfassung der Zeit und um nichts anderes.

lg Perkeo
 
  • Gefällt mir
  • Interessant
Reaktionen: 6 Benutzer
Hallo @Perkeo ,

Zunächstmal tut es mir Leid, wenn du gesundheitlich stark angeschlagen bist.
Auf der Basis ist es natürlich nachvollziehbar, was du damit bezwecken willst.
Ich denke mal, die meisten hier werden das genau wie ich auch so verstanden haben, dass du ohne so ein Hilfsmittel zu wenig übst, und entsprechend reagiert.

Wenn dir solche Programmierungen Spaß machen, ist das auch alles ok.
Trotzdem frage ich mich immer noch, auch unter dem neuen Aspekt, was dir die Zeiterfassung bringt.
Ist es bei dir nicht eher so, dass du die Intensität deines Übens viel mehr kontrollieren müsstest als die Zeit?
Sind nicht kurze, körperlich anstrengende Intervalle bei dir kritischer als sanftes Spielen über längere Zeit?

Gruß
Tom
 
Ist es bei dir nicht eher so, dass du die Intensität deines Übens viel mehr kontrollieren müsstest als die Zeit?
Sind nicht kurze, körperlich anstrengende Intervalle bei dir kritischer als sanftes Spielen über längere Zeit?
Das bleibt sich in etwa gleich, die eigentliche Belastung ist das Sitzen, weil ich ne starke Skoliose habe und das eben auf die Muskulatur geht, die wiederum mit den Rippen verbunden ist. Auch sind die tiefen Lagen viel anstrengender, als die hohen.

Aber natürlich ging's mir auch um den Spaß an der Sache, sowas zu basteln. Hab ich so noch nirgendwo gefunden und (ich weiß, Eigenlob stinkt) die Idee, den Timer mit der Soundeingabe zu verbinden find ich schon ziemlich genial ;)

lg Perkeo
 
  • Gefällt mir
Reaktionen: 1 Benutzer
Birgt aber auch Selbstbetrugspotenzial :unsure:
Wenn du hergehst und abwechselnd 1 Minute spielst, dann 4 Min. Pause machst, wieder 1 Min. spielst und 4 Min. Pause, läuft deine Übungsstunde ab, du hast aber nur 12 Min. gespielt:rolleyes:
 
Birgt aber auch Selbstbetrugspotenzial :unsure:
Wenn du hergehst und abwechselnd 1 Minute spielst, dann 4 Min. Pause machst, wieder 1 Min. spielst und 4 Min. Pause, läuft deine Übungsstunde ab, du hast aber nur 12 Min. gespielt:rolleyes:
Warum sollte ich das tun? Entweder spiele ich, oder ich stell die Gitarre in den Ständer. Ausserdem lässt sich die Pausezeit natürlich einstellen, z.B. 2 Min.
 
  • Gefällt mir
Reaktionen: 1 Benutzer
Ja ich weiß. Du willst ja auch üben. Wahrscheinlich mehr als dir gut tut. Die kurze Pausenzeit wär dann eher wichtig für die. die zu wenig üben
 

Unser weiteres Online-Angebot:
Bassic.de · Deejayforum.de · Sequencer.de · Clavio.de · Guitarworld.de · Recording.de

Musiker-Board Logo
Zurück
Oben