James Li, also known as Zi Jun Li, is a Hong Kong-born violinist based in the United Kingdom, active as a soloist, recitalist and chamber musician. From September 2026, he will undertake the Artist Diploma in Performance at the Royal College of Music, London, following a Master of Arts in Violin Performance with Distinction and a Bachelor of Arts (Hons) in Violin Performance with First-Class Honours from Mozarteum University Salzburg, Austria.Recent honours include the Absolute First Prize and Special Prizes at the International Competition Music Academy FORTE in Belgium, First Prize at the International Competition Giovani Musicisti – Città di Treviso, and Second Prize at the Concorso Internazionale Musicale “Città di Cervignano” in Italy. He has performed as a soloist, recitalist and chamber musician across Europe, Asia and North America.James’s principal conservatoire teachers include Adrian Levine, Wonji Kim-Ozim and Pierre Amoyal. His earlier musical development was guided by Wing Shun Lee, Kiann Chow and Vivian Leung, whose teaching laid an important foundation for his later studies.James performs on a violin made by Enrico Marchetti in Turin in 1902.
Media
J. S. Bach — Partita No. 3 in E major, BWV 1006
James Li, violin
Select a movement
(() => { const container = document.getElementById('jl-bach-recording'); if ( !container || container.dataset.initialised === 'yes' ) { return; } container.dataset.initialised = 'yes'; const audio = container.querySelector('.jl-bach-audio'); const movementButtons = container.querySelectorAll('.jl-movement'); const completeButton = container.querySelector('.jl-complete-button'); const completeLabel = container.querySelector('.jl-complete-label'); let playbackMode = null; let selectedEnd = null; let activeMovement = null; let actionNumber = 0; function wait(milliseconds) { return new Promise(resolve => { window.setTimeout( resolve, milliseconds ); }); } function pauseOtherRecordings() { document.querySelectorAll('audio').forEach(item => { if ( item !== audio && !item.paused ) { item.pause(); } }); } function anotherRecordingIsPlaying() { return Array.from( document.querySelectorAll('audio') ).some(item => { return ( item !== audio && !item.paused ); }); } function waitForMetadata() { if ( audio.readyState >= 1 && Number.isFinite(audio.duration) ) { return Promise.resolve(); } return new Promise((resolve, reject) => { const loaded = () => { cleanup(); resolve(); }; const failed = () => { cleanup(); reject( audio.error || new Error( 'The Bach recording could not be loaded.' ) ); }; const cleanup = () => { audio.removeEventListener( 'loadedmetadata', loaded ); audio.removeEventListener( 'error', failed ); }; audio.addEventListener( 'loadedmetadata', loaded, { once: true } ); audio.addEventListener( 'error', failed, { once: true } ); audio.load(); }); } async function seekTo(timeInSeconds) { await waitForMetadata(); const maximumTime = Number.isFinite(audio.duration) ? Math.max( 0, audio.duration - 0.1 ) : timeInSeconds; const targetTime = Math.max( 0, Math.min( timeInSeconds, maximumTime ) ); if ( Math.abs( audio.currentTime - targetTime ) < 0.05 ) { return; } await new Promise((resolve, reject) => { let timeout; const seekCompleted = () => { cleanup(); resolve(); }; const seekFailed = () => { cleanup(); reject( audio.error || new Error( 'The recording could not be positioned.' ) ); }; const cleanup = () => { window.clearTimeout(timeout); audio.removeEventListener( 'seeked', seekCompleted ); audio.removeEventListener( 'error', seekFailed ); }; audio.addEventListener( 'seeked', seekCompleted, { once: true } ); audio.addEventListener( 'error', seekFailed, { once: true } ); try { audio.currentTime = targetTime; } catch (error) { cleanup(); reject(error); return; } timeout = window.setTimeout(() => { cleanup(); resolve(); }, 1800); }); } function clearMovementPlaying() { movementButtons.forEach(button => { button.classList.remove( 'is-playing' ); }); } function clearMovementSelection() { movementButtons.forEach(button => { button.classList.remove( 'is-active', 'is-playing' ); }); activeMovement = null; } function showCompletePlay() { completeLabel.textContent = 'Listen to complete recording'; completeButton.setAttribute( 'aria-label', 'Play complete Bach Partita' ); completeButton.setAttribute( 'aria-pressed', 'false' ); completeButton.classList.remove( 'is-playing' ); } function showCompletePause() { completeLabel.textContent = 'Listen to complete recording'; completeButton.setAttribute( 'aria-label', 'Pause complete Bach Partita' ); completeButton.setAttribute( 'aria-pressed', 'true' ); completeButton.classList.add( 'is-playing' ); } movementButtons.forEach(button => { button.addEventListener( 'click', async () => { const start = Number( button.dataset.start ); const end = Number( button.dataset.end ); const delay = Number( button.dataset.delay || 0 ); /* Clicking the currently selected movement pauses or resumes it. */ if ( playbackMode === 'movement' && activeMovement === button ) { if (audio.paused) { pauseOtherRecordings(); try { await audio.play(); } catch (error) { console.error( 'Bach playback failed:', error ); } } else { audio.pause(); } return; } actionNumber += 1; const thisAction = actionNumber; audio.pause(); pauseOtherRecordings(); clearMovementSelection(); playbackMode = 'movement'; selectedEnd = end; activeMovement = button; /* Selected movement remains highlighted. Rotating disc is added later by the 'playing' event only when audio begins. */ button.classList.add( 'is-active' ); showCompletePlay(); try { await seekTo(start); /* Preludio requires a small artificial pause, since the MP3 begins very close to its first note. */ if (delay > 0) { await wait(delay); } if ( thisAction !== actionNumber || anotherRecordingIsPlaying() ) { return; } await audio.play(); } catch (error) { console.error( 'Bach movement playback failed:', error ); clearMovementSelection(); playbackMode = null; selectedEnd = null; } } ); }); completeButton.addEventListener( 'click', async () => { if ( playbackMode === 'complete' ) { if (audio.paused) { pauseOtherRecordings(); try { await audio.play(); } catch (error) { console.error( 'Bach playback failed:', error ); } } else { audio.pause(); } return; } actionNumber += 1; const thisAction = actionNumber; audio.pause(); pauseOtherRecordings(); clearMovementSelection(); playbackMode = 'complete'; selectedEnd = null; try { await seekTo(0); /* Adds a gentle pause before the opening of the complete recording. */ await wait(900); if ( thisAction !== actionNumber || anotherRecordingIsPlaying() ) { return; } await audio.play(); } catch (error) { console.error( 'Complete Bach playback failed:', error ); playbackMode = null; showCompletePlay(); } } ); /* This runs only when audio is genuinely playing. For a movement: add the rotating disc at the far left. For the complete recording: add the rotating disc before the complete button. */ audio.addEventListener( 'playing', () => { if ( playbackMode === 'movement' ) { clearMovementPlaying(); if (activeMovement) { activeMovement.classList.add( 'is-playing' ); } } if ( playbackMode === 'complete' ) { clearMovementPlaying(); showCompletePause(); } } ); /* When paused: the rotating disc disappears immediately. For a selected movement, the gold highlight remains so the visitor still knows which movement was selected. */ audio.addEventListener( 'pause', () => { clearMovementPlaying(); if ( playbackMode === 'complete' && !audio.ended ) { showCompletePlay(); } } ); audio.addEventListener( 'timeupdate', () => { if ( playbackMode === 'movement' && selectedEnd !== null && audio.currentTime >= selectedEnd - 0.15 ) { actionNumber += 1; audio.pause(); clearMovementSelection(); playbackMode = null; selectedEnd = null; } } ); audio.addEventListener( 'ended', () => { actionNumber += 1; clearMovementSelection(); playbackMode = null; selectedEnd = null; showCompletePlay(); } ); })();
Recent performance highlights include recitals and chamber appearances in Salzburg, Brussels, Cervignano, Bristol, Cheltenham and Bad Reichenhall. As a soloist, James has performed Sibelius’s Violin Concerto, Vaughan Williams’s The Lark Ascending and Mozart’s Violin Concerto No. 1. His recital repertoire includes sonatas by Debussy and Brahms, Lutosławski’s Subito and Elgar’s Salut d’Amour, alongside major works for solo violin by Bach, Ysaÿe and Paganini.
Forthcoming
December 2026 · Salzburg Recital with pianist Patrick Leung · SchlosskircheSpring 2027 · Cheltenham Recital of French Music · St Philip & St James Church2027 · Romania Concert appearances · Presented by TYM Festival & CompetitionJune 2027 · London Recital · Royal College of Music
Past Performances
28 July 2026 · Cervignano Concert · Teatro Pasolini3 July 2026 · Brussels Concert · City Hall of Woluwe-Saint-Lambert2 June 2026 · Salzburg Recital · Stiftung Mozarteum – Wiener Saal13 May 2026 · Salzburg Recital · Universität Mozarteum Salzburg – Kleines Studio14 November 2025 · Bad Reichenhall Concert · Konzertsaal des Alten Feuerhauses26 July 2025 · Cheltenham Recital · St. Philip & St. James Church8 July 2025 · Bristol Recital · Bristol Cathedral7 June 2025 · North Woodchester Concert · St. Mary's Church29 March 2025 · Tewkesbury Concert · Tewkesbury Abbey17 November 2024 · Cheltenham Concert · The Big Classical8 July 2024 · Cheltenham Recital · St. Gregory's Church
Gallery
Selected moments from performances, rehearsals and musical life.
Ⅱ
0 / 0
Teaching
Alongside his performing career, James offers a small number of private violin lessons in Cheltenham for motivated students with previous playing experience. His teaching emphasises secure technique, musical understanding and expressive communication.
{ "@context": "https://schema.org", "@type": "ProfilePage", "@id": "https://jamesliviolin.com/#profile", "url": "https://jamesliviolin.com/", "name": "James Li | UK-Based Violinist", "inLanguage": "en-GB", "primaryImageOfPage": { "@type": "ImageObject", "@id": "https://jamesliviolin.com/#primaryimage", "url": "https://media.jamesliviolin.com/image/james-li-violinist-uk-square.jpg", "contentUrl": "https://media.jamesliviolin.com/image/james-li-violinist-uk-square.jpg", "width": 1200, "height": 1200, "caption": "James Li, UK-based violinist" }, "mainEntity": { "@type": "Person", "@id": "https://jamesliviolin.com/#james-li", "name": "James Li", "alternateName": "Zi Jun Li", "url": "https://jamesliviolin.com/", "jobTitle": "Violinist", "description": "Hong Kong-born violinist based in the United Kingdom, active as a soloist, recitalist and chamber musician.", "image": { "@id": "https://jamesliviolin.com/#primaryimage" }, "sameAs": [ "https://www.youtube.com/@JamesLiViolin", "https://www.facebook.com/JamesLiFacebook/", "https://soundcloud.com/jamesliviolin" ] } }
Privacy Policy
Last updated: July 2026This website is operated by James Li.When you use the contact form, I may collect your name, email address, message, and any information you choose to include about performance enquiries, collaborations, or violin lessons.This information is used only to respond to your enquiry, communicate with you, and, where relevant, discuss lesson arrangements or professional engagements.I do not sell personal information. Information may be processed through the website platform, email provider, or other services used to operate this website and respond to enquiries.Personal information is kept only for as long as reasonably necessary for the purpose of responding to and managing enquiries, unless a longer period is required for legitimate professional or legal reasons.You may contact me to ask about the personal information held about you, or to request correction or deletion where appropriate.Information submitted through this website will only be used to respond to your enquiry.
This website may use essential cookies or similar technologies needed for the website and contact form to function properly.Embedded content, such as YouTube videos, may use cookies or similar technologies provided by third-party services. These services may collect information when you view or interact with embedded media.This website does not intentionally use advertising cookies or tracking cookies set directly by James Li.You can control or delete cookies through your browser settings.