Hong Kong-born violinist James Li (Zi Jun Li) is based in Cheltenham and active in London, performing as a soloist, recitalist and chamber musician. He is currently undertaking 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 London, 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
17 November 2026 · London St George’s Church, Hanover Square London Firebird Orchestra2 January 2027 · Cheltenham Recital · New CourtSpring 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
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 current studio includes school-age pupils working towards Grade 5 and Grade 8, alongside adult students.James also offers a dedicated Young Violinist Programme for Year 1 and Year 2 pupils who already have some violin experience and are showing strong musical potential.
{ "@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.