{"version":3,"sources":["assets/pulkkis_sm.png","assets/contact.jpg","App.js","reportWebVitals.js","index.js"],"names":["restAddr","doCard","title","description","photo","cardWidth","cardHeight","keywords","year","tags","map","key","doWidth","duration","App","useState","works","setWorks","favorites","setFavorites","modalShow","setModalShow","workInfo","setWorkInfo","search","setSearch","page","setPage","grouping","setGrouping","cardsFromWorks","listOfWorks","allWorks","work","push","itemId","id","html","short_description","metaData","type","height","width","useEffect","axios","get","then","response","sortedWorks","data","sort","a","b","options","galleryLayout","collageDensity","itemBorderWidth","itemBorderRadius","gallerySizeType","overlayBackground","container","window","innerWidth","innerHeight","MyVerticallyCenteredModal","props","instrumentation","imageSource","audioSource","pdfSource","Modal","size","centered","Body","reduce","accumulator","currentValue","long_description","href","target","rel","className","Button","variant","src","controls","style","objectFit","alt","Footer","onClick","onHide","filterWorks","selectedPage","eventsListener","eventName","eventData","clickedWork","find","el","scrollingElement","createGallery","items","yearGrouping","y","color","filter","wrk","genreGrouping","includes","lengthGrouping","favGrouping","length","searchPattern","RegExp","term","join","match","JSON","stringify","toString","backgroundColor","Jumbotron","class","role","ButtonToolbar","ButtonGroup","OverlayTrigger","overlay","Tooltip","placeholder","onChange","e","value","split","pulkkis_sm","padding","contact","show","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","StrictMode","document","getElementById"],"mappings":"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","file":"static/js/main.e5983a78.chunk.js","sourcesContent":["export default __webpack_public_path__ + \"static/media/pulkkis_sm.b6a7165b.png\";","export default __webpack_public_path__ + \"static/media/contact.b2278b9f.jpg\";","import React, { useState, useEffect } from 'react'\nimport axios from 'axios'\nimport { Button, ButtonToolbar, ButtonGroup, OverlayTrigger, Jumbotron, Modal, Tooltip } from 'react-bootstrap';\n// import BackgroundSlideshow from 'react-background-slideshow'\nimport 'bootstrap/dist/css/bootstrap.min.css';\nimport { ProGallery } from 'pro-gallery';\nimport 'pro-gallery/dist/statics/main.css';\nimport './assets/add.css'\nimport pulkkis_sm from './assets/pulkkis_sm.png'\nimport contact from './assets/contact.jpg'\n\n// const restAddr = 'http://127.0.0.1:5000'\nconst restAddr = 'https://rest.score-tool.com'\n// import image1 from '.\\\\assets\\\\Pulkkis.jpg'\n// import image2 from '.\\\\assets\\\\Pulkkis2020.jpg' \n\n\nfunction doCard(title, description, photo, cardWidth, cardHeight, keywords, year){\n let tags = ''\n if(typeof(keywords) !== \"undefined\"){\n keywords.map(key=>tags+=''+key+'')\n }\n return '
'+\n '

'+title+'

'+\n '

'+year+'

'+\n ''+\n '\"Card'+\n '
'+\n '

'+description+'

'+\n '
'+\n '
'\n// ' Score and info '+\n}\n\nfunction doWidth(duration){\n if (duration<50){\n return 100+duration\n } else {\n return 150+duration\n }\n}\n\nfunction App() {\n\n const [works, setWorks] = useState([])\n const [favorites, setFavorites] = useState([])\n const [modalShow, setModalShow] = useState(false);\n const [workInfo, setWorkInfo] = useState({});\n const [search, setSearch] = useState([])\n const [page, setPage] = useState('works')\n const [grouping, setGrouping] = useState('off')\n \n\n useEffect(() => {\n // console.log('effect')\n axios\n .get(restAddr+'/works')\n .then(response => {\n // console.log('promise fulfilled')\n const sortedWorks = response.data.works.sort(function (a, b) {\n return b.year-a.year;\n });\n setFavorites(response.data.favorites)\n setWorks(sortedWorks)\n })\n }, [])\n // console.log('render', works.length, 'works')\n // console.log(works)\n // ...\n\n function cardsFromWorks(listOfWorks){\n let allWorks = [];\n listOfWorks.map(work => allWorks.push(\n { // Add work as card\n itemId: work.id,\n //mediaUrl: 'https://i.picsum.photos/id/1003/1181/1772.jpg?hmac=oN9fHMXiqe9Zq2RM6XT-RVZkojgPnECWwyEF1RvvTZk',\n html: doCard(work.title, work.short_description, restAddr+'/'+work.id+'/thumb',doWidth(work.duration), doWidth(work.duration)+220, work.keywords, work.year),\n metaData: {\n type: 'text',\n height: doWidth(work.duration)+200,\n width: doWidth(work.duration),\n title: work.title,\n description: work.short_description\n }\n },\n ))\n return allWorks\n }\n \n\t// The options of the gallery (from the playground current state)\n\tconst options = {\n\t\tgalleryLayout: -1,\n // isVertical: true,\n collageDensity: '0.6',\n //hoveringBehaviour: 'DISAPPEARS',\n itemBorderWidth: 3,\n itemBorderRadius: 4,\n gallerySizeType: 'ratio',\n // gallerySizeRatio: 40,\n overlayBackground: 'rgba(6,6,6,0.75)',\n\t};\n\n\t// The size of the gallery container. The images will fit themselves in it\n\tconst container = {\n\t\twidth: window.innerWidth-200,\n\t\theight: window.innerHeight\n\t};\n\n\n function MyVerticallyCenteredModal(props) {\n if (typeof(workInfo.instrumentation)!=='undefined'){\n const imageSource=restAddr+\"/\"+workInfo.id+\"/image\"\n const audioSource=restAddr+\"/\"+workInfo.id+\"/audio\"\n const pdfSource=restAddr+\"/\"+workInfo.id+\"/pdf\"\n return (\n \n \n

{workInfo.title}

\n

\n {workInfo.instrumentation.reduce((accumulator, currentValue) => accumulator + \", \" + currentValue)}\n

\n

duration approximately {workInfo.duration} minutes

\n

\n {workInfo.long_description}\n

\n \n
\n \n
\n
\n
Listen an example
\n
\n \n \n \n \n );\n } else return ''\n }\n\n\t// The eventsListener will notify you anytime something has happened in the gallery.\n\tconst eventsListener = (eventName, eventData) => {\n // console.log({eventName, eventData})\n if(eventName==='ITEM_CLICKED'){\n const clickedWork = works.find(el => el.id === eventData.id);\n if(typeof(clickedWork)!=='undefined'){\n setWorkInfo(clickedWork)\n setModalShow(true)\n }\n }\n }; \n\n\t// The scrollingElement is usually the window, if you are scrolling inside another element, suplly it here\n\tconst scrollingElement = window;\n\n//
\n//
\n//\n\n//
\n// \n//
\n\n//
\n\nfunction createGallery(){\n if (grouping==='off'){\n return (\n \n )\n }\n if (grouping==='year'){\n let yearGrouping = []\n for(let y=2022; y>1996;y--){\n yearGrouping.push(\n
\n

{y}:

\n wrk.year===y))}\n options={options}\n container={container}\n eventsListener={eventsListener}\n scrollingElement={scrollingElement}\n />\n
\n )\n }\n return(\n
\n {yearGrouping}\n
\n )\n }\n if (grouping==='genre'){\n let genreGrouping = []\n genreGrouping.push(\n
\n

Opera:

\n
\n wrk.keywords.includes(\"opera\")))}\n options={options}\n container={container}\n eventsListener={eventsListener}\n scrollingElement={scrollingElement}\n />\n
\n )\n genreGrouping.push(\n
\n

Orchestra:

\n
\n (wrk.keywords.includes(\"orchestra\") || wrk.instrumentation.includes(\"orchestra\")) && !wrk.keywords.includes(\"opera\") && !wrk.keywords.includes(\"concerto\")))}\n options={options}\n container={container}\n eventsListener={eventsListener}\n scrollingElement={scrollingElement}\n />\n
\n )\n genreGrouping.push(\n
\n

Concerto:

\n
\n wrk.keywords.includes(\"concerto\") || wrk.keywords.includes(\"double concerto\")))}\n options={options}\n container={container}\n eventsListener={eventsListener}\n scrollingElement={scrollingElement}\n />\n
\n )\n genreGrouping.push(\n
\n

Chamber music:

\n
\n (wrk.keywords.includes(\"chamber\") || wrk.instrumentation.includes(\"chamber\")) && !wrk.instrumentation.includes(\"solo\")))}\n options={options}\n container={container}\n eventsListener={eventsListener}\n scrollingElement={scrollingElement}\n />\n
\n )\n genreGrouping.push(\n
\n

Vocal:

\n
\n wrk.keywords.includes(\"vocal\") && !wrk.keywords.includes(\"opera\")))}\n options={options}\n container={container}\n eventsListener={eventsListener}\n scrollingElement={scrollingElement}\n />\n
\n )\n genreGrouping.push(\n
\n

Choir:

\n
\n wrk.keywords.includes(\"choir\") && !wrk.keywords.includes(\"opera\")))}\n options={options}\n container={container}\n eventsListener={eventsListener}\n scrollingElement={scrollingElement}\n />\n
\n )\n return(\n \n
\n {genreGrouping}\n
\n )\n }\n if (grouping==='length'){\n let lengthGrouping = []\n lengthGrouping.push(\n
\n

60+ min.:

\n
\n wrk.duration>=60))}\n options={options}\n container={container}\n eventsListener={eventsListener}\n scrollingElement={scrollingElement}\n />\n
)\n lengthGrouping.push(\n
\n

45+ min.:

\n
\n wrk.duration>=45 && wrk.duration<60))}\n options={options}\n container={container}\n eventsListener={eventsListener}\n scrollingElement={scrollingElement}\n />\n
)\n lengthGrouping.push(\n
\n

30+ min.:

\n
\n wrk.duration>=30 && wrk.duration<45))}\n options={options}\n container={container}\n eventsListener={eventsListener}\n scrollingElement={scrollingElement}\n />\n
)\n lengthGrouping.push(\n
\n

20+ min.:

\n
\n wrk.duration>=20 && wrk.duration<30))}\n options={options}\n container={container}\n eventsListener={eventsListener}\n scrollingElement={scrollingElement}\n />\n
)\n lengthGrouping.push(\n
\n

15+ min.:

\n
\n wrk.duration>=15 && wrk.duration<20))}\n options={options}\n container={container}\n eventsListener={eventsListener}\n scrollingElement={scrollingElement}\n />\n
)\n lengthGrouping.push(\n
\n

10+ min.:

\n
\n wrk.duration>=10 && wrk.duration<15))}\n options={options}\n container={container}\n eventsListener={eventsListener}\n scrollingElement={scrollingElement}\n />\n
)\n lengthGrouping.push(\n
\n

under 5+ min.:

\n
\n wrk.duration>=5 && wrk.duration<10))}\n options={options}\n container={container}\n eventsListener={eventsListener}\n scrollingElement={scrollingElement}\n />\n
)\n lengthGrouping.push(\n
\n

5 min.:

\n
\n wrk.duration<5))}\n options={options}\n container={container}\n eventsListener={eventsListener}\n scrollingElement={scrollingElement}\n />\n
)\n return(\n \n
\n {lengthGrouping}\n
\n )\n}\nif (grouping==='own'){\n let favGrouping = []\n // console.log(favorites)\n favGrouping.push(\n
\n

My current favorites:

\n
\n favorites.includes(wrk.id)))}\n options={options}\n container={container}\n eventsListener={eventsListener}\n scrollingElement={scrollingElement}\n />\n
\n
\n )\n favGrouping.push(\n
\n

My other time favorites:

\n
\n !favorites.includes(wrk.id)))}\n options={options}\n container={container}\n eventsListener={eventsListener}\n scrollingElement={scrollingElement}\n />\n
\n )\n return(\n \n
\n {favGrouping}\n
\n )\n}\n}\n\nfunction selectPage(selectedPage){\n //console.log(selectedPage)\n if(selectedPage==='works'){\n return(\n
\n

List of works by Uljas Pulkkis

\n

group by

\n \n \n {' '}\n {' '}\n {' '}\n {' '}\n \n \n \n

search

\n \n

If you want to search by the title, type \"evolution\", \"tears of\", etc...

\n

If you want to search for chamber, orchestra or opera music, type \"opera\", \"chamber\", \"orchestra\" etc...

\n

If you want to search by the composition year, type \"2001\", \"2015\", etc...

\n

If you want to search by the instrumentation, type \"piano\", \"accordion\", \"2222 2200 strings\", etc...

\n

If you want to search by the keywords, type \"vocal\", \"concerto\", \"children\", etc...

\n }>\n {\n setSearch(e.target.value.split(' '));\n setGrouping('off');\n }\n }/>\n
\n

