, but this code // executes before the first paint, when

app

is not yet present. The // classes are added to so styling immediately reflects the current // toolbar state. The classes are removed after the toolbar completes // initialization. const classesToAdd = ['toolbar-loading', 'toolbar-anti-flicker']; if (toolbarState) { const { orientation, hasActiveTab, isFixed, activeTray, activeTabId, isOriented, userButtonMinWidth } = toolbarState; classesToAdd.push( orientation ? `toolbar-` + orientation + `` : 'toolbar-horizontal', ); if (hasActiveTab !== false) { classesToAdd.push('toolbar-tray-open'); } if (isFixed) { classesToAdd.push('toolbar-fixed'); } if (isOriented) { classesToAdd.push('toolbar-oriented'); } if (activeTray) { // These styles are added so the active tab/tray styles are present // immediately instead of "flickering" on as the toolbar initializes. In // instances where a tray is lazy loaded, these styles facilitate the // lazy loaded tray appearing gracefully and without reflow. const styleContent = ` .toolbar-loading #` + activeTabId + ` { background-image: linear-gradient(rgba(255, 255, 255, 0.25) 20%, transparent 200%); } .toolbar-loading #` + activeTabId + `-tray { display: block; box-shadow: -1px 0 5px 2px rgb(0 0 0 / 33%); border-right: 1px solid #aaa; background-color: #f5f5f5; z-index: 0; } .toolbar-loading.toolbar-vertical.toolbar-tray-open #` + activeTabId + `-tray { width: 15rem; height: 100vh; } .toolbar-loading.toolbar-horizontal :not(#` + activeTray + `) > .toolbar-lining {opacity: 0}`; const style = document.createElement('style'); style.textContent = styleContent; style.setAttribute('data-toolbar-anti-flicker-loading', true); document.querySelector('head').appendChild(style); if (userButtonMinWidth) { const userButtonStyle = document.createElement('style'); userButtonStyle.textContent = `#toolbar-item-user {min-width: ` + userButtonMinWidth +`px;}` document.querySelector('head').appendChild(userButtonStyle); } } } document.querySelector('html').classList.add(...classesToAdd); })(); Knollcrest Music Camp Music | app

app

Skip to main content

Knollcrest Music Camp

For over 50 years, app has welcomed students from West Michigan (and beyond) to engage in wonderful music-making and learning through Knollcrest Music Camp (KMC). This summer experience promotes the musical, social, and spiritual growth of young musicians by helping them find their place within the amazing field of music. Led by app faculty and other outstanding music educators, Knollcrest Music Camp inspires personalized artistic development through formative, practical opportunities within an enriching, inclusive community.

Visit for information about other summer camps offered at app.

High School Week

Dates:July 14-18, 2025, 8:30am—3:30pm
Cost:$300
Eligibility:Any student entering grades 9-12
Registration:Online registration opens on March 1

Students must have at least two years of musical experience and bring their own instruments. KMC does not supply instruments.

Middle School Week

Dates:July 21-22, 2025, 8:30am—2:30pm
Cost:$275
Eligibility:Any student entering grades 7-8
Registration:Online registration opens on March 1

Students must have at least one year of musical experience and bring their own instruments. KMC does not supply instruments.

General Information

The information below applies to both High School and Middle School weeks.

Contact KMC

Email:musiccamp@calvin.edu
Phone: 616-526-7145
Address: 1795 Knollcrest Circle SE, Grand Rapids, MI 49546

2023 KMC Photos & Videos