PageSourceSearch

https://www.stefanprins.net/blog

html stefanprins.net collected 2026-10-10 02:20:57 UTC 41,993 bytes, 794 lines download raw bytes

1<!DOCTYPE html><html data-wf-page="688a54756c71954566b98f1b" data-wf-site="6888085c617ef31b88797ced" lang="en"><head>
2  <meta charset="utf-8">
3  <title>Stefan Prins | Blog</title>
4  <meta content="Stefan Prins is a Belgian composer whose music reflects on contemporary technologies and new media. He is co-artistic director of the Nadar Ensemble." name="description">
5  <meta content="Stefan Prins | Blog" property="og:title">
6  <meta content="Stefan Prins is a Belgian composer whose music reflects on contemporary technologies and new media. He is co-artistic director of the Nadar Ensemble." property="og:description">
7  <meta content="https://cdn.prod.website-files.com/6888085c617ef31b88797ced/688a2e4f07aed07d7aa475cd_prins-cloud_chamber_copyright-Laurent_Orseau.png" property="og:image">
8  <meta content="Stefan Prins | Blog" property="twitter:title">
9  <meta content="Stefan Prins is a Belgian composer whose music reflects on contemporary technologies and new media. He is co-artistic director of the Nadar Ensemble." property="twitter:description">
10  <meta content="https://cdn.prod.website-files.com/6888085c617ef31b88797ced/688a2e4f07aed07d7aa475cd_prins-cloud_chamber_copyright-Laurent_Orseau.png" property="twitter:image">
11  <meta property="og:type" content="website">
12  <meta content="summary_large_image" name="twitter:card">
13  <meta content="width=device-width, initial-scale=1" name="viewport">
14  <link href="css/normalize.css" rel="stylesheet" type="text/css">
15  <link href="css/components.css" rel="stylesheet" type="text/css">
16  <link href="css/stefan-prins.css" rel="stylesheet" type="text/css">
17  
17<script src="https://use.typekit.net/aiz3xhz.js" type="text/javascript"></script>
17
18  
18<script type="text/javascript">try{Typekit.load();}catch(e){}</script>
18
19  
19<script type="text/javascript">!function(o,c){var n=c.documentElement,t=" w-mod-";n.className+=t+"js",("ontouchstart"in o||o.DocumentTouch&&c instanceof DocumentTouch)&&(n.className+=t+"touch")}(window,document);</script>
19
20  <link href="images/favicon.png" rel="shortcut icon" type="image/x-icon">
21  <link href="images/webclip.png" rel="apple-touch-icon">
22  
22<script async="" src="https://cdn.jsdelivr.net/npm/@finsweet/cookie-consent@1/fs-cc.js" fs-cc-mode="opt-in"></script>
22
23  <style>
24  * {
25    -webkit-font-smoothing: antialiased;
26    -moz-osx-font-smoothing: grayscale;
27  }
28  .w-nav-overlay{
29    top:0;
30  }
31  html {
32    scroll-behavior: smooth
33  }
34  [id] {
35    scroll-margin-top: 4rem;
36  }
37  .w-richtext a img:hover{
38    cursor:pointer;
39    opacity: 0.5;
40    transform: scale(0.98);
41  }
42  .w-richtext a img{
43    transition: 0.4s all;
44  }
45</style>
46  <style>
47  .youtube {
48    background-color: #939393;
49    position: relative;
50    overflow: hidden;
51    cursor: pointer;
52    min-height:150px;
53    padding-top:56.25%;
54  }
55  .youtube img {
56    top:0;
57    left: 0;
58    height: 100%;
59    width: 100%;
60    object-fit: cover;
61  }
62  .youtube img,
63  .youtube iframe {
64    overflow: hidden;
65  }
66  .youtube .play-button {
67    width: 60px;
68    height: 60px;
69    z-index: 1;
70    opacity: 1;
71    display: flex;
72    align-items: center;
73    justify-content: center;
74  }
75  .youtube img,
76  .youtube .play-button {
77    cursor: pointer; 
78  }
79  .youtube img,
80  .youtube iframe,
81  .youtube .play-button,
82  .youtube .play-button:before {
83    position: absolute;
84  }
85  .youtube .play-button,
86  .youtube .play-button:before {
87    top: 50%; left: 50%; transform: translate3d( -50%, -50%, 0 ); 
88  }
89  .youtube iframe {
90    height: 100%; width: 100%; top: 0; left: 0; 
91  }
92  .w-lightbox-backdrop {
93    z-index:9999999;
94  }
95</style>
96  <link rel="stylesheet" href="https://cdn.plyr.io/3.7.8/plyr.css">
97  
97<script async="" src="https://cdn.jsdelivr.net/npm/@finsweet/attributes-cmsload@1/cmsload.js"></script>
97
98  
98<script defer="" data-domain="stefanprins.net" src="https://v2.analytics.dreher-media.de/js/script.file-downloads.hash.outbound-links.js"></script>
98
99</head>
100<body>
101  <div class="page-wrapper">
102    <div class="cookie-consent">
103      <div fs-cc="banner" class="cc-banner_component">
104        <div class="fs-cc-banner2_container">
105          <div class="fs-cc-banner2_text">By clicking “Accept”, you agree to the storing of cookies on your device to enhance site navigation, analyze site usage, and assist in our marketing efforts. View our <a href="privacy-policy.html" class="fs-cc-banner2_text-link">Privacy Policy</a> for more information.</div>
106          <div class="fs-cc-banner2_buttons-wrapper">
107            <a fs-cc="deny" href="#" class="fs-cc-banner2_button fs-cc-button-alt w-button">Deny</a>
108            <a fs-cc="allow" href="#" class="fs-cc-banner2_button w-button">Accept</a>
109          </div>
110        </div>
111      </div>
112      <div fs-cc="manager" class="cc-manager_component">
113        <div fs-cc="open-preferences" role="button" tabindex="0" title="Cookie Preferences" aria-label="Cookie Preferences" class="fs-cc-manager2_button w-embed"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
114            <path d="M9 8L9 8.01" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
115            <path d="M16 15L16 15.01" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
116            <path d="M10 17L10 17.01" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
117            <path d="M11 13L11 13.01" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
118            <path d="M6 12L6 12.01" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
119            <path d="M12 21C16.9706 21 21 16.9706 21 12C21 11.4402 20.9489 10.8924 20.8511 10.361C20.3413 10.7613 19.6985 11 19 11C18.4536 11 17.9413 10.8539 17.5 10.5987C17.0587 10.8539 16.5464 11 16 11C14.3431 11 13 9.65685 13 8C13 7.60975 13.0745 7.23691 13.2101 6.89492C11.9365 6.54821 11 5.38347 11 4C11 3.66387 11.0553 3.34065 11.1572 3.03894C6.58185 3.46383 3 7.31362 3 12C3 16.9706 7.02944 21 12 21Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
120          </svg></div>
121      </div>
122      <div fs-cc-scroll="disable" fs-cc="preferences" class="cc-prefs_component">
123        <div class="fs-cc-prefs2_form-wrapper w-form">
124          <form id="cookie-preferences" name="wf-form-Cookie-Preferences" data-name="Cookie Preferences" method="get" class="fs-cc-prefs2_form" data-wf-page-id="688a54756c71954566b98f1b" data-wf-element-id="c4bd1fb6-5502-677d-1794-351bc3102070">
125            <div fs-cc="close" class="fs-cc-prefs2_close">
126              <div class="fs-cc-preferences2_close-icon w-embed"><svg fill="currentColor" aria-hidden="true" focusable="false" viewBox="0 0 16 16">
127                  <path d="M9.414 8l4.293-4.293-1.414-1.414L8 6.586 3.707 2.293 2.293 3.707 6.586 8l-4.293 4.293 1.414 1.414L8 9.414l4.293 4.293 1.414-1.414L9.414 8z"></path>
128                </svg></div>
129            </div>
130            <div class="fs-cc-prefs2_content">
131              <div class="fs-cc-prefs2_space-small">
132                <div class="fs-cc-prefs2_title">Privacy Preferences</div>
133              </div>
134              <div class="fs-cc-prefs2_option">
135                <div class="fs-cc-prefs2_toggle-wrapper">
136                  <div class="fs-cc-prefs2_label">Essential cookies</div>
137                  <div>Required</div>
138                </div>
139              </div>
140              <div class="fs-cc-prefs2_option">
141                <div class="fs-cc-prefs2_toggle-wrapper">
142                  <div class="fs-cc-prefs2_label">Marketing cookies</div><label class="w-checkbox fs-cc-prefs2_checkbox-field">
143                    <div class="w-checkbox-input w-checkbox-input--inputType-custom fs-cc-prefs2_checkbox"></div><input type="checkbox" id="marketing-2" name="marketing-2" data-name="Marketing 2" fs-cc-checkbox="marketing" style="opacity:0;position:absolute;z-index:-1"><span for="marketing-2" class="fs-cc-prefs2_checkbox-label w-form-label">Essential</span>
144                  </label>
145                </div>
146              </div>
147              <div class="fs-cc-prefs2_option">
148                <div class="fs-cc-prefs2_toggle-wrapper">
149                  <div class="fs-cc-prefs2_label">Personalization cookies</div><label class="w-checkbox fs-cc-prefs2_checkbox-field">
150                    <div class="w-checkbox-input w-checkbox-input--inputType-custom fs-cc-prefs2_checkbox"></div><input type="checkbox" id="personalization-2" name="personalization-2" data-name="Personalization 2" fs-cc-checkbox="personalization" style="opacity:0;position:absolute;z-index:-1"><span for="personalization-2" class="fs-cc-prefs2_checkbox-label w-form-label">Essential</span>
151                  </label>
152                </div>
153              </div>
154              <div class="fs-cc-prefs2_option">
155                <div class="fs-cc-prefs2_toggle-wrapper">
156                  <div class="fs-cc-prefs2_label">Analytics cookies</div><label class="w-checkbox fs-cc-prefs2_checkbox-field">
157                    <div class="w-checkbox-input w-checkbox-input--inputType-custom fs-cc-prefs2_checkbox"></div><input type="checkbox" id="analytics-2" name="analytics-2" data-name="Analytics 2" fs-cc-checkbox="analytics" style="opacity:0;position:absolute;z-index:-1"><span for="analytics-2" class="fs-cc-prefs2_checkbox-label w-form-label">Essential</span>
158                  </label>
159                </div>
160              </div>
161              <div class="fs-cc-prefs2_buttons-wrapper">
162                <a fs-cc="deny" href="#" class="fs-cc-prefs2_button fs-cc-button-alt w-button">
162Reject all cookies</a>
163                <a fs-cc="allow" href="#" class="fs-cc-prefs2_button w-button">Allow all cookies</a>
164                <a fs-cc="submit" href="#" class="fs-cc-prefs2_submit w-button">Save preferences</a>
165              </div>
166            </div>
167          </form>
168          <div class="form-done"></div>
169          <div class="form-fail"></div>
170          <div fs-cc="close" class="fs-cc-prefs2_overlay"></div>
171        </div>
172      </div>
173    </div>
174    <div class="global-styles w-embed">
175      <style>
176/* Snippet gets rid of top margin on first element in any rich text*/
177.w-richtext>:first-child {
178	margin-top: 0;
179}
180/* Snippet gets rid of bottom margin on last element in any rich text*/
181.w-richtext>:last-child, .w-richtext ol li:last-child, .w-richtext ul li:last-child {
182    margin-bottom: 0;
183}
184/* Snippet makes all link elements listed below to inherit color from their parent */
185a, 
186.w-tab-link,
187.w-nav-link,
188.w-dropdown-btn,
189.w-dropdown-toggle,
190.w-dropdown-link
191{
192color: inherit;
193}
194/* Snippet prevents all click and hover interaction with an element */
195.clickable-off {
196  pointer-events: none;
197}
198/* Snippet enables all click and hover interaction with an element */
199.clickable-on{
200  pointer-events: auto;
201}
202/* Snippet enables you to add class of div-square which creates and maintains a 1:1 dimension of a div.*/
203.div-square::after {
204  content: "";
205  display: block;
206  padding-bottom: 100%;
207}
208/*Hide focus outline for main content element*/
209    main:focus-visible {
210    outline: -webkit-focus-ring-color auto 0px;
211}
212/* Make sure containers never lose their center alignment*/
213.container-medium, .container-small, .container-large {
214  margin-right: auto !important;
215  margin-left: auto !important;
216}
217/*Reset selects, buttons, and links styles*/
218.w-input, .w-select, a {
219color: inherit;
220text-decoration: inherit;
221font-size: inherit;
222}
223/*Apply "..." after 3 lines of text */
224.text-style-3lines {
225    display: -webkit-box;
226    overflow: hidden;
227    -webkit-line-clamp: 3;
228    -webkit-box-orient: vertical;
229}
230/* Apply "..." after 2 lines of text */
231.text-style-2lines {
232    display: -webkit-box;
233    overflow: hidden;
234    -webkit-line-clamp: 2;
235    -webkit-box-orient: vertical;
236}
237/* Apply "..." at 100% width */
238.truncate-width { 
239		width: 100%; 
240    white-space: nowrap; 
241    overflow: hidden; 
242    text-overflow: ellipsis; 
243}
244/* Removes native scrollbar */
245.no-scrollbar {
246    -ms-overflow-style: none;  // IE 10+
247    overflow: -moz-scrollbars-none;  // Firefox
248}
249.no-scrollbar::-webkit-scrollbar {
250    display: none; // Safari and Chrome
251}
252</style>
253    </div>
254    <div data-w-id="ce85d16e-26b7-7573-f811-840851a2151f" class="nav-overlay-trigger"></div>
255    <main class="main-wrapper">
256      <div data-animation="over-right" class="navbar16_component-2 w-nav" data-wf--navbar--variant="base" data-easing2="ease-in-out" fs-scrolldisable-element="smart-nav" data-easing="ease-in-out" data-collapse="all" data-w-id="1796619c-210e-7b56-7325-c9d40848c13b" role="banner" data-no-scroll="1" data-duration="300" data-doc-height="1">
257        <div class="navbar16_container-3 is-home">
258          <a href="#" class="nav-logo-wrapper mobil-hidden w-inline-block"><img loading="eager" src="images/BLOG_1.svg" alt="" class="nav-logo-big"></a>
259          <div class="navbar16_wrapper-2">
260            <nav role="navigation" class="navbar16_menu-3 w-nav-menu">
261              <div class="navbar16_menu-wrapper-2">
262                <div class="navbar16_links-wrapper-2">
263                  <a href="index.html" class="navbar16_link-2 w-nav-link">Home</a>
264                  <a href="about.html" class="navbar16_link-2 w-nav-link">About</a>
265                  <a href="news.html" class="navbar16_link-2 w-nav-link">News</a>
266                  <a href="calendar.html" class="navbar16_link-2 w-nav-link">Calendar</a>
267                  <a href="latest-work.html" class="navbar16_link-2 w-nav-link">Latest Work</a>
268                  <a href="works.html" class="navbar16_link-2 w-nav-link">All Works</a>
269                  <a href="media.html" class="navbar16_link-2 w-nav-link">Media</a>
270                  <a href="/media#compositions" class="navbar16_link-2 media w-nav-link">COMPOSITIONS</a>
271                  <a href="/media#improvisations" class="navbar16_link-2 media w-nav-link">IMPROVISATIONS</a>
272                  <a href="/media#publications" class="navbar16_link-2 media w-nav-link">PUBLICATIONS</a>
273                  <a href="/media#press" class="navbar16_link-2 media w-nav-link">PRESS</a>
274                  <a href="/media#features" class="navbar16_link-2 media w-nav-link">Features</a>
275                  <a href="/media#gallery" class="navbar16_link-2 media margin-bottom-bigger w-nav-link">Gallery</a>
276                  <a href="blog.html" aria-current="page" class="navbar16_link-2 w-nav-link w--current">Blog</a>
277                  <a href="/#contact" class="navbar16_link-2 w-nav-link">Contact</a>
278                </div>
279              </div>
280            </nav>
281            <div class="navbar16_menu-button-2 w-nav-button">
282              <div class="menu-icon4-2">
283                <div class="menu-icon4_wrapper-2">
284                  <div class="menu-icon4_line-top-2"></div>
285                  <div class="middle-line-wrapper">
286                    <div class="menu-icon4_line-middle-2"></div>
287                    <div class="menu-icon4_line-middle--when-open-2"></div>
288                  </div>
289                  <div class="menu-icon4_line-bottom-2"></div>
290                </div>
291              </div>
292            </div>
293          </div>
294        </div>
295      </div>
296      <header class="hero-section">
297        <div class="hero-contents">
298          <div class="hero-container padding-top"><img src="images/BLOG_1.svg" loading="eager" alt="" class="hero-heading blog"></div>
299        </div><img class="hero-img" src="/assets/6ecf75f8-ee33-4c63-b05a-000524a5650b/BLOG-PIC.webp" alt="" style="-webkit-transform: translate3d(0, 0, 0) scale3d(1.2, 1.2, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); -moz-transform: translate3d(0, 0, 0) scale3d(1.2, 1.2, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); -ms-transform: translate3d(0, 0, 0) scale3d(1.2, 1.2, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); transform: translate3d(0, 0, 0) scale3d(1.2, 1.2, 1) rotateX(0) rotateY(0) rotateZ(0) skew(0, 0); object-position: 50.04% 61.02%;" loading="eager">
300        <div class="hero-slide-contents">
301          <div class="padding-global height-100">
302            <div class="container-large bigger height-100">
303              <div class="flex-bottom-left">
304                <div class="text-color-secondary">
305                  <div class="h5-text" style="display: none;">LOREM IPSUM DOLOR SIT | Lorem Ipsum dolor sit</div>
306                </div>
307              </div>
308            </div>
309          </div>
310        </div>
311      </header>
312      <section>
313        <div class="padding-global">
314          <div class="container-large">
315            <div class="margin-section-large">
316              <div class="blog-items-wrapper"><div class="section-grid is-blog-item">
317                  <div class="width-50">
318                    <div data-w-id="713918a3-d373-292e-a03c-864b2640b5cc" class="slidein-wrapper">
319                      <div class="slidein-contents">
320                        <div class="light-section">
321                          <div class="blog-padding">
322                            <div class="margin-bottom64">
323                              <div data-wf--section-heading-wrapper--variant="base" class="section-heading-wrapper padding">
324                                <div class="section-heading-inline">
325                                  <div class="bg-line-wrapper"></div>
326                                  <div class="bg-line-wrapper left"></div>
327                                  <div class="z-index-2">
328                                    <div class="section-heading-padding">
329                                      <div class="text-color-secondary">
330                                        <div class="text-align-center">
331                                          <h2 class="h2-text uppercase">Double bass week</h2>
332                                        </div>
333                                      </div>
334                                    </div>
335                                  </div>
336                                </div>
337                              </div>
338                            </div>
339                            <div class="padding-horizontal-50">
340                              <div class="margin-bottom30">
341                                <div class="text-color-secondary">
342                                  <h3 class="h4-text krok">07.03.2026</h3>
343                                </div>
344                              </div>
345                              <div class="margin-bottom20">
346                                <div class="h6-text w-richtext"><p>Last week was double bass week! On two consecutive nights I got to collaborate with two of my favorite double bass players. First, on 28.2, Florentin Ginot premiered the piece I composed for him last year, <em>To the</em> <em>bone</em>, for double bass and FX pedals at the Concertgebouw Brugge. I got to know Florentin personally when I was invited to collaborate with the formidable musikFabrik ensemble in 2018. After that project, Florentin approached me for other collaborations, first with musikFabrik, and later in different projects as a duo with him, each time in an improvisational context, where I would play live-electronics. One project was rather dark, with machines that would deteriorate and melt during the performance. &nbsp;The other, a <a href="https://www.youtube.com/watch?v=B-8gIeG5P8Y">&nbsp;video work</a>, in collaboration with video artist Janet Sinica, was much lighter and slightly absurd.</p>
347<p>A bit later, in 2023 I told Florentin: "I want to write a composition for you! Are you in?". He was, and proposed to write a piece that would include his ever growing FX pedal setup. And then serendipity helped us a bit. When I mentioned this project in an informal talk with Jan De Moor of the Concertgebouw Brugge, his eyes started shining just a shade brighter, and proposed to commission this work. And after a lovely experience with the Frequenz_ Kiel Festival several years earlier, I contacted its curator, Sherif El Razzaz, who agreed on becoming the second commissioner.</p>
348<p>&nbsp;</p>
349<p>"To the bone" was actually written twice. A first version was finished in May 2025. When we workshopped the fresh score at the musikFabrik studios shortly thereafter, Florentin accidentally amplified his bass too much at one point, creating a beautiful, deep, room-filling feedback sound. We dived into this black (feedback) hole, and when I got home that evening, I threw away about a third of the composition and started working on a new version, which would incorporate this new material. Two months later, the second version was ready. <a href="https://www.youtube.com/watch?v=bEFxfVUVRi8">Here</a> you can see the live performance from the premiere at the Concertgebouw Brugge on 28.2.2026.</p>
350<p>&nbsp;</p>
351<p>"To the bone" was not only inspired by Florentin's playing and setup, but also by my long-time collaboration with Belgian double bass improviser <a href="https://www.jacquemyn.com">Peter Jacquemyn</a> and his approach to the instrument. It was wonderful then, that, the day after the premiere of <em>To the bone</em>, I could play an improvised set with Peter Jacquemyn in a squat in Brussels. As always, playing with Peter is walking - no, running and jumping - on a razor's edge: exploding energy, quick changes and constant twists and turns. Not for the week of heart! But truly invigorating (at least for me!). Our duo recordings are already 10 years old, and we pledged to make some new recordings in the near future. Now let's wait for serendipity to do its work. For now, you can hear one track <a href="https://soundcloud.com/stefan-prins/cloudchamber-altostratustranslucidisundulatus">here</a> (if you want to buy the full album, you can drop me a note). &nbsp;</p></div>
352                              </div>
353                              <div class="text-align-right">
354                                <a href="https://www.youtube.com/watch?v=bEFxfVUVRi8" class="btn w-inline-block" target="_blank">
355                                  <div>More</div>
356                                </a>
357                              </div>
358                            </div>
359                          </div>
360                        </div>
361                      </div>
362                      <div class="slidein-overlay"></div>
363                    </div>
364                  </div>
365                  <div class="width-50 img">
366                    <div data-w-id="d5edb5e7-4f8f-bf5a-0a97-fa8c4f467f4c" class="slidein-wrapper">
367                      <div class="slidein-contents">
368                        <a href="https://www.youtube.com/watch?v=bEFxfVUVRi8" class="is-relative w-inline-block" target="_blank">
369                          <div class="absolut-img-wrapper"><img src="/assets/d4389197-f26b-4f65-8085-c99a43e10edd/double_bass_week.webp" loading="eager" alt="Double bass week" class="absolut-img" style="object-position: 50.00% 50.00%;"></div>
370                        </a>
371                      </div>
372                      <div class="slidein-overlay"></div>
373                    </div>
374                  </div>
375                </div><div class="section-grid is-blog-item">
376                  <div class="width-50">
377                    <div data-w-id="713918a3-d373-292e-a03c-864b2640b5cc" class="slidein-wrapper">
378                      <div class="slidein-contents">
379                        <div class="light-section">
380                          <div class="blog-padding">
381                            <div class="margin-bottom64">
382                              <div data-wf--section-heading-wrapper--variant="base" class="section-heading-wrapper padding">
383                                <div class="section-heading-inline">
384                                  <div class="bg-line-wrapper"></div>
385                                  <div class="bg-line-wrapper left"></div>
386                                  <div class="z-index-2">
387                                    <div class="section-heading-padding">
388                                      <div class="text-color-secondary">
389                                        <div class="text-align-center">
390                                          <h2 class="h2-text uppercase">Cyborg Flesh: take 2</h2>
391                                        </div>
392                                      </div>
393                                    </div>
394                                  </div>
395                                </div>
396                              </div>
397                            </div>
398                            <div class="padding-horizontal-50">
399                              <div class="margin-bottom30">
400                                <div class="text-color-secondary">
401                                  <h3 class="h4-text krok">10.09.2025</h3>
402                                </div>
403                              </div>
404                              <div class="margin-bottom20">
405                                <div class="h6-text w-richtext"><p><em>Cyborg Flesh</em>, a 55-minute long composition for string quartet (Arditti Quartet), &nbsp;e-guitar (Yaron Deutsch) and live-electronics (me), was supposed to be premiered at the Wien Modern festival in November 2024, to celebrate the 50th anniversary of the Arditti Quartet.</p>
406<p>&nbsp;</p>
407<p>One week before the premiere, however, Lukas Fels broke his arm. The premiere had to be postponed to 2025, and the planned second performance at the Rainy Days Festival in Luxembourg, to 2026. However, Catherine Kontz, artistic director of Rainy Days, was so kind to still offer us the stage at the planned date, and proposed that we work out a concert program without Lukas and his cello. For this concert I proposed a 50-minute musical structure <em>(Broken|Glued)</em> that moves seamlessly between several sections of <em>Cyborg Flesh</em>, some improvisations, Klaus Lang's electric guitar solo <em>Chansons Lointaine et douce, </em>and Hilda Paredes' transcription of Dowland's <em>In Darkness Let me Dwell</em>, with the electric guitar replacing the cello.&nbsp;</p>
408<p>&nbsp;</p>
409<p>Lukas has recovered fully by now (hurray!), and the true premiere of <em>Cyborg Flesh</em> is approaching quickly (31/10/2025). I've started to reacquaint myself with this work, which I worked on for about a year (July 2023 to July 2024), but which, right now, still feels like a <em>fremdkörper</em>, after having had to put it in the fridge for a year. Perhaps that is how it feels to have cyborg flesh?</p>
410<p>&nbsp;</p>
411<p>Cyborg Flesh is a commission by the Arditti Quartet, Wien Modern &amp; Rainy Days Festival, supported financially by the Ernst von Siemens Musikstiftung.</p></div>
412                              </div>
413                              <div class="text-align-right">
414                                <a href="https://www.wienmodern.at/2025-arditti-511-de-4315" class="btn w-inline-block" target="_blank">
415                                  <div>More</div>
416                                </a>
417                              </div>
418                            </div>
419                          </div>
420                        </div>
421                      </div>
422                      <div class="slidein-overlay"></div>
423                    </div>
424                  </div>
425                  <div class="width-50 img">
426                    <div data-w-id="d5edb5e7-4f8f-bf5a-0a97-fa8c4f467f4c" class="slidein-wrapper">
427                      <div class="slidein-contents">
428                        <a href="https://www.wienmodern.at/2025-arditti-511-de-4315" class="is-relative w-inline-block" target="_blank">
429                          <div class="absolut-img-wrapper"><img src="/assets/6121bdf7-ed55-4c52-822c-16e8e959a9cf/cyborgflesh-preps-2.webp" loading="eager" alt="Cyborg Flesh: take 2" class="absolut-img" style="object-position: 50.00% 50.00%;"></div>
430                        </a>
431                      </div>
432                      <div class="slidein-overlay"></div>
433                    </div>
434                  </div>
435                </div></div>
436            </div>
437          </div>
438        </div>
439      </section>
440      <footer class="footer">
441        <div class="w-layout-grid footer_grid">
442          <div id="w-node-_3f8a519d-e42a-33a3-9e93-b9a22482b781-2482b77f" class="footer_wrapper">
443            <a href="imprint.html" class="w-inline-block">
444              <div class="coopyright_text created">Imprint</div>
445            </a>
446            <div class="coopyright_text created">|</div>
447            <a href="privacy-policy.html" class="w-inline-block">
448              <div
448 class="coopyright_text created">Privacy Policy</div>
449            </a>
450          </div>
451          <div id="w-node-_3f8a519d-e42a-33a3-9e93-b9a22482b788-2482b77f" class="coopyright_text">©<span class="copyright-year">YEAR</span> Stefan Prins</div>
452          <div id="w-node-_3f8a519d-e42a-33a3-9e93-b9a22482b78a-2482b77f" class="footer_wrapper">
453            <div class="coopyright_text created">created by</div>
454            <a href="https://www.dreher-media.de" target="_blank" class="w-inline-block"><img src="images/dreher.media-logo_website-white.svg" loading="lazy" alt="" class="dreher-media-logo"></a>
455          </div>
456        </div>
457      </footer>
458    </main>
459  </div>
460  
460<script src="https://d3e54v103j8qbb.cloudfront.net/js/jquery-3.5.1.min.dc5e7f18c8.js?site=6888085c617ef31b88797ced" type="text/javascript" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
460
461  
461<script src="js/stefan-prins.js" type="text/javascript"></script>
461
462  
462<script>
463  // Functionality for fs-cc-reject
464  let initFsCCListener = false;
465  function handleFsCcReject() {
466    if (!window.FsCC) {
467      setTimeout(handleFsCcReject, 200);
468      return;
469    }
470    if (!initFsCCListener) { 
471      // Add a listener for changes in consent preferences
472      window.FsCC.consentController.on('updateconsents', (consents) => {
473        handleFsCcReject(); // Run the function whenever consent changes
474      });
475    }
476    // Iterate through all elements with fs-cc-reject attributes
477    document.querySelectorAll('[fs-cc-reject]').forEach((rejectElement) => {
478      const category = rejectElement.getAttribute('fs-cc-reject'); // Get the consent category
479      const isConsentGiven = window.FsCC.store.consents[category]; // Check if consent is granted for the category
480      const consentElement = document.querySelector('[fs-cc="' + category + '"]'); // Find the corresponding fs-cc element
481      // Toggle visibility based on consent state
482      if (isConsentGiven) {
483        rejectElement.style.display = 'none'; // Hide the reject element
484        if (consentElement) consentElement.style.display = 'block'; // Show the consented content
485      } else {
486        rejectElement.style.display = 'block'; // Show the reject element
487        if (consentElement) consentElement.style.display = 'none'; // Hide the consented content
488      }
489    });
490  }
491  // Run the script on page load
492  document.addEventListener('DOMContentLoaded', handleFsCcReject);
493</script>
493
494  
494<script>
495  Webflow.push(function() {
496    $('.copyright-year').text(new Date().getFullYear());
497  });
498  Webflow.push(function() {
499    //DISABLE WEBFLOW SMOOTH SCROLL
500    $(function() {
501      $(document).off('click.wf-scroll');
502    });
503  });
504  window.addEventListener('load', (event) => {
505    const routeName = window.location.pathname?.split('/')?.slice(-1)?.[0]
506    document
507      .querySelectorAll('a[href*="' + routeName + '"]')
508      ?.forEach((el) => el?.classList?.add('w--current'))
509  })
510  function addSeparatorsByDataAttribute() {
511    // Find all elements in the document
512    const matchingElements = document.querySelectorAll('[data-separator]');
513    // Process each matching element
514    matchingElements.forEach(element => {
515      // Get the separator text from the data-separator attribute
516      const separatorText = element.getAttribute('data-separator');
517      // Get all child elements of the current element
518      const children = Array.from(element.children);
519      // Iterate through the children and insert separators
520      children.forEach((child, index) => {
521        if (index < children.length - 1) { // No separator after the last child
522          // Create a new separator element (you could change this to suit)
523          const separator = document.createElement('span');
524          separator.innerHTML = '&nbsp;' + separatorText + '&nbsp;'; // Set separator text
525          // Insert the separator after the current child
526          child.insertAdjacentElement('afterend', separator);
527        }
528      });
529    });
530  }
531  addSeparatorsByDataAttribute();
532  document.querySelectorAll('.tab-link')
533    ?.forEach((el) => el.addEventListener('click', (event) => {
534    const tabGroup = el.dataset.tabGroup;
535    if (tabGroup) {
536      document.querySelector('.tab-link.active[data-tab-group="' + tabGroup + '"]')?.classList?.remove('active')
537    } else {
538      el.parentNode.querySelector('.tab-link.active')?.classList?.remove('active')
539    }
540    el.classList.add('active')
541  }))
542  document.querySelectorAll('.biography-lang-links .tab-link')
543    ?.forEach((el) => el.addEventListener('click', (event) => {
544    const lang = el.dataset?.lang
545    document.querySelectorAll('.biography-text:not(.' + lang + ')')
546      ?.forEach((bioEl) => bioEl.style.display = 'none')
547    document.querySelectorAll('.biography-text.' + lang)
548      ?.forEach((bioEl) => bioEl.style.display = 'block')
549  }))
550  document.querySelectorAll('.tab-link[data-tab-id]')
551    ?.forEach(function(el) {
552    el.addEventListener('click', function(event) {
553      var tabId = el.dataset ? el.dataset.tabId : null;
554      var tabGroup = el.dataset ? el.dataset.tabGroup : null;
555      // Build a selector for the containers we want to control
556      // Only target NON-tab-link elements that have data-tab-id
557      var baseSelector = ':not(.tab-link)[data-tab-id]';
558      // If the clicked tab belongs to a group, limit to the same group
559      if (tabGroup) {
560        baseSelector += '[data-tab-group="' + tabGroup + '"]';
561      }
562      // Hide containers in scope that don't match the tabId
563      document.querySelectorAll(baseSelector + ':not([data-tab-id*="' + tabId + '"])')
564        ?.forEach(function(tabEl) {
565        tabEl.style.display = 'none';
566      });
567      // Show containers in scope that match the tabId
568      document.querySelectorAll(baseSelector + '[data-tab-id*="' + tabId + '"]')
569        ?.forEach(function(tabEl) {
570        tabEl.style.display = 'block';
571      });
572    });
573  });
574  const videoSwipers = []
575</script>
575
576  
576<script src="https://cdn.plyr.io/3.7.8/plyr.polyfilled.js"></script>
576
577  
577<script src="https://www.youtube.com/iframe_api"></script>
577
578  
578<script src="https://player.vimeo.com/api/player.js"></script>
578
579  
579<script src="https://geo.dailymotion.com/libs/player.js"></script>
579
580  
580<script>
581  const plyrPlayers = Plyr.setup('._init-plyr');
582  var youtube = document.querySelectorAll('.youtube');
583  const players = {};
584  let init = false;
585  function onYouTubeIframeAPIReady() {
586    init = true;
587    for (const el of youtube) {
588      el.addEventListener('click', () => {
589        const customEmbed = el.querySelector('[data-custom-embed]');
590        if (customEmbed) {
591          el.innerHTML = customEmbed.innerHTML;
592        }
593        const id = 'player_' + el.dataset.id;
594        const type = el.dataset.type;
595        const videoId = el.dataset.videoId;
596        const time = el.dataset.time || 0;  // Start time in seconds
597        onPlay(id);  // Manage autoplay functionality
598        let player;
599        // YouTube Player
600        if (type === 'youtube') {
601          player = new YT.Player(id, {
602            videoId: videoId,
603            playerVars: {
604              start: time,
605            },
606            events: {
607              onReady: (event) => {
608                event.target.playVideo();
609              },
610              onStateChange: (event) => {
611                if (event.data === YT.PlayerState.PLAYING) {
612                  onPlay(id);
613                } else if (
614                  event.data === YT.PlayerState.PAUSED ||
615                  event.data === YT.PlayerState.ENDED
616                ) {
617                  onPause(id);
618                }
619              },
620            },
621          });
622          // YouTube Playlist Player
623        } else if (type === 'youtube-playlist') {
624          player = new YT.Player(id, {
625            playerVars: {
626              listType: 'playlist',
627              list: videoId,  // playlist ID
628              start: time,
629            },
630            events: {
631              onReady: (event) => {
632                event.target.playVideo();
633              },
634              onStateChange: (event) => {
635                if (event.data === YT.PlayerState.PLAYING) {
636                  onPlay(id);
637                } else if (
638                  event.data === YT.PlayerState.PAUSED ||
639                  event.data === YT.PlayerState.ENDED
640                ) {
641                  onPause(id);
642                }
643              },
644            },
645          });
646          // YouTube Live Player
647        } else if (type === 'youtube-live') {
648          player = new YT.Player(id, {
649            videoId: videoId,
650            playerVars: {
651              start: time,
652            },
653            events: {
654              onReady: (event) => {
655                event.target.playVideo();
656              },
657              onStateChange: (event) => {
658                if (event.data === YT.PlayerState.PLAYING) {
659                  onPlay(id);
660                } else if (
661                  event.data === YT.PlayerState.PAUSED ||
662                  event.data === YT.PlayerState.ENDED
663                ) {
664                  onPause(id);
665                }
666              },
667            },
668          });
669          // Vimeo Player
670        } else if (type === 'vimeo') {
671          document.getElementById(id).innerHTML = '';
672          player = new Vimeo.Player(id, {
673            id: videoId,
674            autoplay: true,
675            start: time,
676          });
677          player.on('play', () => onPlay(id));
678          player.on('pause', () => onPause(id));
679          // Dailymotion Player (using Player Library Script)
680        } else if (type === 'dailymotion') {
681          const container = document.getElementById(id);
682          // Create Dailymotion player instance using Player Library
683          dailymotion.createPlayer(id, {
684            video: videoId,
685            params: {
686              autoplay: 1,
687              start: time,
688              mute: false,  // Adjust other parameters as needed
689            }
690          })
691            .then((playerInstance) => {
692            console.log('Dailymotion Player initialized:', playerInstance);
693            // Attach event listeners for play, pause, and ended events
694            playerInstance.on('play', () => onPlay(id));
695            playerInstance.on('pause', () => onPause(id));
696            playerInstance.on('ended', () => onPause(id));
697            // Store the player instance for later control
698            players[id] = { type: 'dailymotion', player: playerInstance };
699          })
700            .catch((error) => console.error('Error initializing Dailymotion player:', error));
701        }
702        // Store the player instance (for YouTube, YouTube Playlist, YouTube Live, or Vimeo)
703        players[id] = { type, player };
704      });
705    }
706  }
707  const pauseAllPlayers = (id = null) => {
708    for (const [key, value] of Object.entries(players)) {
709      if (id === key) continue;
710      if (value.type === 'youtube') {
711        value.player.pauseVideo();
712      } else if (value.type === 'vimeo') {
713        value.player.pause();
714      } else if (value.type === 'dailymotion') {
715        value.player.pause();  // Pause Dailymotion video using the Player Library
716      }
717    }
718  };
719  const onPlay = (id) => {
720    pauseAllPlayers(id);
721    videoSwipers?.forEach((swiper) => {
722      swiper.autoplay.stop();
723    });
724  };
725  const onPause = (id) => {
726    videoSwipers?.forEach((swiper) => {
727      swiper.autoplay.start();
728    });
729  };
730  document.addEventListener("DOMContentLoaded", () => {
731    videoSwipers?.forEach((swiper) => {
732      swiper.on('slideChange', () => {
733        pauseAllPlayers();
734      });
735    });
736    setTimeout(() => {
737      if (!init) {
738        onYouTubeIframeAPIReady();
739      }
740    }, 500);
741  });
742  const checkYouTubeThumbnails = (el, currentIndex = 0) => {
743    if (el.naturalWidth > 120) return
744    const thumbnailSizes = [
745      'maxresdefault',
746      'sddefault',
747      'hqdefault',
748      'mqdefault',
749      'default',
750    ]
751    if (currentIndex >= thumbnailSizes.length) {
752      return
753    }
754    const size = thumbnailSizes[currentIndex]
755    const originalSrc = el.src
756    const img = new Image()
757    img.onload = function () {
758      if (img.naturalWidth > 120) {
759        el.src = img.src
760      } else {
761        checkYouTubeThumbnails(el, currentIndex + 1)
762      }
763    }
764    img.onerror = function () {
765      checkYouTubeThumbnails(el, currentIndex + 1)
766    }
767    img.src = originalSrc.replace(/maxresdefault/, size)
768  }
769  document.querySelectorAll('.youtube img').forEach((el) => {
770    checkYouTubeThumbnails(el)
771  })
772</script>
772
773  
773<script>
774  // Function to download a file
775  function downloadFile(url, filename) {
776    const link = document.createElement('a');
777    link.href = url;
778    link.download = filename || url.split('/').pop(); // Use filename if provided, otherwise extract from URL
779    document.body.appendChild(link);
780    link.click();
781    document.body.removeChild(link);
782  }
783  // Add event listeners to all elements with the [data-download-href] attribute
784  document.querySelectorAll('[data-download-href]').forEach(element => {
785    element.addEventListener('click', function(event) {
786      event.preventDefault(); // Prevent the default action (if it's a link)
787      event.stopPropagation();
788      const url = element.getAttribute('data-download-href');
789      const filename = element.getAttribute('data-download-filename'); // Optional filename attribute
790      downloadFile(url, filename);
791    });
792  });
793</script>
793
794</body></html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.