From 46a379febad340a1f14ffb946ba2612dca86a6da Mon Sep 17 00:00:00 2001 From: Ben Date: Sun, 6 Apr 2025 22:05:16 +0100 Subject: [PATCH 1/2] prototype feature --- src/components/DroppedPattern.tsx | 135 ++++++++++++- src/components/IndividualNoteSection.tsx | 101 ++++++++++ src/components/LaneEditingPanel.tsx | 19 +- src/components/LanePatternDisplay.tsx | 39 ++-- src/components/PatternDropZone.tsx | 137 ++++++++++++- src/components/styles/homepage.css | 27 ++- src/scripts/Lane.ts | 246 ++++++++++++++++++++--- src/scripts/Note.ts | 4 +- src/scripts/Utils.ts | 8 +- src/scripts/main.ts | 96 ++++++--- 10 files changed, 713 insertions(+), 99 deletions(-) create mode 100644 src/components/IndividualNoteSection.tsx diff --git a/src/components/DroppedPattern.tsx b/src/components/DroppedPattern.tsx index c32d508..f516fe1 100644 --- a/src/components/DroppedPattern.tsx +++ b/src/components/DroppedPattern.tsx @@ -1,18 +1,141 @@ -import React from 'react' +import React, { ChangeEvent, useEffect, useRef, useState } from 'react' import Lane from '../scripts/Lane'; +import { supabase } from '../scripts/supa-client'; +import { retrieveBucketData } from '../scripts/main'; interface IDroppedPatternProps { lane: Lane; name: string; - measures: number; + occurances: number; + unmount: () => void; + setMessage: React.Dispatch>; + topPatternMeasureRef: React.RefObject; } -const DroppedPattern: React.FC = ({ name, measures }) => { + +const DroppedPattern: React.FC = ({ lane, name, occurances, unmount, setMessage, topPatternMeasureRef }) => { + let startMeasureRef = useRef(0); + const [startMeasure, setStartMeasure] = useState(0); + + let patternIndex = useRef(0); + + let currentOccurances = useRef(occurances); + const [occuranceState, setOccuranceState] = useState(currentOccurances.current); + + let dataRef = useRef(Object); + + const patternStartMeasureChange = (e: number) => { + // console.log('changed to ', e); + if(e <= startMeasureRef.current) { + console.log('pattern is gone'); + topPatternMeasureRef.current.splice(patternIndex.current, 1); + unmount(); + } + console.log(startMeasureRef.current - e); + } + + + const measureChange = (startMeasure: number, measureDifference: number) => { + console.log(`measure difference ${measureDifference}`); + + if(measureDifference < 0) { + if(startMeasure == startMeasureRef.current) { + currentOccurances.current += measureDifference; + setOccuranceState(currentOccurances.current); + console.log(currentOccurances); + + } else if(startMeasure < startMeasureRef.current) { + startMeasureRef.current = startMeasureRef.current + measureDifference; + setStartMeasure(startMeasureRef.current + 1); + } + } else if(startMeasure < startMeasureRef.current) { + startMeasureRef.current += measureDifference; + setStartMeasure(startMeasureRef.current + 1); + } + + topPatternMeasureRef.current[patternIndex.current] = [startMeasureRef.current, currentOccurances.current]; + } + + const onDeleteClick = () => { + lane.reducePatternOccuances(startMeasureRef.current, currentOccurances.current, 0); + topPatternMeasureRef.current.splice(patternIndex.current, 1); + unmount(); + + // .push([startMeasureRef.current, currentOccurances.current]); + } + + const onReloadClick = () => { + console.log(startMeasureRef.current); + lane.increasePatternOccurances(startMeasureRef.current, currentOccurances.current, currentOccurances.current, dataRef.current) + } + + const onOccuranceInputChange = (e: ChangeEvent) => { + let newOccurances = parseInt(e.target.value); + let code = 0; + + if(newOccurances < currentOccurances.current) { + lane.reducePatternOccuances(startMeasureRef.current, currentOccurances.current, newOccurances); + } else { + code = lane.increasePatternOccurances(startMeasureRef.current, currentOccurances.current, newOccurances, dataRef.current); + console.log(code); + } + + console.log('code ', code); + if(code == 0) { + currentOccurances.current = newOccurances; + setOccuranceState(currentOccurances.current); + + topPatternMeasureRef.current[patternIndex.current] = [startMeasureRef.current, currentOccurances.current]; + } else + e.target.value = currentOccurances.current.toString(); + } + + async function loadPattern() { + // TODO: Allow for local loading. + const userId = (await supabase.auth.getUser()).data.user?.id as string; + let patternData = await retrieveBucketData('patterns', `${userId}/${name}`); + dataRef.current = patternData; + + console.log(patternData); + if(lane.loadPattern(patternData, currentOccurances.current) == -1) { + setMessage('will overflow') + unmount(); + } + + } + + useEffect(() => { + loadPattern(); + lane.onPatternStartChange(patternStartMeasureChange); + lane.onPatternChange(measureChange); + + startMeasureRef.current = lane.patternStartMeasure; + setStartMeasure(startMeasureRef.current + 1); + + topPatternMeasureRef.current.push([startMeasureRef.current, currentOccurances.current]); + patternIndex.current = topPatternMeasureRef.current.length - 1; + + return () => { + console.log('unmounting') + lane.removePatternStartChange(patternStartMeasureChange); + lane.removeOnPatternChange(measureChange); + } + }, []); + return (
{name} - - - + + + + +
{`Measures ${startMeasure} - ${startMeasure + occuranceState - 1}`}
+ + { startMeasureRef.current > 0 && +
+
+
+
+ }
) } diff --git a/src/components/IndividualNoteSection.tsx b/src/components/IndividualNoteSection.tsx new file mode 100644 index 0000000..72e247a --- /dev/null +++ b/src/components/IndividualNoteSection.tsx @@ -0,0 +1,101 @@ +import React, { useEffect, useRef, useState } from 'react' +import Lane from '../scripts/Lane'; + +interface IndividualNoteSectionProps { + lane: Lane; + unmount: () => void; + setMessage: React.Dispatch>; + individualNotesSectionRef: React.RefObject; + index: number; +} + +const IndividualNoteSection: React.FC = ({ lane, setMessage, unmount, individualNotesSectionRef, index }) => { + + + let startMeasureRef = useRef(0); + const [startMeasure, setStartMeasure] = useState(0); + const [endMeasure, setEndMeasure] = useState(0); + + let statsRef = useRef([]); + + const patternStartMeasureChange = (e: number) => { + // console.log('changed to ', e); + if(e <= startMeasureRef.current) { + console.log('pattern is gone'); + + let currentIndex = individualNotesSectionRef.current.indexOf(statsRef.current); + individualNotesSectionRef.current.splice(currentIndex, 1); + unmount(); + } + console.log(startMeasureRef.current - e); + } + + const measureChange = (startMeasure: number, measureDifference: number) => { + console.debug('measureChange from notes', startMeasure, measureDifference); + + if(measureDifference < 0 && startMeasure < startMeasureRef.current) { + + startMeasureRef.current = startMeasureRef.current + measureDifference; + statsRef.current[0] = startMeasureRef.current; + + // individualNotesSectionRef.current[index][0] = startMeasureRef.current; + + + setStartMeasure(startMeasureRef.current + 1); + setEndMeasure(startMeasureRef.current + statsRef.current[1]); + + + } else if(startMeasure < startMeasureRef.current) { + console.log('in here', startMeasureRef.current) + + startMeasureRef.current += measureDifference; + statsRef.current[0] = startMeasureRef.current; + + console.log('in here', startMeasureRef.current) + setStartMeasure(startMeasureRef.current + 1); + setEndMeasure(startMeasureRef.current + statsRef.current[1]); + } + + console.debug('measureChange from notes after', statsRef.current); + + } + + const onDeleteClick = () => { + console.log(`index ${index}`); + console.log('from delete click', statsRef.current, statsRef.current[1]); + lane.reducePatternOccuances(startMeasureRef.current, statsRef.current[1], 0); + + let currentIndex = individualNotesSectionRef.current.indexOf(statsRef.current); + individualNotesSectionRef.current.splice(currentIndex, 1); + unmount(); + + } + + useEffect(() => { + lane.onPatternChange(measureChange); + lane.onPatternStartChange(patternStartMeasureChange); + + statsRef.current = individualNotesSectionRef.current[index]; + + + startMeasureRef.current = statsRef.current[0]; + setStartMeasure(startMeasureRef.current + 1); + + console.log(statsRef.current); + + setEndMeasure(statsRef.current[0] + statsRef.current[1]); + + console.log(individualNotesSectionRef.current); + }, []); + + return ( +
+ +
IndividualNoteSection
+
{`Measures ${startMeasure} - ${endMeasure}`}
+ + +
) +} + +export default IndividualNoteSection \ No newline at end of file diff --git a/src/components/LaneEditingPanel.tsx b/src/components/LaneEditingPanel.tsx index 44063bc..394b2d5 100644 --- a/src/components/LaneEditingPanel.tsx +++ b/src/components/LaneEditingPanel.tsx @@ -104,7 +104,7 @@ const LaneEditingPanel: React.FC = ({ canvas }) => { return; // TODO: Keep next measure index updated while adding notes in individual mode so this isn't necessary - lane.notes = []; + // lane.notes = []; setEditMode('pattern'); changeEditMode(EDIT_MODES.PATTERN_MODE); @@ -147,7 +147,10 @@ const LaneEditingPanel: React.FC = ({ canvas }) => { lane.measureCount = newMC; event.target.value = newMC.toString(); - lane.patternStartMeasure = 0; + // lane.patternStartMeasure = 0; + + if(newMC - 1 < lane.patternStartMeasure) + lane.setPatternStartMeasure(newMC); lane.recalculateHeight(); lane.cullOutOfBoundsNotes(); @@ -171,13 +174,14 @@ const LaneEditingPanel: React.FC = ({ canvas }) => { } setCanRepeat(lane.getRatio() < longest_lane.getRatio()); + saveCurrentSessionLocally(); drawSingleLane(lane); } const onRepeatClick = () => { if(!repeated) { - if(lane.notes.length > 0) - lane.repeatNotes(); + // if(lane.notes.length > 0) + lane.repeatNotes(); } else { // Lane has already been repeated. Toggle repeating off lane.unrepeatNotes(); @@ -362,6 +366,8 @@ const LaneEditingPanel: React.FC = ({ canvas }) => { let newValue = parseInt(event.target.value); lane.subdivision = newValue; lane.notes = []; + // lane.patternStartMeasure = 0; + lane.setPatternStartMeasure(0); lane.translationAmount = 0; // TODO: Review this lane.recalculateNoteGap(); @@ -379,6 +385,7 @@ const LaneEditingPanel: React.FC = ({ canvas }) => { + @@ -461,10 +468,12 @@ const LaneEditingPanel: React.FC = ({ canvas }) => { resetPatternInCreation(); } else { lane.notes = []; - lane.patternStartMeasure = 0; + // lane.patternStartMeasure = 0; + lane.setPatternStartMeasure(0); } lane.translationAmount = 0; drawSingleLane(lane); + saveCurrentSessionLocally(); }}>clear notes + +
{`Measures ${startMeasure} - ${startMeasure + occuranceState - 1}`}
+ {/*
{`Measures ${startMeasure} - ${startMeasure + occuranceState - 1}`}
*/} { startMeasureRef.current > 0 &&
diff --git a/src/components/IndividualNoteSection.tsx b/src/components/IndividualNoteSection.tsx index 72e247a..2945c18 100644 --- a/src/components/IndividualNoteSection.tsx +++ b/src/components/IndividualNoteSection.tsx @@ -1,100 +1,119 @@ import React, { useEffect, useRef, useState } from 'react' import Lane from '../scripts/Lane'; +import { PatternModeSection } from '../scripts/types'; interface IndividualNoteSectionProps { + id: string; lane: Lane; - unmount: () => void; + start: number; + occurances: number; setMessage: React.Dispatch>; - individualNotesSectionRef: React.RefObject; - index: number; -} -const IndividualNoteSection: React.FC = ({ lane, setMessage, unmount, individualNotesSectionRef, index }) => { - + setIndividualNoteSections: React.Dispatch>; + individualNoteSectionsRef: React.RefObject; +} - let startMeasureRef = useRef(0); - const [startMeasure, setStartMeasure] = useState(0); - const [endMeasure, setEndMeasure] = useState(0); +const IndividualNoteSection: React.FC = ({ lane, setMessage, start, occurances, id, setIndividualNoteSections, individualNoteSectionsRef}) => { + let startMeasureRef = useRef(start); + const [startMeasure, setStartMeasure] = useState(startMeasureRef.current + 1); + + let currentOccurances = useRef(occurances); + const [occuranceState, setOccuranceState] = useState(currentOccurances.current); + + const removePattern = () => { + setIndividualNoteSections(prev => { + const updated = prev.filter(pattern => pattern.id !== id); + individualNoteSectionsRef.current = updated; + console.debug(updated); + return updated; + }); + }; + + const updatePattern = (updatedData: Partial<{ start: number; length: number }>) => { + setIndividualNoteSections(prev => { + const updated = prev.map(pattern => + pattern.id === id ? { ...pattern, ...updatedData } : pattern + ) + individualNoteSectionsRef.current = updated; + return updated; + } + );}; - let statsRef = useRef([]); const patternStartMeasureChange = (e: number) => { - // console.log('changed to ', e); if(e <= startMeasureRef.current) { console.log('pattern is gone'); - - let currentIndex = individualNotesSectionRef.current.indexOf(statsRef.current); - individualNotesSectionRef.current.splice(currentIndex, 1); - unmount(); + removePattern(); } - console.log(startMeasureRef.current - e); } const measureChange = (startMeasure: number, measureDifference: number) => { - console.debug('measureChange from notes', startMeasure, measureDifference); + console.log(`measure difference ${measureDifference}`); + + if(measureDifference < 0) { + if(startMeasure == startMeasureRef.current) { + currentOccurances.current += measureDifference; + setOccuranceState(currentOccurances.current); + console.log(currentOccurances); + + } else if(startMeasure < startMeasureRef.current) { + startMeasureRef.current = startMeasureRef.current + measureDifference; + setStartMeasure(startMeasureRef.current + 1); + } + } else if(startMeasure < startMeasureRef.current) { + startMeasureRef.current += measureDifference; + setStartMeasure(startMeasureRef.current + 1); + } - if(measureDifference < 0 && startMeasure < startMeasureRef.current) { + updatePattern({start: startMeasureRef.current, length: currentOccurances.current}); + console.debug(id, startMeasureRef.current, currentOccurances.current); + + // console.debug('measureChange from notes', startMeasure, measureDifference); + + // if(measureDifference < 0 && startMeasure < startMeasureRef.current) { - startMeasureRef.current = startMeasureRef.current + measureDifference; - statsRef.current[0] = startMeasureRef.current; + // startMeasureRef.current = startMeasureRef.current + measureDifference; + // statsRef.current[0] = startMeasureRef.current; - // individualNotesSectionRef.current[index][0] = startMeasureRef.current; + // // individualNotesSectionRef.current[index][0] = startMeasureRef.current; - setStartMeasure(startMeasureRef.current + 1); - setEndMeasure(startMeasureRef.current + statsRef.current[1]); + // setStartMeasure(startMeasureRef.current + 1); + // setEndMeasure(startMeasureRef.current + statsRef.current[1]); - } else if(startMeasure < startMeasureRef.current) { - console.log('in here', startMeasureRef.current) + // } else if(startMeasure < startMeasureRef.current) { + // console.log('in here', startMeasureRef.current) - startMeasureRef.current += measureDifference; - statsRef.current[0] = startMeasureRef.current; + // startMeasureRef.current += measureDifference; + // statsRef.current[0] = startMeasureRef.current; - console.log('in here', startMeasureRef.current) - setStartMeasure(startMeasureRef.current + 1); - setEndMeasure(startMeasureRef.current + statsRef.current[1]); - } + // console.log('in here', startMeasureRef.current) + // setStartMeasure(startMeasureRef.current + 1); + // setEndMeasure(startMeasureRef.current + statsRef.current[1]); + // } - console.debug('measureChange from notes after', statsRef.current); + // console.debug('measureChange from notes after', statsRef.current); } const onDeleteClick = () => { - console.log(`index ${index}`); - console.log('from delete click', statsRef.current, statsRef.current[1]); - lane.reducePatternOccuances(startMeasureRef.current, statsRef.current[1], 0); - - let currentIndex = individualNotesSectionRef.current.indexOf(statsRef.current); - individualNotesSectionRef.current.splice(currentIndex, 1); - unmount(); - + console.debug(id, startMeasureRef.current, currentOccurances.current); + removePattern(); + lane.reducePatternOccuances(startMeasureRef.current, currentOccurances.current, 0); } useEffect(() => { + console.debug(id); lane.onPatternChange(measureChange); lane.onPatternStartChange(patternStartMeasureChange); - - statsRef.current = individualNotesSectionRef.current[index]; - - - startMeasureRef.current = statsRef.current[0]; - setStartMeasure(startMeasureRef.current + 1); - - console.log(statsRef.current); - - setEndMeasure(statsRef.current[0] + statsRef.current[1]); - - console.log(individualNotesSectionRef.current); }, []); return (
-
IndividualNoteSection
-
{`Measures ${startMeasure} - ${endMeasure}`}
+
{`Measures ${startMeasure} - ${startMeasure + occuranceState - 1}`}
-
) } diff --git a/src/components/LanePatternDisplay.tsx b/src/components/LanePatternDisplay.tsx index bf1e2fe..b7c2211 100644 --- a/src/components/LanePatternDisplay.tsx +++ b/src/components/LanePatternDisplay.tsx @@ -1,26 +1,99 @@ -import React, { useEffect, useState } from 'react' +import React, { useEffect, useRef, useState } from 'react' import Lane from '../scripts/Lane'; import { createPortal } from 'react-dom'; import PatternDropZone from './PatternDropZone'; import IndividualNoteSection from './IndividualNoteSection'; +import { PatternModeSection } from '../scripts/types'; +import DroppedPattern from './DroppedPattern'; interface ILanePatternDisplayProps { lane: Lane; visible: boolean; } -const LanePatternDisplay: React.FC = ({ lane, visible }) => { - const onPatternStartMeasureChange = (e: number) => { +const LanePatternDisplay: React.FC = ({ lane, visible }) => { + const updatePattern = (updatedData: Partial<{ start: number; length: number }>, id: string) => { + setIndividualNoteSections(prev => { + const updated = prev.map(pattern => + pattern.id === id ? { ...pattern, ...updatedData } : pattern + ) + individualNoteSectionsRef.current = updated; + return updated; + } + );}; - } - const [canvasWidth, setCanvasWidth] = useState(0); const [message, setMessage] = useState(''); + const [droppedPatterns, setDroppedPatterns] = useState([]); + let droppedPatternsRef = useRef([]); + + const [individualNoteSections, setIndividualNoteSections] = useState([]); + let individualNoteSectionsRef = useRef([]); + + const patternStartMeasureChange = (e: number) => { + setTimeout(() => { + if(droppedPatternsRef.current.length > 0) { + // Patterns are poulated + // console.debug(droppedPatternsRef.current[0]); + let topPattern = droppedPatternsRef.current[0]; + console.debug(topPattern); + if(lane.patternStartMeasure > topPattern.start + topPattern.length) { + // Individually placed notes exist above the top pattern + let patternID = crypto.randomUUID(); + let pattern = { + id: patternID, + start: topPattern.start + topPattern.length, + length: e - (topPattern.start + topPattern.length) + } + // console.debug(pattern); + + if(individualNoteSectionsRef.current.length > 0) { + let top = individualNoteSectionsRef.current[0]; + if(top.start == pattern.start) { + updatePattern(pattern, top.id); + } else { + setIndividualNoteSections(prev => { + const updated = [pattern, ...prev]; + individualNoteSectionsRef.current = updated; + return updated; + }); + } + } else { + setIndividualNoteSections(prev => { + const updated = [pattern, ...prev]; + individualNoteSectionsRef.current = updated; + return updated; + }); + } + } + } else if(lane.patternStartMeasure > 0) { + // No patterns exist and notes are already present + let patternID = crypto.randomUUID(); + let pattern = { + id: patternID, + start: 0, + length: lane.patternStartMeasure, + } + + if(individualNoteSectionsRef.current.length > 0) { + let id = individualNoteSectionsRef.current[0].id; + updatePattern(pattern, id); + } else { + setIndividualNoteSections(prev => { + const updated = [pattern, ...prev]; + individualNoteSectionsRef.current = updated; + return updated; + }); + } + } + }, 0) + } + let canvas = lane.canvas; useEffect(() => { - lane.onPatternStartChange(onPatternStartMeasureChange); + lane.onPatternStartChange(patternStartMeasureChange); const observer = new ResizeObserver((entries) => { for (let entry of entries) { const width = entry.contentRect.width; @@ -39,12 +112,46 @@ const LanePatternDisplay: React.FC = ({ lane, visible
{ message && message } - + - + {[...individualNoteSections, ...droppedPatterns] + .sort((a, b) => b.start - a.start) + .map((pattern, i) => { + if(pattern.name != undefined) { + return ( + ) + } else { + return ( + ) + } + } + )}
-
, canvas.closest('.canvas_container')! ); diff --git a/src/components/PatternDropZone.tsx b/src/components/PatternDropZone.tsx index 3f94eb0..642d2d4 100644 --- a/src/components/PatternDropZone.tsx +++ b/src/components/PatternDropZone.tsx @@ -3,14 +3,25 @@ import Lane from '../scripts/Lane'; import { createRoot } from 'react-dom/client'; import DroppedPattern from './DroppedPattern'; import IndividualNoteSection from './IndividualNoteSection'; +import { PatternModeSection } from '../scripts/types'; +import { supabase } from '../scripts/supa-client'; +import { retrieveBucketData } from '../scripts/main'; interface IPatternDropZoneProps { lane: Lane; setMessage: React.Dispatch>; + + droppedPatterns: PatternModeSection[]; + setDroppedPatterns: React.Dispatch>; + + droppedPatternsRef: React.RefObject; } + + // TODO: Allow for clicking pattern to drop them herer too -const PatternDropZone: React.FC = ({ lane, setMessage }) => { +const PatternDropZone: React.FC += ({ lane, setMessage, droppedPatterns, setDroppedPatterns, droppedPatternsRef }) => { let topPatternMeasureRef = useRef([]); let individualNotesSectionRef = useRef([]); @@ -19,6 +30,43 @@ const PatternDropZone: React.FC = ({ lane, setMessage }) let containerRef = useRef(null); + let patternID = crypto.randomUUID(); + + const updatePattern = (id: string, updatedData: Partial<{ start: number; length: number }>) => { + setDroppedPatterns(prev => { + const updated = prev.map(pattern => + pattern.id === id ? { ...pattern, ...updatedData } : pattern + ) + droppedPatternsRef.current = updated; + return updated; + } + );}; + + + + + async function loadPattern(occurances: number, patternName: string) { + // TODO: Allow for local loading. + let pattern = {id: patternID, start: lane.patternStartMeasure, length: occurances, name: patternName, data: null} + + const userId = (await supabase.auth.getUser()).data.user?.id as string; + let patternData = await retrieveBucketData('patterns', `${userId}/${patternName}`); + + console.log(patternData); + pattern.data = patternData; + + setDroppedPatterns(prev => { + const updated = [pattern, ...prev]; + droppedPatternsRef.current = updated; + return updated; + }); + + if(lane.loadPattern(patternData, occurances) == -1) { + setMessage('will overflow') + // unmount(); + } + } + const patternStartMeasureChange = (e: number) => { setTimeout(() => { // console.log('changed to ', e); @@ -26,12 +74,12 @@ const PatternDropZone: React.FC = ({ lane, setMessage }) // console.log(topPatternMeasureRef.current[topPatternMeasureRef.current.length - 1]) let topPattern = topPatternMeasureRef.current[topPatternMeasureRef.current.length - 1]; - console.debug(topPatternMeasureRef.current); + // console.debug(topPatternMeasureRef.current); for(let i = 0; i < topPatternMeasureRef.current.length; i++) { let pattern = topPatternMeasureRef.current[i]; - console.debug(pattern); + // console.debug(pattern); if(i == 0 && pattern[0] != 0) { console.log('there be notes before first pattern'); console.log() @@ -60,10 +108,10 @@ const PatternDropZone: React.FC = ({ lane, setMessage }) individualSection?.remove(); } - root.render() + // root.render() - containerRef.current?.appendChild(individualSection); - console.debug('pushing individual notes bit ', sectionInfo); + // containerRef.current?.appendChild(individualSection); + // console.debug('pushing individual notes bit ', sectionInfo); } console.log(individualNotesSectionRef.current); @@ -95,10 +143,10 @@ const PatternDropZone: React.FC = ({ lane, setMessage }) individualSection?.remove(); } - root.render() + // root.render() - containerRef.current?.insertBefore(individualSection, containerRef.current?.childNodes[1]); - console.debug('pushing individual notes bit ', sectionInfo); + // containerRef.current?.insertBefore(individualSection, containerRef.current?.childNodes[1]); + // console.debug('pushing individual notes bit ', sectionInfo); } } @@ -154,13 +202,23 @@ const PatternDropZone: React.FC = ({ lane, setMessage }) droppedPattern?.remove(); } - root.render(); + // root.render(); + + loadPattern(data.measures, data.name); + + + + // updatePattern(patternID, {start: 100, length: 100}); // container?.prepend(droppedPattern); - container?.insertBefore(droppedPattern, container.childNodes[1]); + // container?.insertBefore(droppedPattern, container.childNodes[1]); + + + + }}>

Next pattern from measure ({startMeasure + 1}) diff --git a/src/components/styles/homepage.css b/src/components/styles/homepage.css index a6dff82..b326f61 100644 --- a/src/components/styles/homepage.css +++ b/src/components/styles/homepage.css @@ -227,7 +227,7 @@ body { border-radius: 15px; - width: 100%; + width: 50%; /* height: 10vh; */ min-height: 7vh; diff --git a/src/scripts/Lane.ts b/src/scripts/Lane.ts index ec03b23..1b1551f 100644 --- a/src/scripts/Lane.ts +++ b/src/scripts/Lane.ts @@ -472,7 +472,6 @@ export default class Lane { } public loadPattern(selectedPattern: selectedPattern, measures: number, startMeasure?: number, spliceIndex?: number, difference?: number) { - if(startMeasure == undefined && this.patternStartMeasure + (measures * selectedPattern.measures) > this.measureCount) { console.error("Loading this pattern will exceed the lane's measure limit", measures, selectedPattern.measures, this.measureCount); return -1; @@ -683,7 +682,7 @@ export default class Lane { continue; } } - console.log('before load ', this.notes[0], newOccurnaces, startMeasure, spliceIndex) + console.log('before load ', patternData, this.notes[0], newOccurnaces, startMeasure, spliceIndex) this.loadPattern(patternData, newOccurnaces, startMeasure, spliceIndex, measureDifference); console.log('loaded returning 0'); diff --git a/src/scripts/types.ts b/src/scripts/types.ts index 2d40561..c4f6923 100644 --- a/src/scripts/types.ts +++ b/src/scripts/types.ts @@ -30,4 +30,6 @@ export type LoadedLanePreview = { numberOfLanes: number; timeSignatures: number[][]; // difficulty: number; -} \ No newline at end of file +} + +export type PatternModeSection = { id: string; start: number; length: number, name?: string, data?: any};