{"id":3114,"date":"2025-05-06T16:34:26","date_gmt":"2025-05-06T16:34:26","guid":{"rendered":"https:\/\/primanota.org.au\/?page_id=3114"},"modified":"2026-03-15T22:23:44","modified_gmt":"2026-03-15T11:53:44","slug":"projects","status":"publish","type":"page","link":"https:\/\/primanota.org.au\/ru\/projects\/","title":{"rendered":"Programs &amp; Events"},"content":{"rendered":"\n<div class=\"wp-block-uagb-container uagb-block-925ef99f alignfull uagb-is-root-container\"><div class=\"uagb-container-inner-blocks-wrap\">\n<div class=\"wp-block-uagb-container uagb-block-c969c2bc\"><\/div>\n\n\n\n<div class=\"wp-block-uagb-container uagb-block-10d3a7b0\">\n<p>At <em>Prima Nota<\/em>, we turn ideas into action.<br>Each project you see below started as a spark \u2013 a conversation, a need, a dream.<br>From large festivals to small community initiatives, our work brings people together through music, storytelling, and shared creativity.<br>Click on a project to explore what we&#8217;ve done \u2013 and what&#8217;s still to come.<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-uagb-container uagb-block-1803793f\"><\/div>\n<\/div><\/div>\n\n\n\n<p style=\"padding-right:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)\"><\/p>\n\n\n\n<div class=\"wp-block-uagb-container uagb-block-47b3806e alignfull uagb-is-root-container\"><div class=\"uagb-container-inner-blocks-wrap\">\n<div class=\"wp-block-uagb-container uagb-block-226b7b9a\">\n<div class=\"wp-block-uagb-image aligncenter uagb-block-ce576ce4 wp-block-uagb-image--layout-default wp-block-uagb-image--effect-zoomin wp-block-uagb-image--align-center\" id=\"Maslenitsa-2025\"><figure class=\"wp-block-uagb-image__figure\"><a class=\"\" href=\"https:\/\/primanota.org.au\/projects\/folk-pancake-festival-maslenitsa-2025\/\" target=\"\" rel=\"noopener\"><img decoding=\"async\" srcset=\"https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/05\/Logo-Maslenitsa-final-round.png ,https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/05\/Logo-Maslenitsa-final-round.png 780w, https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/05\/Logo-Maslenitsa-final-round.png 360w\" sizes=\"auto, (max-width: 480px) 150px\" src=\"https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/05\/Logo-Maslenitsa-final-round.png\" alt=\"\" class=\"uag-image-3312\" width=\"246\" height=\"246\" title=\"Logo Maslenitsa final round\" loading=\"lazy\" role=\"img\"\/><\/a><figcaption class=\"uagb-image-caption\">Maslenitsa 2025<\/figcaption><\/figure><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-uagb-container uagb-block-bc0e5220\">\n<div class=\"wp-block-uagb-image aligncenter uagb-block-1ed28bf5 wp-block-uagb-image--layout-default wp-block-uagb-image--effect-zoomin wp-block-uagb-image--align-center\"><figure class=\"wp-block-uagb-image__figure\"><a class=\"\" href=\"https:\/\/primanota.org.au\/projects\/choirs\/prima-vera\/\" target=\"\" rel=\"noopener\"><img decoding=\"async\" srcset=\"https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/05\/PVera-Logo-1-e1749442923506.png ,https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/05\/PVera-Logo-1.png 780w, https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/05\/PVera-Logo-1.png 360w\" sizes=\"auto, (max-width: 480px) 150px\" src=\"https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/05\/PVera-Logo-1-e1749442923506.png\" alt=\"\" class=\"uag-image-3504\" width=\"246\" height=\"246\" title=\"PVera Logo\" loading=\"lazy\" role=\"img\"\/><\/a><figcaption class=\"uagb-image-caption\">Russian speaking Girl&#8217;s choir<\/figcaption><\/figure><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-uagb-container uagb-block-34a0b307\">\n<div class=\"wp-block-uagb-image aligncenter uagb-block-4348f2fc wp-block-uagb-image--layout-default wp-block-uagb-image--effect-zoomin wp-block-uagb-image--align-center\"><figure class=\"wp-block-uagb-image__figure\"><a class=\"\" href=\"https:\/\/primanota.org.au\/projects\/choirs\/prima-voce\/\" target=\"\" rel=\"noopener\"><img decoding=\"async\" srcset=\"https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/05\/PVoceLogo.png ,https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/05\/PVoceLogo.png 780w, https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/05\/PVoceLogo.png 360w\" sizes=\"auto, (max-width: 480px) 150px\" src=\"https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/05\/PVoceLogo.png\" alt=\"\" class=\"uag-image-3505\" width=\"246\" height=\"246\" title=\"PVoceLogo\" loading=\"lazy\" role=\"img\"\/><\/a><figcaption class=\"uagb-image-caption\">Russian Speaking Men&#8217;s choir<\/figcaption><\/figure><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-uagb-container uagb-block-c27be605\">\n<div class=\"wp-block-uagb-image aligncenter uagb-block-e7be8347 wp-block-uagb-image--layout-default wp-block-uagb-image--effect-zoomin wp-block-uagb-image--align-center\"><figure class=\"wp-block-uagb-image__figure\"><a class=\"\" href=\"https:\/\/primanota.org.au\/mafia\/\" target=\"\" rel=\"noopener\"><img decoding=\"async\" srcset=\"https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/08\/1.avif ,https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/08\/1.avif 780w, https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/08\/1.avif 360w\" sizes=\"auto, (max-width: 480px) 150px\" src=\"https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/08\/1.avif\" alt=\"\" class=\"uag-image-5516\" width=\"246\" height=\"240\" title=\"\" loading=\"lazy\" role=\"presentation\"\/><\/a><figcaption class=\"uagb-image-caption\">VolkHauz<br>Game Nights Club<\/figcaption><\/figure><\/div>\n<\/div>\n<\/div><\/div>\n\n\n\n<footer class=\"wp-block-uagb-container uagb-block-1ab7f955 alignfull uagb-is-root-container\"><div class=\"uagb-container-inner-blocks-wrap\">\n<div class=\"wp-block-uagb-container uagb-block-752ae4e3\">\n<div class=\"wp-block-uagb-image aligncenter uagb-block-3195e7ff wp-block-uagb-image--layout-default wp-block-uagb-image--effect-zoomin wp-block-uagb-image--align-center\"><figure class=\"wp-block-uagb-image__figure\"><a class=\"\" href=\"https:\/\/primanota.org.au\/zabava\" target=\"\" rel=\"noopener\"><img decoding=\"async\" srcset=\"https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/07\/Zabava-Blue-round-1024x1024.avif ,https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/07\/Zabava-Blue-round.avif 780w, https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/07\/Zabava-Blue-round.avif 360w\" sizes=\"auto, (max-width: 480px) 150px\" src=\"https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/07\/Zabava-Blue-round-1024x1024.avif\" alt=\"\" class=\"uag-image-5062\" width=\"242\" height=\"240\" title=\"\" loading=\"lazy\" role=\"presentation\"\/><\/a><figcaption class=\"uagb-image-caption\">Zabava Folk Dance,<br>South Australia<\/figcaption><\/figure><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-uagb-container uagb-block-0873b79a\">\n<div class=\"wp-block-uagb-image aligncenter uagb-block-722996ba wp-block-uagb-image--layout-default wp-block-uagb-image--effect-zoomin wp-block-uagb-image--align-center\"><figure class=\"wp-block-uagb-image__figure\"><a class=\"\" href=\"https:\/\/primanota.org.au\/projects\/choirs\/prima-vera\/\" target=\"\" rel=\"noopener\"><img decoding=\"async\" srcset=\"https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/12\/Prima-DonnaLogo.avif ,https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/12\/Prima-DonnaLogo.avif 780w, https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/12\/Prima-DonnaLogo.avif 360w\" sizes=\"auto, (max-width: 480px) 150px\" src=\"https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/12\/Prima-DonnaLogo.avif\" alt=\"\" class=\"uag-image-6048\" width=\"246\" height=\"246\" title=\"Prima DonnaLogo\" loading=\"lazy\" role=\"img\"\/><\/a><\/figure><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-uagb-container uagb-block-3e8e3931\"><\/div>\n\n\n\n<div class=\"wp-block-uagb-container uagb-block-416d28cd\"><\/div>\n<\/div><\/footer>\n\n\n\n<p><\/p>\n\n\n\n    <div id=\"pn-gallery-69fdb3e7a056c\" style=\"width:100%;height:600px;position:relative;\">\n        <div class=\"pn-canvas-container\" style=\"width:100%;height:100%;\"><\/div>\n    <\/div>\n\n    <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/three.js\/r128\/three.min.js\"><\/script>\n    <script>\n    (function() {\n        var galleryId  = 'pn-gallery-69fdb3e7a056c';\n        var images     = [{\"id\":5868,\"name\":\"Prima Nota Projects\",\"url\":\"https:\\\/\\\/primanota.org.au\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/Prima-Nota-alternate-logo-1024x914.avif\",\"description\":\"\",\"link\":\"\"},{\"id\":5871,\"name\":\"VolkHauz \u2013 Cultural Strategy Game Nights\",\"url\":\"https:\\\/\\\/primanota.org.au\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/VH.png\",\"description\":\"VolkHauz is Prima Nota\u2019s signature game night series \u2014 an immersive roleplay experience based on the classic Mafia\\\/Werewolf format, reimagined through folklore, history, and cultural storytelling.\",\"link\":\"https:\\\/\\\/primanota.org.au\\\/projects\\\/game_nights\\\/mafia\\\/\"},{\"id\":5872,\"name\":\"Zabava\",\"url\":\"https:\\\/\\\/primanota.org.au\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/Zabava-Blue-round-1024x1024.avif\",\"description\":\"Zabava is a youth-driven folk dance troupe celebrating the rich traditions of Eastern Europe \u2014 from Russia and Ukraine to the Balkans and beyond.\",\"link\":\"https:\\\/\\\/primanota.org.au\\\/zabava\\\/\"},{\"id\":5883,\"name\":\"Prima Donna Choir\",\"url\":\"https:\\\/\\\/primanota.org.au\\\/wp-content\\\/uploads\\\/2025\\\/08\\\/Prima-Donna-e1759069470198.avif\",\"description\":\"Prima Donna is a women\u2019s choir for Russian-speaking women, creating a warm and supportive space where every voice can shine.\",\"link\":\"https:\\\/\\\/primanota.org.au\\\/prima-donna\\\/\"},{\"id\":5870,\"name\":\"Folk Pancake Festival Maslenitsa SA\",\"url\":\"https:\\\/\\\/primanota.org.au\\\/wp-content\\\/uploads\\\/2025\\\/08\\\/logo.avif\",\"description\":\"The Folk Pancake Festival Maslenitsa SA is Prima Nota\u2019s signature annual event \u2014 a joyful celebration rooted in Eastern European, Slavic, and Orthodox traditions, brought to life for modern Australia.\",\"link\":\"https:\\\/\\\/primanota.org.au\\\/folk-pancake-festival-maslenitsa-SA\\\/\"},{\"id\":5869,\"name\":\"Prima Voce\",\"url\":\"https:\\\/\\\/primanota.org.au\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/PVoceLogo-2.png\",\"description\":\"Men's choir and support group\",\"link\":\"https:\\\/\\\/primanota.org.au\\\/projects\\\/choirs\\\/prima-voce\\\/\"},{\"id\":6661,\"name\":\"Data Storytelling\",\"url\":\"https:\\\/\\\/primanota.org.au\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/round-logo.png\",\"description\":\"Nina is a lead specialist in the field of Data Storytelling\",\"link\":\"https:\\\/\\\/primanota.org.au\\\/datastorytelling\\\/\"},{\"id\":6578,\"name\":\"Prima Nota Programmes\",\"url\":\"https:\\\/\\\/primanota.org.au\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/L-R-treasurer-1.png\",\"description\":\"Community Capacity-Building Services (Cost-Recovery)\\r\\nEducational workshops and affordable support services designed to strengthen migrant-led organisations and grassroots community initiatives. All revenue is reinvested into Prima Nota\u2019s charitable programmes.\",\"link\":\"https:\\\/\\\/primanota.org.au\\\/services\\\/\"},{\"id\":6577,\"name\":\"Prima Nota News\",\"url\":\"https:\\\/\\\/primanota.org.au\\\/wp-content\\\/uploads\\\/event-manager-uploads\\\/organizer_logo\\\/2025\\\/09\\\/cropped-Prima-Nota-logo.avif\",\"description\":\"Our ongoing live projects\",\"link\":\"https:\\\/\\\/primanota.org.au\\\/prima-notes\\\/\"}];\n        var RADIUS     = 2;\n        var IMG_SIZE   = 1;\n        var CAMERA_Z   = 5;\n        var AUTOROTATE       = true;\n        var SPHERE_OPACITY   = 0.3;\n        var SPHERE_WIREFRAME = true;\n        var PARTICLE_OPACITY = 0.4;\n\n        var scene, camera, renderer, sphereGroup;\n        var meshes = [], isDragging = false;\n        var prevMouse = { x: 0, y: 0 };\n        var rotation  = { x: 0, y: 0 };\n        var hoveredMesh = null, isViewing = false, viewingMesh = null;\n\n        function init() {\n            var container = document.querySelector('#' + galleryId + ' .pn-canvas-container');\n\n            scene = new THREE.Scene();\n            scene.background = null; \/\/ \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u0439 \u0444\u043e\u043d\n\n            camera = new THREE.PerspectiveCamera(75, container.clientWidth \/ container.clientHeight, 0.1, 1000);\n            camera.position.z = CAMERA_Z;\n\n            renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });\n            renderer.setClearColor(0x000000, 0);\n            renderer.setSize(container.clientWidth, container.clientHeight);\n            renderer.setPixelRatio(window.devicePixelRatio);\n            container.appendChild(renderer.domElement);\n\n            scene.add(new THREE.AmbientLight(0xffffff, 1.0));\n            var pt = new THREE.PointLight(0xffffff, 0.6);\n            pt.position.set(10, 10, 10);\n            scene.add(pt);\n\n            createSphere();\n\n            \/\/ \u041c\u044b\u0448\u044c (\u0434\u0435\u0441\u043a\u0442\u043e\u043f) \u2014 move \u0438 up \u043d\u0430 window \u0447\u0442\u043e\u0431\u044b \u0434\u0440\u0430\u0433 \u043d\u0435 \u0437\u0430\u0441\u0442\u0440\u0435\u0432\u0430\u043b\n            renderer.domElement.addEventListener('mousedown', onMouseDown);\n            window.addEventListener('mousemove', onMouseMove);\n            window.addEventListener('mouseup',   onMouseUp);\n\n            \/\/ \u0422\u0430\u0447 (\u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0439)\n            renderer.domElement.addEventListener('touchstart', onTouchStart, { passive: false });\n            renderer.domElement.addEventListener('touchmove',  onTouchMove,  { passive: false });\n            renderer.domElement.addEventListener('touchend',   onTouchEnd,   { passive: false });\n\n            renderer.domElement.style.cursor = 'grab';\n            window.addEventListener('resize', onResize);\n\n            animate();\n        }\n\n        function createSphere() {\n            if (sphereGroup) {\n                scene.remove(sphereGroup);\n                sphereGroup.traverse(function(c) {\n                    if (c.geometry) c.geometry.dispose();\n                    if (c.material) c.material.dispose();\n                });\n            }\n            sphereGroup = new THREE.Group();\n            scene.add(sphereGroup);\n            meshes = [];\n\n            \/\/ \u0421\u0442\u0435\u043a\u043b\u044f\u043d\u043d\u0430\u044f \u0441\u0444\u0435\u0440\u0430 (\u0435\u0441\u043b\u0438 opacity > 0)\n            if (SPHERE_OPACITY > 0) {\n                var sphereGeo = new THREE.SphereGeometry(RADIUS * 0.98, 48, 48);\n                var sphereMat = new THREE.MeshPhongMaterial({\n                    color: 0xffffff,\n                    transparent: true,\n                    opacity: SPHERE_OPACITY,\n                    side: THREE.BackSide,   \/\/ \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u2014 \u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0444\u043e\u0442\u043e\n                    depthWrite: false,      \/\/ \u043d\u0435 \u043f\u0438\u0448\u0435\u043c \u0432 depth buffer\n                    shininess: 120,\n                    specular: new THREE.Color(0xffffff)\n                });\n                sphereGroup.add(new THREE.Mesh(sphereGeo, sphereMat));\n            }\n\n            \/\/ \u0421\u0435\u0442\u043a\u0430 (wireframe)\n            if (SPHERE_WIREFRAME) {\n                var wGeo = new THREE.SphereGeometry(RADIUS * 0.97, 18, 12);\n                var wMat = new THREE.MeshBasicMaterial({\n                    color: 0xffffff,\n                    transparent: true,\n                    opacity: 0.05,\n                    wireframe: true,\n                    depthWrite: false\n                });\n                sphereGroup.add(new THREE.Mesh(wGeo, wMat));\n            }\n\n            \/\/ \u0426\u0432\u0435\u0442\u043d\u043e\u0439 \u0432\u0438\u0445\u0440\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0444\u0435\u0440\u044b \u2014 \u0447\u0430\u0441\u0442\u0438\u0446\u044b\n            var particleCount = 6000;\n            var positions = new Float32Array(particleCount * 3);\n            var pColors   = new Float32Array(particleCount * 3);\n            var palette = [\n                [0.49, 0.23, 0.93], \/\/ \u0444\u0438\u043e\u043b\u0435\u0442\u043e\u0432\u044b\u0439 #7c3aed\n                [0.02, 0.71, 0.83], \/\/ \u0431\u0438\u0440\u044e\u0437\u043e\u0432\u044b\u0439  #06b6d4\n                [0.98, 0.45, 0.09], \/\/ \u043e\u0440\u0430\u043d\u0436\u0435\u0432\u044b\u0439  #f97316\n                [0.88, 0.11, 0.28], \/\/ \u043a\u0440\u0430\u0441\u043d\u044b\u0439    #e11d48\n                [0.66, 0.33, 0.97], \/\/ \u0441\u0438\u0440\u0435\u043d\u0435\u0432\u044b\u0439  #a855f7\n                [0.08, 0.72, 0.65], \/\/ \u043c\u044f\u0442\u043d\u044b\u0439     #14b8a6\n            ];\n            for (var i = 0; i < particleCount; i++) {\n                var r2    = RADIUS * 0.75 * Math.pow(Math.random(), 0.4);\n                var th2   = Math.random() * Math.PI * 2;\n                var ph2   = Math.acos(2 * Math.random() - 1);\n                var ysc   = 0.5 + Math.random() * 0.35;\n                positions[i * 3]     = r2 * Math.sin(ph2) * Math.cos(th2);\n                positions[i * 3 + 1] = r2 * Math.cos(ph2) * ysc;\n                positions[i * 3 + 2] = r2 * Math.sin(ph2) * Math.sin(th2);\n                var col = palette[Math.floor(Math.random() * palette.length)];\n                pColors[i * 3]     = col[0];\n                pColors[i * 3 + 1] = col[1];\n                pColors[i * 3 + 2] = col[2];\n            }\n            var pGeo = new THREE.BufferGeometry();\n            pGeo.setAttribute('position', new THREE.BufferAttribute(positions, 3));\n            pGeo.setAttribute('color',    new THREE.BufferAttribute(pColors, 3));\n            var pMat = new THREE.PointsMaterial({\n                size:            0.007,\n                vertexColors:    THREE.VertexColors,\n                transparent:     true,\n                opacity:         PARTICLE_OPACITY,\n                sizeAttenuation: true,\n                depthWrite:      false\n            });\n            var particles = new THREE.Points(pGeo, pMat);\n            particles.userData.isParticles = true;\n            sphereGroup.add(particles);\n\n            var count = images.length;\n            images.forEach(function(image, index) {\n                var phi   = Math.acos(1 - 2 * (index + 0.5) \/ count);\n                var theta = Math.PI * (1 + Math.sqrt(5)) * index;\n                var x = RADIUS * Math.sin(phi) * Math.cos(theta);\n                var y = RADIUS * Math.sin(phi) * Math.sin(theta);\n                var z = RADIUS * Math.cos(phi);\n\n                new THREE.TextureLoader().load(image.url, function(texture) {\n                    var mesh = new THREE.Mesh(\n                        new THREE.PlaneGeometry(IMG_SIZE, IMG_SIZE),\n                        new THREE.MeshStandardMaterial({\n                            map: texture,\n                            side: THREE.DoubleSide,\n                            transparent: true\n                        })\n                    );\n                    mesh.position.set(x, y, z);\n\n                    \/\/ \u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043c\u043e\u0442\u0440\u044f\u0442 \u041d\u0410\u0420\u0423\u0416\u0423 \u043e\u0442 \u0446\u0435\u043d\u0442\u0440\u0430 \u0441\u0444\u0435\u0440\u044b\n                    var outward = new THREE.Vector3(x, y, z).normalize();\n                    mesh.quaternion.setFromUnitVectors(new THREE.Vector3(0, 0, 1), outward);\n\n                    mesh.userData.id          = image.id;\n                    mesh.userData.name        = image.name;\n                    mesh.userData.description = image.description;\n                    mesh.userData.link        = image.link;\n                    mesh.userData.origPos     = new THREE.Vector3(x, y, z);\n                    mesh.userData.origQuat    = mesh.quaternion.clone();\n\n                    sphereGroup.add(mesh);\n                    meshes.push(mesh);\n                });\n            });\n        }\n\n        function animate() {\n            requestAnimationFrame(animate);\n\n            if (sphereGroup && !isViewing) {\n                sphereGroup.rotation.x = rotation.x;\n                sphereGroup.rotation.y = rotation.y;\n                if (AUTOROTATE && !isDragging) rotation.y += 0.001;\n            }\n\n            \/\/ \u0427\u0430\u0441\u0442\u0438\u0446\u044b \u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u2014 \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0435 \u0432\u0438\u0445\u0440\u044f\n            sphereGroup.traverse(function(child) {\n                if (child.userData && child.userData.isParticles) {\n                    child.rotation.y += 0.0018;\n                    child.rotation.x += 0.0004;\n                }\n            });\n\n            meshes.forEach(function(mesh) {\n                if (!mesh.material) return;\n                var target = (isViewing && mesh !== viewingMesh) ? 0.12 : 1;\n                mesh.material.opacity += (target - mesh.material.opacity) * 0.1;\n            });\n\n            if (isViewing && viewingMesh) {\n                var tp = new THREE.Vector3(0, 0, CAMERA_Z - 1.8);\n                viewingMesh.position.lerp(tp, 0.1);\n                viewingMesh.scale.lerp(new THREE.Vector3(3, 3, 3), 0.1);\n                viewingMesh.quaternion.slerp(new THREE.Quaternion(), 0.1);\n            }\n\n            renderer.render(scene, camera);\n        }\n\n        function getHit(e) {\n            var rect  = renderer.domElement.getBoundingClientRect();\n            var mouse = new THREE.Vector2(\n                ((e.clientX - rect.left) \/ rect.width) * 2 - 1,\n                -((e.clientY - rect.top) \/ rect.height) * 2 + 1\n            );\n            var ray = new THREE.Raycaster();\n            ray.setFromCamera(mouse, camera);\n            var hits = ray.intersectObjects(meshes);\n            return hits.length ? hits[0].object : null;\n        }\n\n        \/\/ \u2500\u2500\u2500 \u041c\u044b\u0448\u044c (\u0434\u0435\u0441\u043a\u0442\u043e\u043f) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n        var isPressed    = false; \/\/ \u043a\u043d\u043e\u043f\u043a\u0430 \u0437\u0430\u0436\u0430\u0442\u0430\n        var downPos      = { x: 0, y: 0 }; \/\/ \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438\n        var lastPos      = { x: 0, y: 0 }; \/\/ \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0434\u043b\u044f \u0434\u0435\u043b\u044c\u0442\u044b\n        var moved        = false; \/\/ \u0431\u044b\u043b\u043e \u043b\u0438 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 > \u043f\u043e\u0440\u043e\u0433\u0430\n        var DRAG_THRESHOLD = 6;\n\n        function onMouseDown(e) {\n            isPressed = true;\n            moved     = false;\n            downPos   = { x: e.clientX, y: e.clientY };\n            lastPos   = { x: e.clientX, y: e.clientY };\n            renderer.domElement.style.cursor = 'grabbing';\n        }\n\n        function onMouseMove(e) {\n            if (isPressed) {\n                var dx = e.clientX - downPos.x;\n                var dy = e.clientY - downPos.y;\n                if (Math.sqrt(dx*dx + dy*dy) > DRAG_THRESHOLD) moved = true;\n\n                if (moved && !isViewing) {\n                    rotation.y += (e.clientX - lastPos.x) * 0.005;\n                    rotation.x += (e.clientY - lastPos.y) * 0.005;\n                }\n                lastPos = { x: e.clientX, y: e.clientY };\n            } else {\n                \/\/ Hover \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u043c\u044b\u0448\u044c \u043d\u0430\u0434 canvas\n                var rect2 = renderer.domElement.getBoundingClientRect();\n                var overCanvas = e.clientX >= rect2.left && e.clientX <= rect2.right &&\n                                 e.clientY >= rect2.top  && e.clientY <= rect2.bottom;\n                if (!overCanvas) return;\n                var m = getHit(e);\n                if (hoveredMesh && hoveredMesh !== m) {\n                    hoveredMesh.scale.set(1, 1, 1);\n                    hoveredMesh = null;\n                    renderer.domElement.style.cursor = 'grab';\n                }\n                if (m && hoveredMesh !== m) {\n                    m.scale.set(1.35, 1.35, 1.35);\n                    hoveredMesh = m;\n                    renderer.domElement.style.cursor = 'pointer';\n                }\n            }\n        }\n\n        function onMouseUp(e) {\n            if (!isPressed) return;\n            isPressed = false;\n\n            if (!moved) {\n                \/\/ \u0427\u0438\u0441\u0442\u044b\u0439 \u043a\u043b\u0438\u043a\n                var m = getHit(e);\n                if (isViewing) {\n                    if (m && m === viewingMesh) {\n                        var link = viewingMesh.userData.link;\n                        if (link) window.open(link, '_blank');\n                    } else {\n                        exitViewing();\n                    }\n                } else {\n                    if (m) enterViewing(m);\n                }\n            }\n\n            moved = false;\n            renderer.domElement.style.cursor = 'grab';\n        }\n\n        function enterViewing(mesh) {\n            isViewing   = true;\n            viewingMesh = mesh;\n\n            var wp = new THREE.Vector3();\n            var wq = new THREE.Quaternion();\n            var ws = new THREE.Vector3();\n            mesh.getWorldPosition(wp);\n            mesh.getWorldQuaternion(wq);\n            mesh.getWorldScale(ws);\n\n            sphereGroup.remove(mesh);\n            scene.add(mesh);\n            mesh.position.copy(wp);\n            mesh.quaternion.copy(wq);\n            mesh.scale.copy(ws);\n\n            renderer.domElement.style.cursor = 'pointer';\n            if (hoveredMesh && hoveredMesh !== mesh) {\n                hoveredMesh.scale.set(1, 1, 1);\n                hoveredMesh = null;\n            }\n        }\n\n        function exitViewing() {\n            if (!isViewing) return;\n            isViewing = false;\n            if (viewingMesh) {\n                scene.remove(viewingMesh);\n                sphereGroup.add(viewingMesh);\n                viewingMesh.position.copy(viewingMesh.userData.origPos);\n                viewingMesh.quaternion.copy(viewingMesh.userData.origQuat);\n                viewingMesh.scale.set(1, 1, 1);\n                viewingMesh = null;\n            }\n            renderer.domElement.style.cursor = 'grab';\n        }\n\n        \/\/ \u2500\u2500\u2500 \u0422\u0430\u0447-\u0441\u043e\u0431\u044b\u0442\u0438\u044f (\u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0439) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n        var touchStartPos  = null;\n        var prevTouch      = null;\n        var TOUCH_THRESHOLD = 10; \/\/ \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439\n\n        function onTouchStart(e) {\n            e.preventDefault();\n            if (e.touches.length === 1) {\n                var t = e.touches[0];\n                touchStartPos = { x: t.clientX, y: t.clientY };\n                prevTouch     = { x: t.clientX, y: t.clientY };\n                isDragging    = false;\n            }\n        }\n\n        function onTouchMove(e) {\n            e.preventDefault();\n            if (e.touches.length !== 1 || !prevTouch) return;\n\n            var t  = e.touches[0];\n            var dx = t.clientX - touchStartPos.x;\n            var dy = t.clientY - touchStartPos.y;\n\n            if (Math.sqrt(dx*dx + dy*dy) > TOUCH_THRESHOLD) {\n                isDragging = true;\n            }\n\n            if (isDragging) {\n                if (isViewing) {\n                    \/\/ \u0421\u0432\u0430\u0439\u043f \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u2192 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432 \u0441\u0444\u0435\u0440\u0443\n                    exitViewing();\n                } else {\n                    rotation.y += (t.clientX - prevTouch.x) * 0.005;\n                    rotation.x += (t.clientY - prevTouch.y) * 0.005;\n                }\n            }\n\n            prevTouch = { x: t.clientX, y: t.clientY };\n        }\n\n        function onTouchEnd(e) {\n            e.preventDefault();\n\n            if (!isDragging && touchStartPos) {\n                \/\/ \u041d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0442\u0430\u043f\n                var fakeEvent = { clientX: touchStartPos.x, clientY: touchStartPos.y };\n                var m = getHit(fakeEvent);\n\n                if (isViewing) {\n                    if (m && m === viewingMesh) {\n                        \/\/ \u0422\u0430\u043f \u043f\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u2192 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443\n                        var link = viewingMesh.userData.link;\n                        if (link) window.open(link, '_blank');\n                    } else {\n                        \/\/ \u0422\u0430\u043f \u043c\u0438\u043c\u043e \u2192 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432 \u0441\u0444\u0435\u0440\u0443\n                        exitViewing();\n                    }\n                } else {\n                    if (m) enterViewing(m);\n                }\n            }\n\n            touchStartPos = null;\n            prevTouch     = null;\n            isDragging    = false;\n        }\n\n        function onResize() {\n            var container = document.querySelector('#' + galleryId + ' .pn-canvas-container');\n            camera.aspect = container.clientWidth \/ container.clientHeight;\n            camera.updateProjectionMatrix();\n            renderer.setSize(container.clientWidth, container.clientHeight);\n        }\n\n        init();\n    })();\n    <\/script>\n    \n","protected":false},"excerpt":{"rendered":"<p>At Prima Nota, we turn ideas into action.Each project you see below started as a spark \u2013 a conversation, a need, a dream.From large festivals to small community initiatives, our work brings people together through music, storytelling, and shared creativity.Click on a project to explore what we&#8217;ve done \u2013 and what&#8217;s still to come.<\/p>","protected":false},"author":1,"featured_media":3172,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-3114","page","type-page","status-publish","has-post-thumbnail","hentry"],"uagb_featured_image_src":{"full":["https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/05\/back-r.jpg",1920,1023,false],"thumbnail":["https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/05\/back-r-150x150.jpg",150,150,true],"medium":["https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/05\/back-r-300x160.jpg",300,160,true],"medium_large":["https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/05\/back-r-768x409.jpg",768,409,true],"large":["https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/05\/back-r-1024x546.jpg",1024,546,true],"thumblist":["https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/05\/back-r.jpg",300,160,false],"thumbrelated":["https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/05\/back-r.jpg",500,266,false],"meccarouselthumb":["https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/05\/back-r.jpg",474,253,false],"gridsquare":["https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/05\/back-r.jpg",391,208,false],"tileview":["https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/05\/back-r.jpg",300,160,false],"1536x1536":["https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/05\/back-r-1536x818.jpg",1536,818,true],"2048x2048":["https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/05\/back-r.jpg",1920,1023,false],"trp-custom-language-flag":["https:\/\/primanota.org.au\/wp-content\/uploads\/2025\/05\/back-r.jpg",18,10,false]},"uagb_author_info":{"display_name":"Admin Adminovich","author_link":"https:\/\/primanota.org.au\/ru\/author\/adminprimanota-org-au\/"},"uagb_comment_info":0,"uagb_excerpt":"At Prima Nota, we turn ideas into action.Each project you see below started as a spark \u2013 a conversation, a need, a dream.From large festivals to small community initiatives, our work brings people together through music, storytelling, and shared creativity.Click on a project to explore what we&#8217;ve done \u2013 and what&#8217;s still to come.","_links":{"self":[{"href":"https:\/\/primanota.org.au\/ru\/wp-json\/wp\/v2\/pages\/3114","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/primanota.org.au\/ru\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/primanota.org.au\/ru\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/primanota.org.au\/ru\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/primanota.org.au\/ru\/wp-json\/wp\/v2\/comments?post=3114"}],"version-history":[{"count":49,"href":"https:\/\/primanota.org.au\/ru\/wp-json\/wp\/v2\/pages\/3114\/revisions"}],"predecessor-version":[{"id":6584,"href":"https:\/\/primanota.org.au\/ru\/wp-json\/wp\/v2\/pages\/3114\/revisions\/6584"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/primanota.org.au\/ru\/wp-json\/wp\/v2\/media\/3172"}],"wp:attachment":[{"href":"https:\/\/primanota.org.au\/ru\/wp-json\/wp\/v2\/media?parent=3114"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}