Now viewing {filterWorks.length} works

\n {createGallery()}\n
\n )\n }\n if(selectedPage==='bio'){\n return (
\n \"painting\n

I am a classical composer, born in 1975, with work catalogue of over 50 works. Most of my works are composed for symphony orchestra with or without a soloist. I did my masters studies at Sibelius Academy, but studied also mathematics and computer science at Helsinki University. Even in my early orchestral works I tried to find algorithms to combine instrument sounds as a full-sounding spectrum. In 2018 I started my doctoral studies at Sibelius Academy in order to research possibilities of algorithmic help in orchestration practice. The motivation to start my research came from situations I encountered several times at the orchestra rehearsals: An inaudible solo instrument, i.e. the desired solo instrument, which I call target, is masked by the surrounding orchestration. The most popular orchestration study books, such as Piston and Adler, concentrate mainly on teaching how to combine instruments and how to orchestrate for certain effect, but very little about the audibility of the target. For example Samuel Adler has couple of mentions about the audibility, but does not provide a formula or a table about which combinations are safe and which not. There is definately time to have a comprehensive study on the orchestration audibility issue.

\n
)\n }\n if(selectedPage==='score'){\n return (
\n

Score-Tool is an app which can be used for orchestration analysis and orchestration aid in composing work. Score-Tool is available as online-app, and in Apple app store for i-devices. The app is completely free and the source code is also available.

\n Open the online app in a new window\n
\n Open the Apple app store page in a new window\n )\n }\n if(selectedPage==='research'){\n return (
\n

I am currently doing academic orchestration research. My research include among others audibility, timbre and likeness concepts. These concepts can be explored with my Score-Tool app, and the theory is written down in my academic papers.

\n Open my academic research page\n
\n )\n }\n if(selectedPage==='contact'){\n //
\n //
\n //
\n //
\n //
\n //
\n return(\n \"uljas\n )\n \n }\n}\n\nlet filterWorks;\nif (search.length) {\n const searchPattern = new RegExp(search.map(term => `(?=.*${term})`).join(''), 'i');\n filterWorks = works.filter(work => \n work.title.match(searchPattern) || JSON.stringify(work.keywords).match(searchPattern) || work.year.toString().match(searchPattern) || JSON.stringify(work.instrumentation).match(searchPattern)\n );\n} else {\n filterWorks = works;\n}\n\n return (\n
\n
\n
\n \n
\n

Uljas Pulkkis

\n

contemporary composer

\n
\n
\n \n

\n

\n \n \n \n \n \n
\n

\n
\n {selectPage(page)}\n setModalShow(false)}\n />\n
\n );\n}\n\nexport default App;\n","const reportWebVitals = onPerfEntry => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport reportWebVitals from './reportWebVitals';\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"],"sourceRoot":""}