{"id":8563,"date":"2019-03-26T09:58:33","date_gmt":"2019-03-26T16:58:33","guid":{"rendered":"https:\/\/www.pianogenius.com\/members\/training\/module50\/dup-song-detective-one-step-ahead-listen\/"},"modified":"2020-10-02T15:45:15","modified_gmt":"2020-10-02T22:45:15","slug":"50-11","status":"publish","type":"page","link":"https:\/\/www.pianogenius.com\/members\/training\/module50\/50-11\/","title":{"rendered":"Song Detective: &#8220;If I Told You&#8221; (Song Structure)"},"content":{"rendered":"<p>To see the full listing of what&#8217;s in this Module\u00a0<a href=\"https:\/\/www.pianogenius.com\/members\/training\/module50\/\">click here<\/a> for an overview.<\/p>\n<div align=\"center\">\n<\/p>\n<div id=\"vloop-media\" class=\"vloop\" data-aspect=\"4-3\">\n    <div class=\"vloop-wrapper\"\n         id=\"vloop-wrap-vlp_69d7b09add9cf\"\n         data-native-width=\"864\"\n         data-native-height=\"600\"\n         data-has-controls=\"true\">\n\n        <div class=\"vloop-container\"\n             id=\"vloop-container-vlp_69d7b09add9cf\"\n             style=\"position: relative; width: 100%; max-width: 864px; aspect-ratio: 864 \/ 600;\">\n\n            <iframe id=\"vimeo-player-vlp_69d7b09add9cf\"\n                src=\"https:\/\/player.vimeo.com\/video\/1062595442?badge=0&autopause=0&player_id=0&app_id=58479\"\n                frameborder=\"0\"\n                allow=\"autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media\"\n                style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\"\n                title=\"PianoGenius\">\n            <\/iframe>\n        <\/div>\n\n                <div id=\"loop-controls-vlp_69d7b09add9cf\" class=\"loop-controls\" style=\"width: 100%; margin-top: 8px; display: flex; justify-content: center;\">\n            <div class=\"loop-row\">\n                <button id=\"setA-vlp_69d7b09add9cf\" class=\"loop-btn setA\">Set A Point<\/button>\n                <span id=\"a-time-vlp_69d7b09add9cf\" class=\"loop-time\">--:--<\/span>\n                <span class=\"loop-dingbat\">&#8634;<\/span>\n                <span id=\"b-time-vlp_69d7b09add9cf\" class=\"loop-time\">--:--<\/span>\n                <button id=\"setB-vlp_69d7b09add9cf\" class=\"loop-btn setB\">Set B Point<\/button>\n                <button id=\"startLoop-vlp_69d7b09add9cf\" class=\"loop-btn startLoop\">&#9658; Run Loop<\/button>\n                <button id=\"stopLoop-vlp_69d7b09add9cf\" class=\"loop-btn stopLoop\">Remove Loop<\/button>\n                <select id=\"speedSelect-vlp_69d7b09add9cf\" class=\"speed-dropdown\">\n                    <option value=\"1\" selected>Speed \u25bc<\/option>\n                    <option value=\"0.5\">0.5x<\/option>\n                    <option value=\"0.75\">0.75x<\/option>\n                    <option value=\"1\">1x (Normal)<\/option>\n                    <option value=\"1.25\">1.25x<\/option>\n                    <option value=\"1.5\">1.5x<\/option>\n                    <option value=\"1.75\">1.75x<\/option>\n                    <option value=\"2\">2x<\/option>\n                <\/select>\n            <\/div>\n        <\/div>\n            <\/div>\n\n        <script>\n    \/\/ Load Vimeo API once\n    (function loadVimeo(){\n        if (window.Vimeo && window.Vimeo.Player) return;\n        var s = document.createElement('script');\n        s.src = \"https:\/\/player.vimeo.com\/api\/player.js\";\n        s.async = true;\n        document.head.appendChild(s);\n    })();\n    <\/script>\n\n    <script>\n    (function(uid){\n        function fitPlayerToViewport() {\n            var wrap = document.getElementById(\"vloop-wrap-\" + uid);\n            var container = document.getElementById(\"vloop-container-\" + uid);\n            var controls = document.getElementById(\"loop-controls-\" + uid);\n\n            if (!wrap || !container) return;\n\n            var nativeWidth = parseInt(wrap.getAttribute(\"data-native-width\"), 10);\n            var nativeHeight = parseInt(wrap.getAttribute(\"data-native-height\"), 10);\n\n            if (!nativeWidth || !nativeHeight) return;\n\n            var parent = wrap.parentElement;\n            if (!parent) return;\n\n            var parentWidth = parent.clientWidth;\n            if (!parentWidth || parentWidth < 1) {\n                parentWidth = window.innerWidth || document.documentElement.clientWidth || nativeWidth;\n            }\n\n            \/\/ Estimate total non-video vertical space that should remain visible.\n            \/\/ This includes controls, a little breathing room, and a larger safety margin\n            \/\/ so the controls remain visible on shorter screens and zoomed browsers.\n            var controlsHeight = controls ? controls.offsetHeight : 0;\n            var extraReserve = controls ? 96 : 20;\n\n            \/\/ Use visualViewport when available because it reflects browser zoom better.\n            var viewportHeight = (window.visualViewport && window.visualViewport.height)\n                ? window.visualViewport.height\n                : (window.innerHeight || document.documentElement.clientHeight || 900);\n\n            var availableVideoHeight = viewportHeight - controlsHeight - extraReserve;\n\n            \/\/ Prevent absurdly tiny calculations if something is temporarily off during layout\n            if (availableVideoHeight < 180) {\n                availableVideoHeight = 180;\n            }\n\n            var safeWidthFromHeight = Math.floor(availableVideoHeight * (nativeWidth \/ nativeHeight));\n\n            \/\/ Final width is limited by:\n            \/\/ 1) original shortcode width\n            \/\/ 2) available parent width\n            \/\/ 3) height-safe width so the full block fits on shorter screens \/ zoomed browsers\n            var finalWidth = Math.min(nativeWidth, parentWidth, safeWidthFromHeight);\n\n            if (finalWidth < 220) {\n                finalWidth = Math.min(nativeWidth, parentWidth);\n            }\n\n            container.style.maxWidth = finalWidth + \"px\";\n        }\n\n        function init() {\n            fitPlayerToViewport();\n\n            if (!(window.Vimeo && window.Vimeo.Player)) {\n                return setTimeout(init, 50);\n            }\n\n            var iframe = document.getElementById(\"vimeo-player-\" + uid);\n            if (!iframe) return;\n\n            var player;\n            try {\n                player = new Vimeo.Player(iframe);\n            } catch (e) {\n                return;\n            }\n\n            var setA            = document.getElementById(\"setA-\" + uid);\n            var setB            = document.getElementById(\"setB-\" + uid);\n            var startLoopButton = document.getElementById(\"startLoop-\" + uid);\n            var stopLoopButton  = document.getElementById(\"stopLoop-\" + uid);\n            var speedSelect     = document.getElementById(\"speedSelect-\" + uid);\n            var aTime           = document.getElementById(\"a-time-\" + uid);\n            var bTime           = document.getElementById(\"b-time-\" + uid);\n\n            \/\/ When controls are absent (noloop=\"true\"), do nothing\n            if (!(setA && setB && startLoopButton && stopLoopButton && speedSelect && aTime && bTime)) {\n                return;\n            }\n\n            var inPoint = null, outPoint = null, loopActive = false;\n\n            function formatTime(seconds) {\n                var minutes = Math.floor(seconds \/ 60);\n                var sec = Math.floor(seconds % 60);\n                return minutes + \":\" + (sec < 10 ? \"0\" + sec : sec);\n            }\n\n            setA.addEventListener(\"click\", function () {\n                player.getCurrentTime().then(function(time) {\n                    inPoint = time;\n                    aTime.textContent = formatTime(time);\n                });\n            });\n\n            setB.addEventListener(\"click\", function () {\n                player.getCurrentTime().then(function(time) {\n                    outPoint = time;\n                    bTime.textContent = formatTime(time);\n                });\n            });\n\n            startLoopButton.addEventListener(\"click\", function () {\n                if (inPoint !== null && outPoint !== null && inPoint < outPoint) {\n                    loopActive = !loopActive;\n                    if (loopActive) {\n                        startLoopButton.textContent = \"Pause Loop\";\n                        player.setCurrentTime(inPoint);\n                        player.play();\n                        player.off('timeupdate');\n                        player.on('timeupdate', function (data) {\n                            if (loopActive && data.seconds >= outPoint) {\n                                player.setCurrentTime(inPoint);\n                            }\n                        });\n                    } else {\n                        startLoopButton.textContent = \"Run Loop\";\n                    }\n                } else {\n                    alert(\"Set valid A and B points first.\");\n                }\n            });\n\n            stopLoopButton.addEventListener(\"click\", function () {\n                loopActive = false;\n                startLoopButton.textContent = \"Run Loop\";\n            });\n\n            speedSelect.addEventListener(\"change\", function () {\n                var selectedSpeed = parseFloat(this.value);\n                player.setPlaybackRate(selectedSpeed).catch(function(error) {\n                    console.error(\"Error setting playback speed:\", error);\n                });\n            });\n        }\n\n        var resizeTimer = null;\n        function handleResize() {\n            if (resizeTimer) {\n                clearTimeout(resizeTimer);\n            }\n            resizeTimer = setTimeout(function () {\n                fitPlayerToViewport();\n            }, 50);\n        }\n\n        if (document.readyState === 'loading') {\n            document.addEventListener('DOMContentLoaded', init);\n        } else {\n            init();\n        }\n\n        window.addEventListener('resize', handleResize);\n        window.addEventListener('orientationchange', handleResize);\n\n        if (window.visualViewport) {\n            window.visualViewport.addEventListener('resize', handleResize);\n        }\n\n    })('vlp_69d7b09add9cf');\n    <\/script>\n    \n    <style>\n    \/* Scope all styling under the plugin wrapper to avoid collisions *\/\n    .vloop-wrapper {\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        justify-content: flex-start;\n        width: 100%;\n        margin: 0 auto;\n        padding: 0;\n        box-sizing: border-box;\n    }\n\n    .vloop-wrapper .vloop-container {\n        position: relative;\n        width: 100%;\n        margin: 0 auto;\n        overflow: hidden;\n        box-sizing: content-box;\n    }\n\n    .vloop-wrapper iframe {\n        position: absolute;\n        top: 0;\n        left: 0;\n        width: 100%;\n        height: 100%;\n        border: 0;\n        display: block;\n    }\n\n    \/* 2px black border that does NOT reduce interior video area *\/\n    .vloop-wrapper .vloop-container::after {\n        content: \"\";\n        position: absolute;\n        top: 0; left: 0; right: 0; bottom: 0;\n        border: 2px solid #000;\n        pointer-events: none;\n    }\n\n    .vloop-wrapper .loop-controls {\n        width: 100%;\n        margin-top: 8px;\n        display: flex;\n        justify-content: center;\n    }\n\n    .vloop-wrapper .loop-row {\n        display: flex;\n        justify-content: center;\n        align-items: center;\n        gap: 10px;\n        flex-wrap: wrap;\n        width: 100%;\n    }\n\n    .vloop-wrapper .loop-btn,\n    .vloop-wrapper .speed-dropdown {\n        padding: 8px 12px !important;\n        border-radius: 5px !important;\n        border: none !important;\n        font-size: 14px !important;\n        cursor: pointer !important;\n    }\n\n    .vloop-wrapper .setA,\n    .vloop-wrapper .setB {\n        background: #468cc5 !important;\n        color: white !important;\n    }\n\n    .vloop-wrapper .startLoop {\n        background: #76be88 !important;\n        color: white !important;\n    }\n\n    .vloop-wrapper .stopLoop {\n        background: #ca6162 !important;\n        color: white !important;\n    }\n\n    .vloop-wrapper .loop-dingbat {\n        color: #468cc5 !important;\n        font-size: 18px !important;\n    }\n\n    .vloop-wrapper .speed-dropdown {\n        background-color: #f3ce72 !important;\n        color: black !important;\n    }\n\n    .vloop-wrapper .speed-dropdown option {\n        background-color: white !important;\n        color: black !important;\n    }\n\n    .vloop-wrapper .loop-time {\n        background-color: #e0e0e0 !important;\n        padding: 4px 8px !important;\n        border-radius: 4px !important;\n        display: inline-block !important;\n    }\n\n    @media (max-width: 640px) {\n        .vloop-wrapper .loop-row {\n            gap: 8px;\n        }\n\n        .vloop-wrapper .loop-btn,\n        .vloop-wrapper .speed-dropdown {\n            font-size: 13px !important;\n            padding: 7px 10px !important;\n        }\n    }\n    <\/style>\n\n    <\/div>\n\n<\/div>\n<i> <\/i>\n<strong>This video from the &#8220;Song Detective&#8221; Module is only available to non-members this week so be sure to watch it now.<\/strong><\/p>\n<p>This Module is fun, it teaches you how to identify the verse, chorus, b-section\/pre-chorus, and bridge parts of songs by first having you listen through and take your best guess, then see how you did.<\/p>\n<p>This is a song of mine that I sang and played all the parts on called &#8220;<em>If I Told You I Love You<\/em>&#8220;, and you can see the verse\/chorus etc. song parts display on the left side of the screen as the song plays. Being able to identify and break down songs like this is an important step towards being able to play songs quickly.<\/p>\n<p><br \/>\n\n<p><center><a title=\"Home\" href=\"https:\/\/www.pianogenius.com\/members\/training\/module50\/\"><img loading=\"lazy\" decoding=\"async\" style=\"border: 0px currentColor;\" src=\"https:\/\/www.pianogenius.com\/members\/wp-content\/uploads\/icon_home.png\" alt=\"Home\" width=\"68\" height=\"72\" \/><\/a><a title=\"Previous\" href=\"https:\/\/www.pianogenius.com\/members\/training\/module50\/50-10\/\"><img loading=\"lazy\" decoding=\"async\" style=\"border: 0px currentColor;\" src=\"https:\/\/www.pianogenius.com\/members\/wp-content\/uploads\/icon_previous.png\" alt=\"Previous\" width=\"94\" height=\"72\" \/><\/a><a title=\"Next\" href=\"https:\/\/www.pianogenius.com\/members\/training\/module50\/50-12\/\"><img loading=\"lazy\" decoding=\"async\" style=\"border: 0px currentColor;\" src=\"https:\/\/www.pianogenius.com\/members\/wp-content\/uploads\/icon_next.png\" alt=\"Next\" width=\"78\" height=\"72\" \/><\/a><\/center><\/p>\n<p style=\"text-align: center;\">\n","protected":false},"excerpt":{"rendered":"<p>To see the full listing of what&#8217;s in this Module\u00a0click here for an overview.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":8515,"menu_order":11,"comment_status":"open","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-8563","page","type-page","status-publish","hentry","wpautop"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.pianogenius.com\/members\/wp-json\/wp\/v2\/pages\/8563","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pianogenius.com\/members\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.pianogenius.com\/members\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.pianogenius.com\/members\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pianogenius.com\/members\/wp-json\/wp\/v2\/comments?post=8563"}],"version-history":[{"count":10,"href":"https:\/\/www.pianogenius.com\/members\/wp-json\/wp\/v2\/pages\/8563\/revisions"}],"predecessor-version":[{"id":9600,"href":"https:\/\/www.pianogenius.com\/members\/wp-json\/wp\/v2\/pages\/8563\/revisions\/9600"}],"up":[{"embeddable":true,"href":"https:\/\/www.pianogenius.com\/members\/wp-json\/wp\/v2\/pages\/8515"}],"wp:attachment":[{"href":"https:\/\/www.pianogenius.com\/members\/wp-json\/wp\/v2\/media?parent=8563"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}